From 23e3b45f2e6eb3dbb57a54d9d7dadb5c7da722b0 Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Mon, 6 Jan 2025 15:01:17 +0530 Subject: [PATCH 1/4] chore: add downloaded contracts and diffs --- .gitignore | 2 - diff.ts | 122 + diff_config.ts | 293 + .../AAVE_PROTOCOL_DATA_PROVIDER_DIFF.md | 166 + diffs/ARBITRUM_LINEA/ACL_MANAGER_DIFF.md | 244 + diffs/ARBITRUM_LINEA/BORROW_LOGIC_DIFF.md | 337 + diffs/ARBITRUM_LINEA/BRIDGE_LOGIC_DIFF.md | 328 + diffs/ARBITRUM_LINEA/COLLECTOR_IMPL_DIFF.md | 621 ++ .../ARBITRUM_LINEA/CONFIGURATOR_LOGIC_DIFF.md | 1003 ++ .../DEFAULT_A_TOKEN_IMPL_DIFF.md | 974 ++ ...DEFAULT_INCENTIVES_CONTROLLER_IMPL_DIFF.md | 257 + .../DEFAULT_VARIABLE_DEBT_TOKEN_IMPL_DIFF.md | 978 ++ diffs/ARBITRUM_LINEA/EMISSION_MANAGER_DIFF.md | 228 + diffs/ARBITRUM_LINEA/EMODE_LOGIC_DIFF.md | 319 + diffs/ARBITRUM_LINEA/FLASHLOAN_LOGIC_DIFF.md | 364 + diffs/ARBITRUM_LINEA/L2_ENCODER_DIFF.md | 1197 +++ diffs/ARBITRUM_LINEA/L2_POOL_IMPL_DIFF.md | 465 + .../ARBITRUM_LINEA/LIQUIDATION_LOGIC_DIFF.md | 337 + diffs/ARBITRUM_LINEA/ORACLE_DIFF.md | 253 + .../POOL_ADDRESSES_PROVIDER_DIFF.md | 415 + .../POOL_ADDRESSES_PROVIDER_REGISTRY_DIFF.md | 149 + .../POOL_CONFIGURATOR_IMPL_DIFF.md | 258 + diffs/ARBITRUM_LINEA/POOL_LOGIC_DIFF.md | 328 + diffs/ARBITRUM_LINEA/SUPPLY_LOGIC_DIFF.md | 328 + .../UI_INCENTIVE_DATA_PROVIDER_DIFF.md | 195 + .../UI_POOL_DATA_PROVIDER_DIFF.md | 231 + .../WALLET_BALANCE_PROVIDER_DIFF.md | 1827 ++++ diffs/ARBITRUM_LINEA/WETH_GATEWAY_DIFF.md | 159 + .../ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER.sol | 3226 ++++++ .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../helpers/AaveProtocolDataProvider.sol | 295 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 833 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPoolDataProvider.sol | 250 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../configuration/ReserveConfiguration.sol | 583 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + downloads/ARBITRUM/ACL_MANAGER.sol | 1066 ++ .../openzeppelin/contracts/AccessControl.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/ERC165.sol | 28 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC165.sol | 24 + .../openzeppelin/contracts/Strings.sol | 66 + .../contracts/interfaces/IACLManager.sol | 175 + .../interfaces/IPoolAddressesProvider.sol | 227 + .../protocol/configuration/ACLManager.sol | 134 + .../protocol/libraries/helpers/Errors.sol | 100 + downloads/ARBITRUM/BORROW_LOGIC.sol | 5815 +++++++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 833 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 583 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/logic/BorrowLogic.sol | 234 + .../protocol/libraries/logic/EModeLogic.sol | 72 + .../protocol/libraries/logic/GenericLogic.sol | 256 + .../libraries/logic/IsolationModeLogic.sol | 64 + .../protocol/libraries/logic/ReserveLogic.sol | 313 + .../libraries/logic/ValidationLogic.sol | 642 ++ .../protocol/libraries/math/MathUtils.sol | 99 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/base/IncentivizedERC20.sol | 234 + downloads/ARBITRUM/BRIDGE_LOGIC.sol | 5671 +++++++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 833 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 583 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/logic/BridgeLogic.sol | 150 + .../protocol/libraries/logic/EModeLogic.sol | 72 + .../protocol/libraries/logic/GenericLogic.sol | 256 + .../protocol/libraries/logic/ReserveLogic.sol | 313 + .../libraries/logic/ValidationLogic.sol | 642 ++ .../protocol/libraries/math/MathUtils.sol | 99 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/base/IncentivizedERC20.sol | 234 + downloads/ARBITRUM/COLLECTOR_IMPL.sol | 1161 +++ .../src/contracts/oz-common/Address.sol | 249 + .../src/contracts/oz-common/SafeERC20.sol | 117 + .../contracts/oz-common/interfaces/IERC20.sol | 83 + .../interfaces/draft-IERC20Permit.sol | 61 + .../Collector/src/contracts/Collector.sol | 346 + .../Collector/src/interfaces/ICollector.sol | 174 + .../Collector/src/libs/ReentrancyGuard.sol | 70 + .../src/libs/VersionedInitializable.sol | 42 + downloads/ARBITRUM/CONFIGURATOR_LOGIC.sol | 3165 ++++++ .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../BaseUpgradeabilityProxy.sol | 66 + .../InitializableUpgradeabilityProxy.sol | 29 + .../openzeppelin/upgradeability/Proxy.sol | 81 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/core/contracts/interfaces/IPool.sol | 835 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../IReserveInterestRateStrategy.sol | 30 + .../BaseImmutableAdminUpgradeabilityProxy.sol | 85 + ...zableImmutableAdminUpgradeabilityProxy.sol | 29 + .../configuration/ReserveConfiguration.sol | 640 ++ .../protocol/libraries/helpers/Errors.sol | 108 + .../libraries/logic/ConfiguratorLogic.sol | 281 + .../types/ConfiguratorInputTypes.sol | 42 + .../protocol/libraries/types/DataTypes.sol | 313 + downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL.sol | 3210 ++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../contracts/interfaces/IACLManager.sol | 175 + .../contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../contracts/interfaces/IPool.sol | 737 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IScaledBalanceToken.sol | 72 + .../VersionedInitializable.sol | 77 + .../protocol/libraries/helpers/Errors.sol | 100 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 264 + .../protocol/tokenization/AToken.sol | 256 + .../protocol/tokenization/base/EIP712Base.sol | 70 + .../tokenization/base/IncentivizedERC20.sol | 235 + .../base/MintableIncentivizedERC20.sol | 66 + .../base/ScaledBalanceTokenBase.sol | 156 + .../DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol | 1852 ++++ .../openzeppelin/contracts/IERC20.sol | 80 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../interfaces/IScaledBalanceToken.sol | 71 + .../VersionedInitializable.sol | 77 + .../misc/interfaces/IEACAggregatorProxy.sol | 19 + .../contracts/rewards/RewardsController.sol | 369 + .../contracts/rewards/RewardsDistributor.sol | 548 ++ .../rewards/interfaces/IRewardsController.sol | 206 + .../interfaces/IRewardsDistributor.sol | 186 + .../interfaces/ITransferStrategyBase.sol | 46 + .../rewards/libraries/RewardsDataTypes.sol | 54 + .../DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol | 3058 ++++++ .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../contracts/interfaces/IACLManager.sol | 175 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/ICreditDelegationToken.sol | 60 + .../interfaces/IInitializableDebtToken.sol | 52 + .../contracts/interfaces/IPool.sol | 737 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../VersionedInitializable.sol | 77 + .../protocol/libraries/helpers/Errors.sol | 100 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 264 + .../tokenization/VariableDebtToken.sol | 155 + .../tokenization/base/DebtTokenBase.sol | 102 + .../protocol/tokenization/base/EIP712Base.sol | 70 + .../tokenization/base/IncentivizedERC20.sol | 235 + .../base/MintableIncentivizedERC20.sol | 66 + .../base/ScaledBalanceTokenBase.sol | 156 + downloads/ARBITRUM/EMISSION_MANAGER.sol | 791 ++ .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/Ownable.sol | 69 + .../misc/interfaces/IEACAggregatorProxy.sol | 19 + .../contracts/rewards/EmissionManager.sol | 118 + .../rewards/interfaces/IEmissionManager.sol | 129 + .../rewards/interfaces/IRewardsController.sol | 205 + .../interfaces/IRewardsDistributor.sol | 186 + .../interfaces/ITransferStrategyBase.sol | 46 + .../rewards/libraries/RewardsDataTypes.sol | 43 + downloads/ARBITRUM/EMODE_LOGIC.sol | 5534 +++++++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 833 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 583 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/logic/EModeLogic.sol | 72 + .../protocol/libraries/logic/GenericLogic.sol | 256 + .../protocol/libraries/logic/ReserveLogic.sol | 313 + .../libraries/logic/ValidationLogic.sol | 642 ++ .../protocol/libraries/math/MathUtils.sol | 99 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/base/IncentivizedERC20.sol | 234 + downloads/ARBITRUM/FLASHLOAN_LOGIC.sol | 6141 ++++++++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 833 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../interfaces/IFlashLoanReceiver.sol | 36 + .../interfaces/IFlashLoanSimpleReceiver.sol | 36 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 583 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/logic/BorrowLogic.sol | 234 + .../protocol/libraries/logic/EModeLogic.sol | 72 + .../libraries/logic/FlashLoanLogic.sol | 277 + .../protocol/libraries/logic/GenericLogic.sol | 256 + .../libraries/logic/IsolationModeLogic.sol | 64 + .../protocol/libraries/logic/ReserveLogic.sol | 313 + .../libraries/logic/ValidationLogic.sol | 642 ++ .../protocol/libraries/math/MathUtils.sol | 99 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/base/IncentivizedERC20.sol | 234 + downloads/ARBITRUM/L2_ENCODER.sol | 1811 ++++ .../chainlink/AggregatorInterface.sol | 19 + .../gnosis/contracts/GPv2SafeERC20.sol | 124 + .../openzeppelin/contracts/AccessControl.sol | 220 + .../openzeppelin/contracts/Address.sol | 61 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/ERC165.sol | 28 + .../openzeppelin/contracts/ERC20.sol | 344 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC165.sol | 24 + .../openzeppelin/contracts/IERC20.sol | 80 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/Ownable.sol | 69 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../openzeppelin/contracts/SafeMath.sol | 59 + .../openzeppelin/contracts/Strings.sol | 66 + .../BaseAdminUpgradeabilityProxy.sol | 126 + .../BaseUpgradeabilityProxy.sol | 66 + .../InitializableAdminUpgradeabilityProxy.sol | 42 + .../InitializableUpgradeabilityProxy.sol | 29 + .../openzeppelin/upgradeability/Proxy.sol | 73 + .../upgradeability/UpgradeabilityProxy.sol | 28 + .../deployments/ReservesSetupHelper.sol | 57 + .../flashloan/base/FlashLoanReceiverBase.sol | 21 + .../interfaces/IFlashLoanReceiver.sol | 36 + .../interfaces/IFlashLoanSimpleReceiver.sol | 36 + .../contracts/interfaces/IACLManager.sol | 175 + .../core-v3/contracts/interfaces/IAToken.sol | 150 + .../interfaces/IAaveIncentivesController.sol | 176 + .../contracts/interfaces/IAaveOracle.sol | 71 + .../interfaces/ICreditDelegationToken.sol | 60 + .../contracts/interfaces/IDelegationToken.sol | 15 + .../contracts/interfaces/IERC20WithPermit.sol | 33 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../core-v3/contracts/interfaces/IL2Pool.sol | 141 + .../core-v3/contracts/interfaces/IPool.sol | 747 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../IPoolAddressesProviderRegistry.sol | 61 + .../interfaces/IPoolConfigurator.sol | 468 + .../interfaces/IPoolDataProvider.sol | 52 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 39 + .../interfaces/IScaledBalanceToken.sol | 71 + .../contracts/interfaces/IStableDebtToken.sol | 153 + .../interfaces/IVariableDebtToken.sol | 50 + .../core-v3/contracts/misc/AaveOracle.sol | 152 + .../misc/AaveProtocolDataProvider.sol | 377 + .../core-v3/contracts/misc/L2Encoder.sol | 355 + .../mocks/flashloan/MockFlashLoanReceiver.sol | 78 + .../helpers/MockIncentivesController.sol | 87 + .../contracts/mocks/helpers/MockL2Pool.sol | 13 + .../contracts/mocks/helpers/MockPool.sol | 53 + .../helpers/MockReserveConfiguration.sol | 174 + .../mocks/tokens/MintableDelegationERC20.sol | 35 + .../contracts/mocks/tokens/MintableERC20.sol | 92 + .../mocks/upgradeability/MockAToken.sol | 14 + .../MockInitializableImplementation.sol | 115 + .../upgradeability/MockStableDebtToken.sol | 13 + .../upgradeability/MockVariableDebtToken.sol | 13 + .../protocol/configuration/ACLManager.sol | 134 + .../configuration/PoolAddressesProvider.sol | 210 + .../PoolAddressesProviderRegistry.sol | 105 + .../BaseImmutableAdminUpgradeabilityProxy.sol | 86 + ...zableImmutableAdminUpgradeabilityProxy.sol | 29 + .../VersionedInitializable.sol | 77 + .../configuration/ReserveConfiguration.sol | 633 ++ .../configuration/UserConfiguration.sol | 251 + .../protocol/libraries/helpers/Errors.sol | 100 + .../protocol/libraries/helpers/Helpers.sol | 29 + .../protocol/libraries/logic/BorrowLogic.sol | 349 + .../protocol/libraries/logic/BridgeLogic.sol | 141 + .../libraries/logic/CalldataLogic.sol | 322 + .../libraries/logic/ConfiguratorLogic.sol | 268 + .../protocol/libraries/logic/EModeLogic.sol | 121 + .../libraries/logic/FlashLoanLogic.sol | 262 + .../protocol/libraries/logic/GenericLogic.sol | 280 + .../libraries/logic/IsolationModeLogic.sol | 64 + .../libraries/logic/LiquidationLogic.sol | 538 + .../protocol/libraries/logic/PoolLogic.sol | 192 + .../protocol/libraries/logic/ReserveLogic.sol | 362 + .../protocol/libraries/logic/SupplyLogic.sol | 290 + .../libraries/logic/ValidationLogic.sol | 726 ++ .../protocol/libraries/math/MathUtils.sol | 101 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../types/ConfiguratorInputTypes.sol | 41 + .../protocol/libraries/types/DataTypes.sol | 268 + .../DefaultReserveInterestRateStrategy.sol | 299 + .../contracts/protocol/pool/L2Pool.sol | 135 + .../core-v3/contracts/protocol/pool/Pool.sol | 773 ++ .../protocol/pool/PoolConfigurator.sol | 528 + .../contracts/protocol/pool/PoolStorage.sol | 51 + .../protocol/tokenization/AToken.sol | 272 + .../tokenization/DelegationAwareAToken.sol | 37 + .../protocol/tokenization/StableDebtToken.sol | 430 + .../tokenization/VariableDebtToken.sol | 157 + .../tokenization/base/DebtTokenBase.sol | 112 + .../protocol/tokenization/base/EIP712Base.sol | 70 + .../tokenization/base/IncentivizedERC20.sol | 253 + .../base/MintableIncentivizedERC20.sol | 66 + .../base/ScaledBalanceTokenBase.sol | 128 + .../adapters/paraswap/BaseParaSwapAdapter.sol | 139 + .../paraswap/BaseParaSwapBuyAdapter.sol | 109 + .../paraswap/BaseParaSwapSellAdapter.sol | 107 + .../paraswap/ParaSwapLiquiditySwapAdapter.sol | 211 + .../paraswap/ParaSwapRepayAdapter.sol | 229 + .../paraswap/interfaces/IParaSwapAugustus.sol | 6 + .../interfaces/IParaSwapAugustusRegistry.sol | 6 + .../openzeppelin/ReentrancyGuard.sol | 62 + .../contracts/libraries/DataTypesHelper.sol | 30 + .../misc/UiIncentiveDataProviderV3.sol | 411 + .../contracts/misc/UiPoolDataProviderV3.sol | 262 + .../contracts/misc/WETHGateway.sol | 218 + .../contracts/misc/WalletBalanceProvider.sol | 110 + .../misc/interfaces/IEACAggregatorProxy.sol | 19 + .../misc/interfaces/IERC20DetailedBytes.sol | 12 + .../interfaces/IUiIncentiveDataProviderV3.sol | 74 + .../misc/interfaces/IUiPoolDataProviderV3.sol | 114 + .../contracts/misc/interfaces/IWETH.sol | 16 + .../misc/interfaces/IWETHGateway.sol | 40 + .../contracts/rewards/RewardsController.sol | 367 + .../contracts/rewards/RewardsDistributor.sol | 516 + .../IPullRewardsTransferStrategy.sol | 15 + .../rewards/interfaces/IRewardsController.sol | 205 + .../interfaces/IRewardsDistributor.sol | 164 + .../rewards/interfaces/IStakedToken.sol | 14 + .../IStakedTokenTransferStrategy.sol | 31 + .../interfaces/ITransferStrategyBase.sol | 46 + .../rewards/libraries/RewardsDataTypes.sol | 43 + .../PullRewardsTransferStrategy.sol | 49 + .../StakedTokenTransferStrategy.sol | 73 + .../TransferStrategyBase.sol | 66 + .../contracts/treasury/Collector.sol | 79 + .../treasury/CollectorController.sol | 56 + .../treasury/interfaces/ICollector.sol | 60 + .../openzeppelin/contracts/IERC20Detailed.sol | 3 + .../InitializableAdminUpgradeabilityProxy.sol | 3 + .../deployments/ReservesSetupHelper.sol | 3 + .../core-v3/contracts/misc/AaveOracle.sol | 3 + .../misc/AaveProtocolDataProvider.sol | 3 + .../core-v3/contracts/misc/L2Encoder.sol | 3 + .../mocks/flashloan/MockFlashLoanReceiver.sol | 3 + .../helpers/MockIncentivesController.sol | 3 + .../contracts/mocks/helpers/MockL2Pool.sol | 3 + .../contracts/mocks/helpers/MockPool.sol | 3 + .../helpers/MockReserveConfiguration.sol | 3 + .../mocks/tokens/MintableDelegationERC20.sol | 3 + .../contracts/mocks/tokens/MintableERC20.sol | 3 + .../mocks/upgradeability/MockAToken.sol | 3 + .../MockInitializableImplementation.sol | 3 + .../upgradeability/MockStableDebtToken.sol | 3 + .../upgradeability/MockVariableDebtToken.sol | 3 + .../protocol/configuration/ACLManager.sol | 3 + .../configuration/PoolAddressesProvider.sol | 3 + .../PoolAddressesProviderRegistry.sol | 3 + ...zableImmutableAdminUpgradeabilityProxy.sol | 3 + .../protocol/libraries/logic/BorrowLogic.sol | 3 + .../protocol/libraries/logic/BridgeLogic.sol | 3 + .../libraries/logic/CalldataLogic.sol | 3 + .../protocol/libraries/logic/EModeLogic.sol | 3 + .../libraries/logic/FlashLoanLogic.sol | 3 + .../protocol/libraries/logic/GenericLogic.sol | 3 + .../protocol/libraries/logic/ReserveLogic.sol | 3 + .../protocol/libraries/logic/SupplyLogic.sol | 3 + .../libraries/logic/ValidationLogic.sol | 3 + .../DefaultReserveInterestRateStrategy.sol | 3 + .../contracts/protocol/pool/L2Pool.sol | 3 + .../core-v3/contracts/protocol/pool/Pool.sol | 3 + .../protocol/pool/PoolConfigurator.sol | 3 + .../protocol/tokenization/AToken.sol | 3 + .../tokenization/DelegationAwareAToken.sol | 3 + .../protocol/tokenization/StableDebtToken.sol | 3 + .../tokenization/VariableDebtToken.sol | 3 + .../paraswap/ParaSwapLiquiditySwapAdapter.sol | 3 + .../paraswap/ParaSwapRepayAdapter.sol | 3 + .../misc/UiIncentiveDataProviderV3.sol | 3 + .../contracts/misc/UiPoolDataProviderV3.sol | 3 + .../contracts/misc/WETHGateway.sol | 3 + .../contracts/misc/WalletBalanceProvider.sol | 3 + .../contracts/rewards/RewardsController.sol | 3 + .../PullRewardsTransferStrategy.sol | 3 + .../StakedTokenTransferStrategy.sol | 3 + .../contracts/treasury/Collector.sol | 3 + .../treasury/CollectorController.sol | 3 + downloads/ARBITRUM/L2_POOL_IMPL.sol | 8682 +++++++++++++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../contracts/instances/L2PoolInstance.sol | 10 + .../src/contracts/instances/PoolInstance.sol | 27 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../contracts/interfaces/IERC20WithPermit.sol | 33 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IL2Pool.sol | 116 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../VersionedInitializable.sol | 77 + .../interfaces/IFlashLoanReceiver.sol | 36 + .../interfaces/IFlashLoanSimpleReceiver.sol | 36 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 584 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/logic/BorrowLogic.sol | 234 + .../protocol/libraries/logic/BridgeLogic.sol | 150 + .../libraries/logic/CalldataLogic.sol | 233 + .../protocol/libraries/logic/EModeLogic.sol | 72 + .../libraries/logic/FlashLoanLogic.sol | 277 + .../protocol/libraries/logic/GenericLogic.sol | 256 + .../libraries/logic/IsolationModeLogic.sol | 64 + .../libraries/logic/LiquidationLogic.sol | 460 + .../protocol/libraries/logic/PoolLogic.sol | 201 + .../protocol/libraries/logic/ReserveLogic.sol | 313 + .../protocol/libraries/logic/SupplyLogic.sol | 300 + .../libraries/logic/ValidationLogic.sol | 642 ++ .../protocol/libraries/math/MathUtils.sol | 99 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../src/contracts/protocol/pool/L2Pool.sol | 102 + .../src/contracts/protocol/pool/Pool.sol | 871 ++ .../contracts/protocol/pool/PoolStorage.sol | 51 + .../tokenization/base/IncentivizedERC20.sol | 234 + downloads/ARBITRUM/LIQUIDATION_LOGIC.sol | 6036 ++++++++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 833 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 583 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/logic/EModeLogic.sol | 72 + .../protocol/libraries/logic/GenericLogic.sol | 256 + .../libraries/logic/IsolationModeLogic.sol | 64 + .../libraries/logic/LiquidationLogic.sol | 460 + .../protocol/libraries/logic/ReserveLogic.sol | 313 + .../libraries/logic/ValidationLogic.sol | 642 ++ .../protocol/libraries/math/MathUtils.sol | 99 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/base/IncentivizedERC20.sol | 234 + downloads/ARBITRUM/ORACLE.sol | 759 ++ .../chainlink/AggregatorInterface.sol | 19 + .../contracts/interfaces/IACLManager.sol | 175 + .../contracts/interfaces/IAaveOracle.sol | 71 + .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../core-v3/contracts/misc/AaveOracle.sol | 152 + .../protocol/libraries/helpers/Errors.sol | 100 + .../ARBITRUM/POOL_ADDRESSES_PROVIDER.sol | 855 ++ .../openzeppelin/contracts/Address.sol | 61 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/Ownable.sol | 69 + .../BaseUpgradeabilityProxy.sol | 66 + .../InitializableUpgradeabilityProxy.sol | 29 + .../openzeppelin/upgradeability/Proxy.sol | 73 + .../interfaces/IPoolAddressesProvider.sol | 227 + .../configuration/PoolAddressesProvider.sol | 210 + .../BaseImmutableAdminUpgradeabilityProxy.sol | 86 + ...zableImmutableAdminUpgradeabilityProxy.sol | 29 + .../POOL_ADDRESSES_PROVIDER_REGISTRY.sol | 349 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/Ownable.sol | 69 + .../IPoolAddressesProviderRegistry.sol | 61 + .../PoolAddressesProviderRegistry.sol | 105 + .../protocol/libraries/helpers/Errors.sol | 100 + downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL.sol | 4995 ++++++++++ .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../BaseUpgradeabilityProxy.sol | 66 + .../InitializableUpgradeabilityProxy.sol | 29 + .../openzeppelin/upgradeability/Proxy.sol | 81 + .../instances/PoolConfiguratorInstance.sol | 18 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../interfaces/IAaveIncentivesController.sol | 19 + .../IDefaultInterestRateStrategyV2.sol | 161 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPoolConfigurator.sol | 551 ++ .../interfaces/IPoolDataProvider.sol | 250 + .../IReserveInterestRateStrategy.sol | 29 + .../BaseImmutableAdminUpgradeabilityProxy.sol | 85 + ...zableImmutableAdminUpgradeabilityProxy.sol | 29 + .../VersionedInitializable.sol | 77 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 584 ++ .../protocol/libraries/helpers/Errors.sol | 103 + .../libraries/logic/ConfiguratorLogic.sol | 223 + .../libraries/math/PercentageMath.sol | 61 + .../types/ConfiguratorInputTypes.sol | 39 + .../protocol/libraries/types/DataTypes.sol | 324 + .../protocol/pool/PoolConfigurator.sol | 630 ++ downloads/ARBITRUM/POOL_LOGIC.sol | 5723 +++++++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 833 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 583 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/logic/EModeLogic.sol | 72 + .../protocol/libraries/logic/GenericLogic.sol | 256 + .../protocol/libraries/logic/PoolLogic.sol | 201 + .../protocol/libraries/logic/ReserveLogic.sol | 313 + .../libraries/logic/ValidationLogic.sol | 642 ++ .../protocol/libraries/math/MathUtils.sol | 99 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/base/IncentivizedERC20.sol | 234 + downloads/ARBITRUM/SUPPLY_LOGIC.sol | 5822 +++++++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 833 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 583 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/logic/EModeLogic.sol | 72 + .../protocol/libraries/logic/GenericLogic.sol | 256 + .../protocol/libraries/logic/ReserveLogic.sol | 313 + .../protocol/libraries/logic/SupplyLogic.sol | 300 + .../libraries/logic/ValidationLogic.sol | 642 ++ .../protocol/libraries/math/MathUtils.sol | 99 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/base/IncentivizedERC20.sol | 234 + .../ARBITRUM/UI_INCENTIVE_DATA_PROVIDER.sol | 4044 ++++++++ .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../helpers/UiIncentiveDataProviderV3.sol | 294 + .../interfaces/IEACAggregatorProxy.sol | 19 + .../interfaces/IUiIncentiveDataProviderV3.sol | 73 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../interfaces/IAaveIncentivesController.sol | 19 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../configuration/ReserveConfiguration.sol | 584 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/base/IncentivizedERC20.sol | 234 + .../rewards/interfaces/IRewardsController.sol | 203 + .../interfaces/IRewardsDistributor.sol | 177 + .../interfaces/ITransferStrategyBase.sol | 38 + .../rewards/libraries/RewardsDataTypes.sol | 54 + downloads/ARBITRUM/UI_POOL_DATA_PROVIDER.sol | 4068 ++++++++ .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../helpers/AaveProtocolDataProvider.sol | 295 + .../helpers/UiPoolDataProviderV3.sol | 265 + .../interfaces/IEACAggregatorProxy.sol | 19 + .../interfaces/IERC20DetailedBytes.sol | 12 + .../interfaces/IUiPoolDataProviderV3.sol | 95 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../src/contracts/interfaces/IAaveOracle.sol | 71 + .../IDefaultInterestRateStrategyV2.sol | 161 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPoolDataProvider.sol | 250 + .../interfaces/IPriceOracleGetter.sol | 30 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../configuration/ReserveConfiguration.sol | 584 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../ARBITRUM/WALLET_BALANCE_PROVIDER.sol | 2255 +++++ .../gnosis/contracts/GPv2SafeERC20.sol | 124 + .../openzeppelin/contracts/Address.sol | 61 + .../openzeppelin/contracts/IERC20.sol | 80 + .../core-v3/contracts/interfaces/IPool.sol | 747 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../configuration/ReserveConfiguration.sol | 633 ++ .../protocol/libraries/helpers/Errors.sol | 100 + .../protocol/libraries/types/DataTypes.sol | 268 + .../contracts/misc/WalletBalanceProvider.sol | 110 + downloads/ARBITRUM/WETH_GATEWAY.sol | 3076 ++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/Ownable.sol | 69 + .../helpers/WrappedTokenGatewayV3.sol | 197 + .../contracts/helpers/interfaces/IWETH.sol | 12 + .../interfaces/IWrappedTokenGatewayV3.sol | 22 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IScaledBalanceToken.sol | 72 + .../configuration/ReserveConfiguration.sol | 584 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/types/DataTypes.sol | 324 + .../LINEA/AAVE_PROTOCOL_DATA_PROVIDER.sol | 3228 ++++++ .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../helpers/AaveProtocolDataProvider.sol | 295 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPoolDataProvider.sol | 250 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../configuration/ReserveConfiguration.sol | 584 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + downloads/LINEA/ACL_MANAGER.sol | 1069 ++ .../openzeppelin/contracts/AccessControl.sol | 216 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/ERC165.sol | 28 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC165.sol | 24 + .../openzeppelin/contracts/Strings.sol | 66 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../interfaces/IPoolAddressesProvider.sol | 227 + .../protocol/configuration/ACLManager.sol | 133 + .../protocol/libraries/helpers/Errors.sol | 103 + downloads/LINEA/BORROW_LOGIC.sol | 5817 +++++++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 584 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/logic/BorrowLogic.sol | 234 + .../protocol/libraries/logic/EModeLogic.sol | 72 + .../protocol/libraries/logic/GenericLogic.sol | 256 + .../libraries/logic/IsolationModeLogic.sol | 64 + .../protocol/libraries/logic/ReserveLogic.sol | 313 + .../libraries/logic/ValidationLogic.sol | 642 ++ .../protocol/libraries/math/MathUtils.sol | 99 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/base/IncentivizedERC20.sol | 234 + downloads/LINEA/BRIDGE_LOGIC.sol | 5673 +++++++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 584 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/logic/BridgeLogic.sol | 150 + .../protocol/libraries/logic/EModeLogic.sol | 72 + .../protocol/libraries/logic/GenericLogic.sol | 256 + .../protocol/libraries/logic/ReserveLogic.sol | 313 + .../libraries/logic/ValidationLogic.sol | 642 ++ .../protocol/libraries/math/MathUtils.sol | 99 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/base/IncentivizedERC20.sol | 234 + downloads/LINEA/COLLECTOR_IMPL.sol | 1035 ++ .../openzeppelin/ReentrancyGuard.sol | 70 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/SafeERC20.sol | 87 + .../VersionedInitializable.sol | 77 + .../src/contracts/treasury/Collector.sol | 341 + .../src/contracts/treasury/ICollector.sol | 174 + downloads/LINEA/CONFIGURATOR_LOGIC.sol | 3052 ++++++ .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../BaseUpgradeabilityProxy.sol | 66 + .../InitializableUpgradeabilityProxy.sol | 29 + .../openzeppelin/upgradeability/Proxy.sol | 81 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../IReserveInterestRateStrategy.sol | 29 + .../BaseImmutableAdminUpgradeabilityProxy.sol | 85 + ...zableImmutableAdminUpgradeabilityProxy.sol | 29 + .../configuration/ReserveConfiguration.sol | 584 ++ .../protocol/libraries/helpers/Errors.sol | 103 + .../libraries/logic/ConfiguratorLogic.sol | 223 + .../types/ConfiguratorInputTypes.sol | 39 + .../protocol/libraries/types/DataTypes.sol | 324 + downloads/LINEA/DEFAULT_A_TOKEN_IMPL.sol | 3383 +++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../contracts/instances/ATokenInstance.sol | 49 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IScaledBalanceToken.sol | 72 + .../VersionedInitializable.sol | 77 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../protocol/tokenization/AToken.sol | 227 + .../protocol/tokenization/base/EIP712Base.sol | 70 + .../tokenization/base/IncentivizedERC20.sol | 234 + .../base/MintableIncentivizedERC20.sol | 66 + .../base/ScaledBalanceTokenBase.sol | 156 + .../DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol | 1853 ++++ .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../interfaces/IEACAggregatorProxy.sol | 19 + .../interfaces/IScaledBalanceToken.sol | 72 + .../VersionedInitializable.sol | 77 + .../contracts/rewards/RewardsController.sol | 355 + .../contracts/rewards/RewardsDistributor.sol | 537 + .../rewards/interfaces/IRewardsController.sol | 203 + .../interfaces/IRewardsDistributor.sol | 177 + .../interfaces/ITransferStrategyBase.sol | 38 + .../rewards/libraries/RewardsDataTypes.sol | 54 + .../DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol | 3230 ++++++ .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../instances/VariableDebtTokenInstance.sol | 46 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/ICreditDelegationToken.sol | 60 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../VersionedInitializable.sol | 77 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/VariableDebtToken.sol | 128 + .../tokenization/base/DebtTokenBase.sol | 102 + .../protocol/tokenization/base/EIP712Base.sol | 70 + .../tokenization/base/IncentivizedERC20.sol | 234 + .../base/MintableIncentivizedERC20.sol | 66 + .../base/ScaledBalanceTokenBase.sol | 156 + downloads/LINEA/EMISSION_MANAGER.sol | 789 ++ .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/Ownable.sol | 69 + .../interfaces/IEACAggregatorProxy.sol | 19 + .../src/contracts/rewards/EmissionManager.sol | 109 + .../rewards/interfaces/IEmissionManager.sol | 118 + .../rewards/interfaces/IRewardsController.sol | 203 + .../interfaces/IRewardsDistributor.sol | 177 + .../interfaces/ITransferStrategyBase.sol | 38 + .../rewards/libraries/RewardsDataTypes.sol | 54 + downloads/LINEA/EMODE_LOGIC.sol | 5536 +++++++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 584 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/logic/EModeLogic.sol | 72 + .../protocol/libraries/logic/GenericLogic.sol | 256 + .../protocol/libraries/logic/ReserveLogic.sol | 313 + .../libraries/logic/ValidationLogic.sol | 642 ++ .../protocol/libraries/math/MathUtils.sol | 99 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/base/IncentivizedERC20.sol | 234 + downloads/LINEA/FLASHLOAN_LOGIC.sol | 6143 ++++++++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../interfaces/IFlashLoanReceiver.sol | 36 + .../interfaces/IFlashLoanSimpleReceiver.sol | 36 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 584 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/logic/BorrowLogic.sol | 234 + .../protocol/libraries/logic/EModeLogic.sol | 72 + .../libraries/logic/FlashLoanLogic.sol | 277 + .../protocol/libraries/logic/GenericLogic.sol | 256 + .../libraries/logic/IsolationModeLogic.sol | 64 + .../protocol/libraries/logic/ReserveLogic.sol | 313 + .../libraries/logic/ValidationLogic.sol | 642 ++ .../protocol/libraries/math/MathUtils.sol | 99 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/base/IncentivizedERC20.sol | 234 + downloads/LINEA/L2_ENCODER.sol | 1932 ++++ .../openzeppelin/contracts/SafeCast.sol | 255 + .../src/contracts/helpers/L2Encoder.sol | 296 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../protocol/libraries/types/DataTypes.sol | 324 + downloads/LINEA/L2_POOL_IMPL.sol | 8682 +++++++++++++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../contracts/instances/L2PoolInstance.sol | 10 + .../src/contracts/instances/PoolInstance.sol | 27 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../contracts/interfaces/IERC20WithPermit.sol | 33 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IL2Pool.sol | 116 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../VersionedInitializable.sol | 77 + .../interfaces/IFlashLoanReceiver.sol | 36 + .../interfaces/IFlashLoanSimpleReceiver.sol | 36 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 584 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/logic/BorrowLogic.sol | 234 + .../protocol/libraries/logic/BridgeLogic.sol | 150 + .../libraries/logic/CalldataLogic.sol | 233 + .../protocol/libraries/logic/EModeLogic.sol | 72 + .../libraries/logic/FlashLoanLogic.sol | 277 + .../protocol/libraries/logic/GenericLogic.sol | 256 + .../libraries/logic/IsolationModeLogic.sol | 64 + .../libraries/logic/LiquidationLogic.sol | 460 + .../protocol/libraries/logic/PoolLogic.sol | 201 + .../protocol/libraries/logic/ReserveLogic.sol | 313 + .../protocol/libraries/logic/SupplyLogic.sol | 300 + .../libraries/logic/ValidationLogic.sol | 642 ++ .../protocol/libraries/math/MathUtils.sol | 99 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../src/contracts/protocol/pool/L2Pool.sol | 102 + .../src/contracts/protocol/pool/Pool.sol | 871 ++ .../contracts/protocol/pool/PoolStorage.sol | 51 + .../tokenization/base/IncentivizedERC20.sol | 234 + downloads/LINEA/LIQUIDATION_LOGIC.sol | 6038 ++++++++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 584 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/logic/EModeLogic.sol | 72 + .../protocol/libraries/logic/GenericLogic.sol | 256 + .../libraries/logic/IsolationModeLogic.sol | 64 + .../libraries/logic/LiquidationLogic.sol | 460 + .../protocol/libraries/logic/ReserveLogic.sol | 313 + .../libraries/logic/ValidationLogic.sol | 642 ++ .../protocol/libraries/math/MathUtils.sol | 99 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/base/IncentivizedERC20.sol | 234 + downloads/LINEA/ORACLE.sol | 762 ++ .../chainlink/AggregatorInterface.sol | 19 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAaveOracle.sol | 71 + .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../src/contracts/misc/AaveOracle.sol | 146 + .../protocol/libraries/helpers/Errors.sol | 103 + downloads/LINEA/POOL_ADDRESSES_PROVIDER.sol | 1022 ++ .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/Ownable.sol | 69 + .../BaseUpgradeabilityProxy.sol | 66 + .../InitializableUpgradeabilityProxy.sol | 29 + .../openzeppelin/upgradeability/Proxy.sol | 81 + .../interfaces/IPoolAddressesProvider.sol | 227 + .../BaseImmutableAdminUpgradeabilityProxy.sol | 85 + ...zableImmutableAdminUpgradeabilityProxy.sol | 29 + .../configuration/PoolAddressesProvider.sol | 209 + .../POOL_ADDRESSES_PROVIDER_REGISTRY.sol | 352 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/Ownable.sol | 69 + .../IPoolAddressesProviderRegistry.sol | 60 + .../PoolAddressesProviderRegistry.sol | 102 + .../protocol/libraries/helpers/Errors.sol | 103 + downloads/LINEA/POOL_CONFIGURATOR_IMPL.sol | 4995 ++++++++++ .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../BaseUpgradeabilityProxy.sol | 66 + .../InitializableUpgradeabilityProxy.sol | 29 + .../openzeppelin/upgradeability/Proxy.sol | 81 + .../instances/PoolConfiguratorInstance.sol | 18 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../interfaces/IAaveIncentivesController.sol | 19 + .../IDefaultInterestRateStrategyV2.sol | 161 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPoolConfigurator.sol | 551 ++ .../interfaces/IPoolDataProvider.sol | 250 + .../IReserveInterestRateStrategy.sol | 29 + .../BaseImmutableAdminUpgradeabilityProxy.sol | 85 + ...zableImmutableAdminUpgradeabilityProxy.sol | 29 + .../VersionedInitializable.sol | 77 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 584 ++ .../protocol/libraries/helpers/Errors.sol | 103 + .../libraries/logic/ConfiguratorLogic.sol | 223 + .../libraries/math/PercentageMath.sol | 61 + .../types/ConfiguratorInputTypes.sol | 39 + .../protocol/libraries/types/DataTypes.sol | 324 + .../protocol/pool/PoolConfigurator.sol | 630 ++ downloads/LINEA/POOL_LOGIC.sol | 5725 +++++++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 584 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/logic/EModeLogic.sol | 72 + .../protocol/libraries/logic/GenericLogic.sol | 256 + .../protocol/libraries/logic/PoolLogic.sol | 201 + .../protocol/libraries/logic/ReserveLogic.sol | 313 + .../libraries/logic/ValidationLogic.sol | 642 ++ .../protocol/libraries/math/MathUtils.sol | 99 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/base/IncentivizedERC20.sol | 234 + downloads/LINEA/SUPPLY_LOGIC.sol | 5824 +++++++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IAccessControl.sol | 91 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPriceOracleGetter.sol | 30 + .../interfaces/IPriceOracleSentinel.sol | 67 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../configuration/EModeConfiguration.sol | 53 + .../configuration/ReserveConfiguration.sol | 584 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/logic/EModeLogic.sol | 72 + .../protocol/libraries/logic/GenericLogic.sol | 256 + .../protocol/libraries/logic/ReserveLogic.sol | 313 + .../protocol/libraries/logic/SupplyLogic.sol | 300 + .../libraries/logic/ValidationLogic.sol | 642 ++ .../protocol/libraries/math/MathUtils.sol | 99 + .../libraries/math/PercentageMath.sol | 61 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/base/IncentivizedERC20.sol | 234 + .../LINEA/UI_INCENTIVE_DATA_PROVIDER.sol | 4044 ++++++++ .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../openzeppelin/contracts/SafeCast.sol | 255 + .../helpers/UiIncentiveDataProviderV3.sol | 294 + .../interfaces/IEACAggregatorProxy.sol | 19 + .../interfaces/IUiIncentiveDataProviderV3.sol | 73 + .../src/contracts/interfaces/IACLManager.sol | 175 + .../interfaces/IAaveIncentivesController.sol | 19 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../configuration/ReserveConfiguration.sol | 584 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + .../tokenization/base/IncentivizedERC20.sol | 234 + .../rewards/interfaces/IRewardsController.sol | 203 + .../interfaces/IRewardsDistributor.sol | 177 + .../interfaces/ITransferStrategyBase.sol | 38 + .../rewards/libraries/RewardsDataTypes.sol | 54 + downloads/LINEA/UI_POOL_DATA_PROVIDER.sol | 4068 ++++++++ .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/IERC20Detailed.sol | 12 + .../helpers/AaveProtocolDataProvider.sol | 295 + .../helpers/UiPoolDataProviderV3.sol | 265 + .../interfaces/IEACAggregatorProxy.sol | 19 + .../interfaces/IERC20DetailedBytes.sol | 12 + .../interfaces/IUiPoolDataProviderV3.sol | 95 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../src/contracts/interfaces/IAaveOracle.sol | 71 + .../IDefaultInterestRateStrategyV2.sol | 161 + .../interfaces/IInitializableAToken.sol | 56 + .../interfaces/IInitializableDebtToken.sol | 52 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IPoolDataProvider.sol | 250 + .../interfaces/IPriceOracleGetter.sol | 30 + .../IReserveInterestRateStrategy.sol | 29 + .../interfaces/IScaledBalanceToken.sol | 72 + .../interfaces/IVariableDebtToken.sol | 46 + .../configuration/ReserveConfiguration.sol | 584 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/math/WadRayMath.sol | 126 + .../protocol/libraries/types/DataTypes.sol | 324 + downloads/LINEA/WALLET_BALANCE_PROVIDER.sol | 2576 +++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Address.sol | 220 + .../openzeppelin/contracts/IERC20.sol | 76 + .../helpers/WalletBalanceProvider.sol | 108 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../configuration/ReserveConfiguration.sol | 584 ++ .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/types/DataTypes.sol | 324 + downloads/LINEA/WETH_GATEWAY.sol | 3076 ++++++ .../gnosis/contracts/GPv2SafeERC20.sol | 115 + .../openzeppelin/contracts/Context.sol | 23 + .../openzeppelin/contracts/IERC20.sol | 76 + .../openzeppelin/contracts/Ownable.sol | 69 + .../helpers/WrappedTokenGatewayV3.sol | 197 + .../contracts/helpers/interfaces/IWETH.sol | 12 + .../interfaces/IWrappedTokenGatewayV3.sol | 22 + .../src/contracts/interfaces/IAToken.sol | 138 + .../interfaces/IAaveIncentivesController.sol | 19 + .../interfaces/IInitializableAToken.sol | 56 + .../src/contracts/interfaces/IPool.sol | 834 ++ .../interfaces/IPoolAddressesProvider.sol | 227 + .../interfaces/IScaledBalanceToken.sol | 72 + .../configuration/ReserveConfiguration.sol | 584 ++ .../configuration/UserConfiguration.sol | 236 + .../protocol/libraries/helpers/Errors.sol | 103 + .../protocol/libraries/types/DataTypes.sol | 324 + package-lock.json | 585 +- package.json | 11 +- 1319 files changed, 392601 insertions(+), 10 deletions(-) create mode 100644 diff.ts create mode 100644 diff_config.ts create mode 100644 diffs/ARBITRUM_LINEA/AAVE_PROTOCOL_DATA_PROVIDER_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/ACL_MANAGER_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/BORROW_LOGIC_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/BRIDGE_LOGIC_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/COLLECTOR_IMPL_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/CONFIGURATOR_LOGIC_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/DEFAULT_A_TOKEN_IMPL_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/EMISSION_MANAGER_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/EMODE_LOGIC_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/FLASHLOAN_LOGIC_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/L2_ENCODER_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/L2_POOL_IMPL_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/LIQUIDATION_LOGIC_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/ORACLE_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/POOL_ADDRESSES_PROVIDER_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/POOL_CONFIGURATOR_IMPL_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/POOL_LOGIC_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/SUPPLY_LOGIC_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/UI_INCENTIVE_DATA_PROVIDER_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/UI_POOL_DATA_PROVIDER_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/WALLET_BALANCE_PROVIDER_DIFF.md create mode 100644 diffs/ARBITRUM_LINEA/WETH_GATEWAY_DIFF.md create mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER.sol create mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/AaveProtocolDataProvider.sol create mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol create mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/ACL_MANAGER.sol create mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol create mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol create mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol create mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol create mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IACLManager.sol create mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol create mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL.sol create mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/Address.sol create mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/SafeERC20.sol create mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/interfaces/IERC20.sol create mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/interfaces/draft-IERC20Permit.sol create mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/contracts/Collector.sol create mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/interfaces/ICollector.sol create mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/ReentrancyGuard.sol create mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/VersionedInitializable.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/logic/ConfiguratorLogic.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol create mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAToken.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol create mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol create mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol create mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol create mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/misc/interfaces/IEACAggregatorProxy.sol create mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsController.sol create mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsDistributor.sol create mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsController.sol create mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsDistributor.sol create mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/ITransferStrategyBase.sol create mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/libraries/RewardsDataTypes.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/ICreditDelegationToken.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/VariableDebtToken.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/DebtTokenBase.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol create mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol create mode 100644 downloads/ARBITRUM/EMISSION_MANAGER.sol create mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol create mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol create mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/EmissionManager.sol create mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IEmissionManager.sol create mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol create mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol create mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol create mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC20.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseAdminUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/UpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/base/FlashLoanReceiverBase.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/interfaces/IFlashLoanReceiver.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/interfaces/IFlashLoanSimpleReceiver.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IACLManager.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAaveOracle.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/ICreditDelegationToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IDelegationToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IERC20WithPermit.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IL2Pool.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolConfigurator.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolDataProvider.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IStableDebtToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/AaveOracle.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/L2Encoder.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockPool.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/helpers/Helpers.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ConfiguratorLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/IsolationModeLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/LiquidationLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/PoolLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/L2Pool.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/Pool.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/PoolStorage.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/AToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/DebtTokenBase.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/EIP712Base.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapAdapter.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapBuyAdapter.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapSellAdapter.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/interfaces/IParaSwapAugustus.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/interfaces/IParaSwapAugustusRegistry.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/dependencies/openzeppelin/ReentrancyGuard.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/libraries/DataTypesHelper.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/WETHGateway.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IERC20DetailedBytes.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IUiIncentiveDataProviderV3.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IUiPoolDataProviderV3.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IWETH.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IWETHGateway.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/RewardsController.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/RewardsDistributor.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IPullRewardsTransferStrategy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IStakedToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IStakedTokenTransferStrategy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/TransferStrategyBase.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/Collector.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/CollectorController.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/interfaces/ICollector.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/AaveOracle.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/L2Encoder.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockPool.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/L2Pool.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/Pool.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/AToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/WETHGateway.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/RewardsController.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/treasury/Collector.sol create mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/treasury/CollectorController.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/L2PoolInstance.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/PoolInstance.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IERC20WithPermit.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IL2Pool.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BorrowLogic.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BridgeLogic.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/CalldataLogic.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/LiquidationLogic.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/PoolLogic.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/SupplyLogic.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/L2Pool.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/Pool.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/PoolStorage.sol create mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/ARBITRUM/ORACLE.sol create mode 100644 downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol create mode 100644 downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IACLManager.sol create mode 100644 downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IAaveOracle.sol create mode 100644 downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/misc/AaveOracle.sol create mode 100644 downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol create mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/instances/PoolConfiguratorInstance.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolConfigurator.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/pool/PoolConfigurator.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol create mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER.sol create mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/WrappedTokenGatewayV3.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWETH.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER.sol create mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/helpers/AaveProtocolDataProvider.sol create mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolDataProvider.sol create mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/ACL_MANAGER.sol create mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/AccessControl.sol create mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/ERC165.sol create mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IERC165.sol create mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Strings.sol create mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/configuration/ACLManager.sol create mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/BORROW_LOGIC.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/LINEA/COLLECTOR_IMPL.sol create mode 100644 downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/ReentrancyGuard.sol create mode 100644 downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/SafeERC20.sol create mode 100644 downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol create mode 100644 downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/Collector.sol create mode 100644 downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/ICollector.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol create mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/instances/ATokenInstance.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/AToken.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol create mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol create mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol create mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol create mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol create mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsController.sol create mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsDistributor.sol create mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsController.sol create mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsDistributor.sol create mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/ITransferStrategyBase.sol create mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/libraries/RewardsDataTypes.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/instances/VariableDebtTokenInstance.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/ICreditDelegationToken.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/VariableDebtToken.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/DebtTokenBase.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol create mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol create mode 100644 downloads/LINEA/EMISSION_MANAGER.sol create mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol create mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol create mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/EmissionManager.sol create mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IEmissionManager.sol create mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsController.sol create mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsDistributor.sol create mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/ITransferStrategyBase.sol create mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/libraries/RewardsDataTypes.sol create mode 100644 downloads/LINEA/EMODE_LOGIC.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/LINEA/L2_ENCODER.sol create mode 100644 downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/helpers/L2Encoder.sol create mode 100644 downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/L2PoolInstance.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/PoolInstance.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IERC20WithPermit.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IL2Pool.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BorrowLogic.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BridgeLogic.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/CalldataLogic.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/LiquidationLogic.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/PoolLogic.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/SupplyLogic.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/L2Pool.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/Pool.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/PoolStorage.sol create mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/LINEA/ORACLE.sol create mode 100644 downloads/LINEA/ORACLE/AaveOracle/src/contracts/dependencies/chainlink/AggregatorInterface.sol create mode 100644 downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IAaveOracle.sol create mode 100644 downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/LINEA/ORACLE/AaveOracle/src/contracts/misc/AaveOracle.sol create mode 100644 downloads/LINEA/ORACLE/AaveOracle/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/protocol/configuration/PoolAddressesProvider.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/interfaces/IPoolAddressesProviderRegistry.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol create mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/instances/PoolConfiguratorInstance.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolConfigurator.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolDataProvider.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/pool/PoolConfigurator.sol create mode 100644 downloads/LINEA/POOL_LOGIC.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol create mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol create mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER.sol create mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol create mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/helpers/WalletBalanceProvider.sol create mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/types/DataTypes.sol create mode 100644 downloads/LINEA/WETH_GATEWAY.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/WrappedTokenGatewayV3.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWETH.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAToken.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAaveIncentivesController.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IInitializableAToken.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPool.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPoolAddressesProvider.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IScaledBalanceToken.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/helpers/Errors.sol create mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/types/DataTypes.sol diff --git a/.gitignore b/.gitignore index 9a68b89b..7d497b20 100644 --- a/.gitignore +++ b/.gitignore @@ -9,8 +9,6 @@ out/ # artifacts reports/ -diffs/ -downloads/ # editors .idea diff --git a/diff.ts b/diff.ts new file mode 100644 index 00000000..57a61334 --- /dev/null +++ b/diff.ts @@ -0,0 +1,122 @@ +#!/usr/bin/env node + +import {ethers} from 'ethers'; +import {CONTRACTS, PROXIES, CHAIN_ID, Networks} from './diff_config'; +import child_process from 'child_process'; +import dotenv from 'dotenv'; +import fs from 'fs'; +dotenv.config(); + +function runCmd(cmd: string) { + var resp = child_process.execSync(cmd); + var result = resp.toString(); + return result; +} + +const API_KEYS = { + [Networks.ARBITRUM]: process.env.ETHERSCAN_API_KEY_ARBITRUM, + [Networks.LINEA]: process.env.ETHERSCAN_API_KEY_LINEA, + [Networks.FACTORY_LOCAL]: undefined, +}; + +const RPC_URLS = { + [Networks.ARBITRUM]: process.env.RPC_ARBITRUM, + [Networks.LINEA]: process.env.RPC_LINEA, + [Networks.FACTORY_LOCAL]: undefined, +}; + +function download(network: Networks, contractName: string, address: string) { + if (!fs.existsSync(`downloads/${network}/${contractName}`)) { + console.log('downloading', contractName); + runCmd( + `cast etherscan-source --chain-id ${CHAIN_ID[network]} -d downloads/${network}/${contractName} ${address} --etherscan-api-key ${API_KEYS[network]}` + ); + } +} + +function getImpl(network: Networks, address: string) { + const x = runCmd( + `cast storage --rpc-url ${RPC_URLS[network]} ${address} 24440054405305269366569402256811496959409073762505157381672968839269610695612 --etherscan-api-key ${API_KEYS[network]}` + ).replace('\n', ''); + return ethers.getAddress(x.slice(-40)); +} + +function diffContracts(commonContracts: string[], network1: string, network2: string) { + try { + commonContracts.map((contractName) => { + PROXIES.includes(contractName) && (contractName = contractName + '_IMPL'); + const sourcePathNetwork1 = + network1 != 'FACTORY_LOCAL' + ? `./downloads/${network1}/${contractName}.sol` + : `./downloads/FACTORY_LOCAL/${contractName}.sol`; + const sourcePathNetwork2 = + network2 != 'FACTORY_LOCAL' + ? `./downloads/${network2}/${contractName}.sol` + : `./downloads/FACTORY_LOCAL/${contractName}.sol`; + const outPath = `${network1}_${network2}/${contractName}_DIFF`; + runCmd( + `make git-diff before=${sourcePathNetwork1} after=${sourcePathNetwork2} out=${outPath}` + ); + }); + } catch (e) { + console.log(e); + throw new Error('oops... failed to diff contracts'); + } +} + +function flatten(network: string, name: string, path: string) { + console.log('flattening contract', name); + const sourcePath = + network != 'FACTORY_LOCAL' ? `./downloads/${network}/${name}/${path}` : `./${path}`; + const outPath = + network != 'FACTORY_LOCAL' + ? `./downloads/${network}/${name}.sol` + : `./downloads/FACTORY_LOCAL/${name}.sol`; + runCmd(`forge flatten ${sourcePath} --output ${outPath}`); +} + +function downloadContracts(commonContracts: string[], network: Networks) { + commonContracts.map((key) => { + const isProxy = PROXIES.includes(key); + const contractName = isProxy ? `${key}_IMPL` : key; + const address = isProxy + ? getImpl(network, CONTRACTS[network][key].address as string) + : CONTRACTS[network][key].address; + download(network, contractName, address as string); + }); +} + +function flattenContracts(commonContracts: string[], network: Networks) { + commonContracts.map((key) => { + const isProxy = PROXIES.includes(key); + const contractName = isProxy ? `${key}_IMPL` : key; + flatten(network, contractName, CONTRACTS[network as keyof typeof CONTRACTS][key].path); + }); +} + +async function main() { + // get networks to diff against from the command line input + const network1 = process.argv[2] as Networks; + const network2 = process.argv[3] as Networks; + + console.log(`comparing diffs between ${network1}, ${network2}`); + + // find all the common contracts to compare between both the networks. + const commonContracts = Object.keys(CONTRACTS[network1 as keyof typeof CONTRACTS]).filter((key) => + CONTRACTS[network2 as keyof typeof CONTRACTS].hasOwnProperty(key) + ); + + if (network1 != 'FACTORY_LOCAL') { + downloadContracts(commonContracts, network1); + } + if (network2 != 'FACTORY_LOCAL') { + downloadContracts(commonContracts, network2); + } + + flattenContracts(commonContracts, network1); + flattenContracts(commonContracts, network2); + + diffContracts(commonContracts, network1, network2); +} + +main(); diff --git a/diff_config.ts b/diff_config.ts new file mode 100644 index 00000000..b70f6430 --- /dev/null +++ b/diff_config.ts @@ -0,0 +1,293 @@ +import {AaveV3Linea, AaveV3Arbitrum} from '@bgd-labs/aave-address-book'; + +enum Networks { + ARBITRUM = 'ARBITRUM', + LINEA = 'LINEA', + FACTORY_LOCAL = 'FACTORY_LOCAL' +} + +const CONTRACTS: ContractsType = { + [Networks.ARBITRUM]: { + POOL_ADDRESSES_PROVIDER: { + name: 'PoolAddressesProvider', + path: 'PoolAddressesProvider/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol', + address: AaveV3Arbitrum.POOL_ADDRESSES_PROVIDER, + }, + L2_POOL: { + name: 'L2Pool', + path: 'L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/L2PoolInstance.sol', + address: AaveV3Arbitrum.POOL, + }, + POOL_CONFIGURATOR: { + name: 'PoolConfigurator', + path: 'PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/instances/PoolConfiguratorInstance.sol', + address: AaveV3Arbitrum.POOL_CONFIGURATOR, + }, + ORACLE: { + name: 'AaveOracle', + path: 'AaveOracle/@aave/core-v3/contracts/misc/AaveOracle.sol', + address: AaveV3Arbitrum.ORACLE, + }, + AAVE_PROTOCOL_DATA_PROVIDER: { + name: 'AaveProtocolDataProvider', + path: 'AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/AaveProtocolDataProvider.sol', + address: AaveV3Arbitrum.AAVE_PROTOCOL_DATA_PROVIDER, + }, + ACL_MANAGER: { + name: 'ACLManager', + path: 'ACLManager/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol', + address: AaveV3Arbitrum.ACL_MANAGER, + }, + COLLECTOR: { + name: 'Collector', + path: 'Collector/src/contracts/Collector.sol', + address: AaveV3Arbitrum.COLLECTOR, + }, + DEFAULT_INCENTIVES_CONTROLLER: { + name: 'RewardsController', + path: 'RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsController.sol', + address: AaveV3Arbitrum.DEFAULT_INCENTIVES_CONTROLLER, + }, + DEFAULT_A_TOKEN_IMPL: { + name: 'AToken', + path: 'AToken/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol', + address: AaveV3Arbitrum.DEFAULT_A_TOKEN_IMPL_REV_2, + }, + DEFAULT_VARIABLE_DEBT_TOKEN_IMPL: { + name: 'VariableDebtToken', + path: 'VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/VariableDebtToken.sol', + address: AaveV3Arbitrum.DEFAULT_VARIABLE_DEBT_TOKEN_IMPL_REV_2, + }, + EMISSION_MANAGER: { + name: 'EmissionManager', + path: 'EmissionManager/@aave/periphery-v3/contracts/rewards/EmissionManager.sol', + address: AaveV3Arbitrum.EMISSION_MANAGER, + }, + POOL_ADDRESSES_PROVIDER_REGISTRY: { + name: 'PoolAddressesProviderRegistry', + path: 'PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol', + address: AaveV3Arbitrum.POOL_ADDRESSES_PROVIDER_REGISTRY, + }, + WETH_GATEWAY: { + name: 'WrappedTokenGatewayV3', + path: 'WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/WrappedTokenGatewayV3.sol', + address: AaveV3Arbitrum.WETH_GATEWAY, + }, + WALLET_BALANCE_PROVIDER: { + name: 'WalletBalanceProvider', + path: 'WalletBalanceProvider/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol', + address: AaveV3Arbitrum.WALLET_BALANCE_PROVIDER, + }, + UI_POOL_DATA_PROVIDER: { + name: 'UiPoolDataProviderV3', + path: 'UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol', + address: AaveV3Arbitrum.UI_POOL_DATA_PROVIDER, + }, + UI_INCENTIVE_DATA_PROVIDER: { + name: 'UiIncentiveDataProviderV3', + path: 'UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol', + address: AaveV3Arbitrum.UI_INCENTIVE_DATA_PROVIDER, + }, + L2_ENCODER: { + name: 'L2Encoder', + path: 'L2Encoder/@aave/core-v3/contracts/misc/L2Encoder.sol', + address: AaveV3Arbitrum.L2_ENCODER, + }, + BORROW_LOGIC: { + name: 'BorrowLogic', + path: 'BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol', + address: '0x4c52FE2162200bf26c314d7bbd8611699139d553', + }, + BRIDGE_LOGIC: { + name: 'BridgeLogic', + path: 'BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol', + address: '0x97dCbFaE5372A63128F141E8C0BC2c871Ca5F604', + }, + CONFIGURATOR_LOGIC: { + name: 'ConfiguratorLogic', + path: 'ConfiguratorLogic/src/core/contracts/protocol/libraries/logic/ConfiguratorLogic.sol', + address: '0x6F4964Db83CeCCDc98164796221d5259b922313C', + }, + EMODE_LOGIC: { + name: 'EModeLogic', + path: 'EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol', + address: '0x88F864670De467aA73CD45325F9652C578C8AB85', + }, + FLASHLOAN_LOGIC: { + name: 'FlashLoanLogic', + path: 'FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol', + address: '0xb32381feFFF45eE9F47fD2f2cF83C832637d6EF0', + }, + LIQUIDATION_LOGIC: { + name: 'LiquidationLogic', + path: 'LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol', + address: '0x80d16970B31243Fe67DaB028115f3E4c3E3510Ad', + }, + POOL_LOGIC: { + name: 'PoolLogic', + path: 'PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol', + address: '0xA58FB47bE9074828215A173564C0CD10f6F249bf', + }, + SUPPLY_LOGIC: { + name: 'SupplyLogic', + path: 'SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol', + address: '0x2b22E425C1322fbA0DbF17bb1dA25d71811EE7ba', + }, + }, + [Networks.LINEA]: { + POOL_ADDRESSES_PROVIDER: { + name: 'PoolAddressesProvider', + path: 'PoolAddressesProvider/src/contracts/protocol/configuration/PoolAddressesProvider.sol', + address: AaveV3Linea.POOL_ADDRESSES_PROVIDER, + }, + L2_POOL: { + name: 'L2Pool', + path: 'L2PoolInstance/src/contracts/instances/L2PoolInstance.sol', + address: AaveV3Linea.POOL, + }, + POOL_CONFIGURATOR: { + name: 'PoolConfigurator', + path: 'PoolConfiguratorInstance/src/contracts/instances/PoolConfiguratorInstance.sol', + address: AaveV3Linea.POOL_CONFIGURATOR, + }, + ORACLE: { + name: 'AaveOracle', + path: 'AaveOracle/src/contracts/misc/AaveOracle.sol', + address: AaveV3Linea.ORACLE, + }, + AAVE_PROTOCOL_DATA_PROVIDER: { + name: 'AaveProtocolDataProvider', + path: 'AaveProtocolDataProvider/src/contracts/helpers/AaveProtocolDataProvider.sol', + address: AaveV3Linea.AAVE_PROTOCOL_DATA_PROVIDER, + }, + ACL_MANAGER: { + name: 'ACLManager', + path: 'ACLManager/src/contracts/protocol/configuration/ACLManager.sol', + address: AaveV3Linea.ACL_MANAGER, + }, + COLLECTOR: { + name: 'Collector', + path: 'Collector/src/contracts/treasury/Collector.sol', + address: '0x86E2938daE289763D4e09a7e42c5cCcA62Cf9809', + }, + DEFAULT_INCENTIVES_CONTROLLER: { + name: 'RewardsController', + path: 'RewardsController/src/contracts/rewards/RewardsController.sol', + address: AaveV3Linea.DEFAULT_INCENTIVES_CONTROLLER, + }, + DEFAULT_A_TOKEN_IMPL: { + name: 'AToken', + path: 'ATokenInstance/src/contracts/instances/ATokenInstance.sol', + address: '0x589750BA8aF186cE5B55391B0b7148cAD43a1619', + }, + DEFAULT_VARIABLE_DEBT_TOKEN_IMPL: { + name: 'VariableDebtToken', + path: 'VariableDebtTokenInstance/src/contracts/instances/VariableDebtTokenInstance.sol', + address: '0xBeC519531F0E78BcDdB295242fA4EC5251B38574', + }, + EMISSION_MANAGER: { + name: 'EmissionManager', + path: 'EmissionManager/src/contracts/rewards/EmissionManager.sol', + address: AaveV3Linea.EMISSION_MANAGER, + }, + POOL_ADDRESSES_PROVIDER_REGISTRY: { + name: 'PoolAddressesProviderRegistry', + path: 'PoolAddressesProviderRegistry/src/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol', + address: AaveV3Linea.POOL_ADDRESSES_PROVIDER_REGISTRY, + }, + WETH_GATEWAY: { + name: 'WrappedTokenGatewayV3', + path: 'WrappedTokenGatewayV3/src/contracts/helpers/WrappedTokenGatewayV3.sol', + address: AaveV3Linea.WETH_GATEWAY, + }, + WALLET_BALANCE_PROVIDER: { + name: 'WalletBalanceProvider', + path: 'WalletBalanceProvider/src/contracts/helpers/WalletBalanceProvider.sol', + address: AaveV3Linea.WALLET_BALANCE_PROVIDER, + }, + UI_POOL_DATA_PROVIDER: { + name: 'UiPoolDataProviderV3', + path: 'UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol', + address: AaveV3Linea.UI_POOL_DATA_PROVIDER, + }, + UI_INCENTIVE_DATA_PROVIDER: { + name: 'UiIncentiveDataProviderV3', + path: 'UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol', + address: AaveV3Linea.UI_INCENTIVE_DATA_PROVIDER, + }, + L2_ENCODER: { + name: 'L2Encoder', + path: 'L2Encoder/src/contracts/helpers/L2Encoder.sol', + address: '0x01d678F1bbE148C96e7501F1Ac41661904F84F61', + }, + BORROW_LOGIC: { + name: 'BorrowLogic', + path: 'BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol', + address: '0xbFEDA4cC9184727Ac7546Ce529D306bB5CffcB4F', + }, + BRIDGE_LOGIC: { + name: 'BridgeLogic', + path: 'BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol', + address: '0x3f399651Fc3FE274F7754Bb240BC80e096c0d1c5', + }, + CONFIGURATOR_LOGIC: { + name: 'ConfiguratorLogic', + path: 'ConfiguratorLogic/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol', + address: '0x1C39F5E734625F34eAf11a8B43c71DAB832936b5', + }, + EMODE_LOGIC: { + name: 'EModeLogic', + path: 'EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol', + address: '0x848eD9932047Fae0baf74d645450018F424A4367', + }, + FLASHLOAN_LOGIC: { + name: 'FlashLoanLogic', + path: 'FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol', + address: '0x6990DFae5c227F1aC5D486b1AC0eecAcC2B3e68d', + }, + LIQUIDATION_LOGIC: { + name: 'LiquidationLogic', + path: 'LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol', + address: '0xB84A9FBa16902e990EbCb63A22bB46996E9CfABe', + }, + POOL_LOGIC: { + name: 'PoolLogic', + path: 'PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol', + address: '0x7Cc1def95a7eCfb5afF91425D5e828802A8d914E', + }, + SUPPLY_LOGIC: { + name: 'SupplyLogic', + path: 'SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol', + address: '0x3c012c5d3Be847F46a1428A3Bc53d70dFe691194', + }, + }, + [Networks.FACTORY_LOCAL]: {} +}; + +interface ContractInfo { + name: string; + path: string; + address?: string; +} + +type ContractsType = { + [key in Networks]: { + [contractName: string]: ContractInfo; + }; +}; + +const PROXIES = [ + 'DEFAULT_INCENTIVES_CONTROLLER', + 'POOL', + 'POOL_CONFIGURATOR', + 'L2_POOL', + 'COLLECTOR', +]; + +const CHAIN_ID = { + [Networks.ARBITRUM]: 42161, + [Networks.LINEA]: 59144, + [Networks.FACTORY_LOCAL]: undefined +}; + +export {CONTRACTS, PROXIES, CHAIN_ID, Networks}; diff --git a/diffs/ARBITRUM_LINEA/AAVE_PROTOCOL_DATA_PROVIDER_DIFF.md b/diffs/ARBITRUM_LINEA/AAVE_PROTOCOL_DATA_PROVIDER_DIFF.md new file mode 100644 index 00000000..bda958fa --- /dev/null +++ b/diffs/ARBITRUM_LINEA/AAVE_PROTOCOL_DATA_PROVIDER_DIFF.md @@ -0,0 +1,166 @@ +```diff +diff --git a/./downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER.sol b/./downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER.sol +index 8142191..9b34753 100644 +--- a/./downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER.sol ++++ b/./downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: MIT + pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -77,7 +77,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol ++// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IAaveIncentivesController.sol + + /** + * @title IAaveIncentivesController +@@ -96,7 +96,7 @@ interface IAaveIncentivesController { + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + } + +-// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider +@@ -323,7 +323,7 @@ interface IPoolAddressesProvider { + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol ++// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IScaledBalanceToken.sol + + /** + * @title IScaledBalanceToken +@@ -395,7 +395,7 @@ interface IScaledBalanceToken { + function getPreviousIndex(address user) external view returns (uint256); + } + +-// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -498,7 +498,7 @@ library Errors { + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol ++// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/math/WadRayMath.sol + + /** + * @title WadRayMath library +@@ -624,7 +624,7 @@ library WadRayMath { + } + } + +-// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { + /** +@@ -948,7 +948,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol ++// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + + interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); +@@ -958,7 +958,7 @@ interface IERC20Detailed is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol ++// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolDataProvider.sol + + /** + * @title IPoolDataProvider +@@ -1206,7 +1206,7 @@ interface IPoolDataProvider { + function getVirtualUnderlyingBalance(address asset) external view returns (uint256); + } + +-// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol ++// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPool.sol + + /** + * @title IPool +@@ -1765,6 +1765,7 @@ interface IPool { + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 ++ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ +@@ -2036,7 +2037,7 @@ interface IPool { + function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol ++// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + + /** + * @title ReserveConfiguration library +@@ -2051,6 +2052,7 @@ library ReserveConfiguration { + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore ++ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore +@@ -2059,7 +2061,7 @@ library ReserveConfiguration { + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +- //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory ++ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +@@ -2616,7 +2618,7 @@ library ReserveConfiguration { + } + } + +-// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol ++// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + + /** + * @title UserConfiguration library +@@ -2848,7 +2850,7 @@ library UserConfiguration { + } + } + +-// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol ++// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IInitializableDebtToken.sol + + /** + * @title IInitializableDebtToken +@@ -2897,7 +2899,7 @@ interface IInitializableDebtToken { + ) external; + } + +-// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol ++// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IVariableDebtToken.sol + + /** + * @title IVariableDebtToken +@@ -2940,7 +2942,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + } + +-// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/AaveProtocolDataProvider.sol ++// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/helpers/AaveProtocolDataProvider.sol + + /** + * @title AaveProtocolDataProvider +``` diff --git a/diffs/ARBITRUM_LINEA/ACL_MANAGER_DIFF.md b/diffs/ARBITRUM_LINEA/ACL_MANAGER_DIFF.md new file mode 100644 index 00000000..2318cd76 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/ACL_MANAGER_DIFF.md @@ -0,0 +1,244 @@ +```diff +diff --git a/./downloads/ARBITRUM/ACL_MANAGER.sol b/./downloads/LINEA/ACL_MANAGER.sol +index 9ff4476..c45f49c 100644 +--- a/./downloads/ARBITRUM/ACL_MANAGER.sol ++++ b/./downloads/LINEA/ACL_MANAGER.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 +-pragma solidity =0.8.10; ++pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol ++// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol + + /* + * @dev Provides information about the current execution context, including the +@@ -24,7 +24,7 @@ abstract contract Context { + } + } + +-// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol ++// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + + /** + * @dev External interface of AccessControl declared to support ERC165 detection. +@@ -114,7 +114,7 @@ interface IAccessControl { + function renounceRole(bytes32 role, address account) external; + } + +-// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol ++// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IERC165.sol + + /** + * @dev Interface of the ERC165 standard, as defined in the +@@ -137,7 +137,7 @@ interface IERC165 { + function supportsInterface(bytes4 interfaceId) external view returns (bool); + } + +-// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol ++// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Strings.sol + + /** + * @dev String operations. +@@ -202,13 +202,13 @@ library Strings { + } + } + +-// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. +- **/ ++ */ + interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. +@@ -303,7 +303,7 @@ interface IPoolAddressesProvider { + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id +- **/ ++ */ + function getMarketId() external view returns (string memory); + + /** +@@ -345,27 +345,27 @@ interface IPoolAddressesProvider { + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address +- **/ ++ */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation +- **/ ++ */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address +- **/ ++ */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation +- **/ ++ */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** +@@ -389,7 +389,7 @@ interface IPoolAddressesProvider { + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager +- **/ ++ */ + function setACLManager(address newAclManager) external; + + /** +@@ -413,7 +413,7 @@ interface IPoolAddressesProvider { + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel +- **/ ++ */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** +@@ -425,11 +425,11 @@ interface IPoolAddressesProvider { + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider +- **/ ++ */ + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -467,38 +467,33 @@ library Errors { + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' +- string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' +- string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' +- string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' +- string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' +- string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' +- string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' ++ string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' +- string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' ++ string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' +@@ -520,16 +515,24 @@ library Errors { + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' +- string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' +- string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 ++ string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled ++ string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid ++ string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed ++ string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed ++ string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 ++ string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' ++ string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' ++ string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range ++ string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state ++ string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol ++// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/ERC165.sol + + /** + * @dev Implementation of the {IERC165} interface. +@@ -554,13 +557,13 @@ abstract contract ERC165 is IERC165 { + } + } + +-// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IACLManager.sol ++// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IACLManager.sol + + /** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager +- **/ ++ */ + interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider +@@ -676,7 +679,7 @@ interface IACLManager { + function addFlashBorrower(address borrower) external; + + /** +- * @notice Removes an admin as FlashBorrower ++ * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; +@@ -727,7 +730,7 @@ interface IACLManager { + function isAssetListingAdmin(address admin) external view returns (bool); + } + +-// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol ++// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/AccessControl.sol + + /** + * @dev Contract module that allows children to implement role-based access +@@ -937,7 +940,7 @@ abstract contract AccessControl is Context, IAccessControl, ERC165 { + } + } + +-// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol ++// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/configuration/ACLManager.sol + + /** + * @title ACLManager +``` diff --git a/diffs/ARBITRUM_LINEA/BORROW_LOGIC_DIFF.md b/diffs/ARBITRUM_LINEA/BORROW_LOGIC_DIFF.md new file mode 100644 index 00000000..9b70e3f0 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/BORROW_LOGIC_DIFF.md @@ -0,0 +1,337 @@ +```diff +diff --git a/./downloads/ARBITRUM/BORROW_LOGIC.sol b/./downloads/LINEA/BORROW_LOGIC.sol +index 58a8929..9ef522e 100644 +--- a/./downloads/ARBITRUM/BORROW_LOGIC.sol ++++ b/./downloads/LINEA/BORROW_LOGIC.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 + pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + + // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +@@ -221,7 +221,7 @@ library Address { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + + /* + * @dev Provides information about the current execution context, including the +@@ -244,7 +244,7 @@ abstract contract Context { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + + /** + * @dev External interface of AccessControl declared to support ERC165 detection. +@@ -334,7 +334,7 @@ interface IAccessControl { + function renounceRole(bytes32 role, address account) external; + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -410,7 +410,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + + // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +@@ -666,7 +666,7 @@ library SafeCast { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol + + /** + * @title IAaveIncentivesController +@@ -685,7 +685,7 @@ interface IAaveIncentivesController { + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider +@@ -912,7 +912,7 @@ interface IPoolAddressesProvider { + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol + + /** + * @title IPriceOracleGetter +@@ -942,7 +942,7 @@ interface IPriceOracleGetter { + function getAssetPrice(address asset) external view returns (uint256); + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol + + /** + * @title IScaledBalanceToken +@@ -1014,7 +1014,7 @@ interface IScaledBalanceToken { + function getPreviousIndex(address user) external view returns (uint256); + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -1117,7 +1117,7 @@ library Errors { + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + + /** + * @title PercentageMath library +@@ -1178,7 +1178,7 @@ library PercentageMath { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + + /** + * @title WadRayMath library +@@ -1304,7 +1304,7 @@ library WadRayMath { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { + /** +@@ -1628,7 +1628,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + + /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library + /// @author Gnosis Developers +@@ -1741,7 +1741,7 @@ library GPv2SafeERC20 { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + + interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); +@@ -1751,7 +1751,7 @@ interface IERC20Detailed is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol + + /** + * @title IACLManager +@@ -1924,7 +1924,7 @@ interface IACLManager { + function isAssetListingAdmin(address admin) external view returns (bool); + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + + /** + * @title IPriceOracleSentinel +@@ -1989,7 +1989,7 @@ interface IPriceOracleSentinel { + function getGracePeriod() external view returns (uint256); + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + + /** + * @title IReserveInterestRateStrategy +@@ -2016,7 +2016,7 @@ interface IReserveInterestRateStrategy { + ) external view returns (uint256, uint256); + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol + + /** + * @title MathUtils library +@@ -2113,7 +2113,7 @@ library MathUtils { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol + + /** + * @title IPool +@@ -2672,6 +2672,7 @@ interface IPool { + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 ++ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ +@@ -2943,7 +2944,7 @@ interface IPool { + function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + + /** + * @title ReserveConfiguration library +@@ -2958,6 +2959,7 @@ library ReserveConfiguration { + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore ++ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore +@@ -2966,7 +2968,7 @@ library ReserveConfiguration { + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +- //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory ++ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +@@ -3523,7 +3525,7 @@ library ReserveConfiguration { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + + /** + * @title EModeConfiguration library +@@ -3572,7 +3574,7 @@ library EModeConfiguration { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + + /** + * @title UserConfiguration library +@@ -3804,7 +3806,7 @@ library UserConfiguration { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol + + /** + * @title IInitializableAToken +@@ -3857,7 +3859,7 @@ interface IInitializableAToken { + ) external; + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol + + /** + * @title IInitializableDebtToken +@@ -3906,7 +3908,7 @@ interface IInitializableDebtToken { + ) external; + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol + + /** + * @title IsolationModeLogic library +@@ -3965,7 +3967,7 @@ library IsolationModeLogic { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol + + /** + * @title IVariableDebtToken +@@ -4008,7 +4010,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol + + /** + * @title IAToken +@@ -4142,7 +4144,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + function rescueTokens(address token, address to, uint256 amount) external; + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + + /** + * @title IncentivizedERC20 +@@ -4365,7 +4367,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + + /** + * @title ReserveLogic library +@@ -4666,7 +4668,7 @@ library ReserveLogic { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + + /** + * @title EModeLogic library +@@ -4728,7 +4730,7 @@ library EModeLogic { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + + /** + * @title GenericLogic library +@@ -4972,7 +4974,7 @@ library GenericLogic { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + + /** + * @title ReserveLogic library +@@ -5592,7 +5594,7 @@ library ValidationLogic { + } + } + +-// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol ++// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol + + /** + * @title BorrowLogic library +``` diff --git a/diffs/ARBITRUM_LINEA/BRIDGE_LOGIC_DIFF.md b/diffs/ARBITRUM_LINEA/BRIDGE_LOGIC_DIFF.md new file mode 100644 index 00000000..a63fcd68 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/BRIDGE_LOGIC_DIFF.md @@ -0,0 +1,328 @@ +```diff +diff --git a/./downloads/ARBITRUM/BRIDGE_LOGIC.sol b/./downloads/LINEA/BRIDGE_LOGIC.sol +index 9220f63..ffa3a45 100644 +--- a/./downloads/ARBITRUM/BRIDGE_LOGIC.sol ++++ b/./downloads/LINEA/BRIDGE_LOGIC.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 + pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + + // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +@@ -221,7 +221,7 @@ library Address { + } + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + + /* + * @dev Provides information about the current execution context, including the +@@ -244,7 +244,7 @@ abstract contract Context { + } + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + + /** + * @dev External interface of AccessControl declared to support ERC165 detection. +@@ -334,7 +334,7 @@ interface IAccessControl { + function renounceRole(bytes32 role, address account) external; + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -410,7 +410,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + + // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +@@ -666,7 +666,7 @@ library SafeCast { + } + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol + + /** + * @title IAaveIncentivesController +@@ -685,7 +685,7 @@ interface IAaveIncentivesController { + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider +@@ -912,7 +912,7 @@ interface IPoolAddressesProvider { + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol + + /** + * @title IPriceOracleGetter +@@ -942,7 +942,7 @@ interface IPriceOracleGetter { + function getAssetPrice(address asset) external view returns (uint256); + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol + + /** + * @title IScaledBalanceToken +@@ -1014,7 +1014,7 @@ interface IScaledBalanceToken { + function getPreviousIndex(address user) external view returns (uint256); + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -1117,7 +1117,7 @@ library Errors { + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + + /** + * @title PercentageMath library +@@ -1178,7 +1178,7 @@ library PercentageMath { + } + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + + /** + * @title WadRayMath library +@@ -1304,7 +1304,7 @@ library WadRayMath { + } + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { + /** +@@ -1628,7 +1628,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + + /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library + /// @author Gnosis Developers +@@ -1741,7 +1741,7 @@ library GPv2SafeERC20 { + } + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + + interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); +@@ -1751,7 +1751,7 @@ interface IERC20Detailed is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol + + /** + * @title IACLManager +@@ -1924,7 +1924,7 @@ interface IACLManager { + function isAssetListingAdmin(address admin) external view returns (bool); + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + + /** + * @title IPriceOracleSentinel +@@ -1989,7 +1989,7 @@ interface IPriceOracleSentinel { + function getGracePeriod() external view returns (uint256); + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + + /** + * @title IReserveInterestRateStrategy +@@ -2016,7 +2016,7 @@ interface IReserveInterestRateStrategy { + ) external view returns (uint256, uint256); + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol + + /** + * @title MathUtils library +@@ -2113,7 +2113,7 @@ library MathUtils { + } + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol + + /** + * @title IPool +@@ -2672,6 +2672,7 @@ interface IPool { + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 ++ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ +@@ -2943,7 +2944,7 @@ interface IPool { + function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + + /** + * @title ReserveConfiguration library +@@ -2958,6 +2959,7 @@ library ReserveConfiguration { + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore ++ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore +@@ -2966,7 +2968,7 @@ library ReserveConfiguration { + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +- //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory ++ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +@@ -3523,7 +3525,7 @@ library ReserveConfiguration { + } + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + + /** + * @title EModeConfiguration library +@@ -3572,7 +3574,7 @@ library EModeConfiguration { + } + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + + /** + * @title UserConfiguration library +@@ -3804,7 +3806,7 @@ library UserConfiguration { + } + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol + + /** + * @title IInitializableAToken +@@ -3857,7 +3859,7 @@ interface IInitializableAToken { + ) external; + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol + + /** + * @title IInitializableDebtToken +@@ -3906,7 +3908,7 @@ interface IInitializableDebtToken { + ) external; + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol + + /** + * @title IVariableDebtToken +@@ -3949,7 +3951,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol + + /** + * @title IAToken +@@ -4083,7 +4085,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + function rescueTokens(address token, address to, uint256 amount) external; + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + + /** + * @title IncentivizedERC20 +@@ -4306,7 +4308,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { + } + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + + /** + * @title ReserveLogic library +@@ -4607,7 +4609,7 @@ library ReserveLogic { + } + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + + /** + * @title EModeLogic library +@@ -4669,7 +4671,7 @@ library EModeLogic { + } + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + + /** + * @title GenericLogic library +@@ -4913,7 +4915,7 @@ library GenericLogic { + } + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + + /** + * @title ReserveLogic library +@@ -5533,7 +5535,7 @@ library ValidationLogic { + } + } + +-// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol ++// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol + + library BridgeLogic { + using ReserveLogic for DataTypes.ReserveCache; +``` diff --git a/diffs/ARBITRUM_LINEA/COLLECTOR_IMPL_DIFF.md b/diffs/ARBITRUM_LINEA/COLLECTOR_IMPL_DIFF.md new file mode 100644 index 00000000..724ff5b2 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/COLLECTOR_IMPL_DIFF.md @@ -0,0 +1,621 @@ +```diff +diff --git a/./downloads/ARBITRUM/COLLECTOR_IMPL.sol b/./downloads/LINEA/COLLECTOR_IMPL.sol +index 752e048..80c907f 100644 +--- a/./downloads/ARBITRUM/COLLECTOR_IMPL.sol ++++ b/./downloads/LINEA/COLLECTOR_IMPL.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: MIT +-pragma solidity >=0.6.0 ^0.8.0 ^0.8.1; ++pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/ReentrancyGuard.sol ++// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/ReentrancyGuard.sol + + // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) + +@@ -71,52 +71,9 @@ abstract contract ReentrancyGuard { + } + } + +-// downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/VersionedInitializable.sol ++// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +-/** +- * @title VersionedInitializable +- * +- * @dev Helper contract to support initializer functions. To use it, replace +- * the constructor with a function that has the `initializer` modifier. +- * WARNING: Unlike constructors, initializer functions must be manually +- * invoked. This applies both to deploying an Initializable contract, as well +- * as extending an Initializable contract via inheritance. +- * WARNING: When used with inheritance, manual care must be taken to not invoke +- * a parent initializer twice, or ensure that all initializers are idempotent, +- * because this is not dealt with automatically as with constructors. +- * +- * @author Aave, inspired by the OpenZeppelin Initializable contract +- */ +-abstract contract VersionedInitializable { +- /** +- * @dev Indicates that the contract has been initialized. +- */ +- uint256 internal lastInitializedRevision = 0; +- +- /** +- * @dev Modifier to use in the initializer function of a contract. +- */ +- modifier initializer() { +- uint256 revision = getRevision(); +- require(revision > lastInitializedRevision, 'Contract instance has already been initialized'); +- +- lastInitializedRevision = revision; +- +- _; +- } +- +- /// @dev returns the revision number of the contract. +- /// Needs to be defined in the inherited class as a constant. +- function getRevision() internal pure virtual returns (uint256); +- +- // Reserved storage space to allow for layout changes in the future. +- uint256[50] private ______gap; +-} +- +-// lib/solidity-utils/src/contracts/oz-common/Address.sol +- +-// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) +-// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/8b778fa20d6d76340c5fac1ed66c80273f05b95a ++// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + + /** + * @dev Collection of functions related to the address type +@@ -138,22 +95,17 @@ library Address { + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== +- * +- * [IMPORTANT] +- * ==== +- * You shouldn't rely on `isContract` to protect against flash loan attacks! +- * +- * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets +- * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract +- * constructor. +- * ==== + */ + function isContract(address account) internal view returns (bool) { +- // This method relies on extcodesize/address.code.length, which returns 0 +- // for contracts in construction, since the code is only stored at the end +- // of the constructor execution. ++ // This method relies on extcodesize, which returns 0 for contracts in ++ // construction, since the code is only stored at the end of the ++ // constructor execution. + +- return account.code.length > 0; ++ uint256 size; ++ assembly { ++ size := extcodesize(account) ++ } ++ return size > 0; + } + + /** +@@ -198,7 +150,7 @@ library Address { + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { +- return functionCallWithValue(target, data, 0, 'Address: low-level call failed'); ++ return functionCall(target, data, 'Address: low-level call failed'); + } + + /** +@@ -247,8 +199,10 @@ library Address { + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); ++ require(isContract(target), 'Address: call to non-contract'); ++ + (bool success, bytes memory returndata) = target.call{value: value}(data); +- return verifyCallResultFromTarget(target, success, returndata, errorMessage); ++ return verifyCallResult(success, returndata, errorMessage); + } + + /** +@@ -275,8 +229,10 @@ library Address { + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { ++ require(isContract(target), 'Address: static call to non-contract'); ++ + (bool success, bytes memory returndata) = target.staticcall(data); +- return verifyCallResultFromTarget(target, success, returndata, errorMessage); ++ return verifyCallResult(success, returndata, errorMessage); + } + + /** +@@ -300,37 +256,15 @@ library Address { + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { ++ require(isContract(target), 'Address: delegate call to non-contract'); ++ + (bool success, bytes memory returndata) = target.delegatecall(data); +- return verifyCallResultFromTarget(target, success, returndata, errorMessage); ++ return verifyCallResult(success, returndata, errorMessage); + } + + /** +- * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling +- * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. +- * +- * _Available since v4.8._ +- */ +- function verifyCallResultFromTarget( +- address target, +- bool success, +- bytes memory returndata, +- string memory errorMessage +- ) internal view returns (bytes memory) { +- if (success) { +- if (returndata.length == 0) { +- // only check isContract if the call was successful and the return data is empty +- // otherwise we already know that it was a contract +- require(isContract(target), 'Address: call to non-contract'); +- } +- return returndata; +- } else { +- _revert(returndata, errorMessage); +- } +- } +- +- /** +- * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the +- * revert reason or using the provided one. ++ * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the ++ * revert reason using the provided one. + * + * _Available since v4.3._ + */ +@@ -342,48 +276,27 @@ library Address { + if (success) { + return returndata; + } else { +- _revert(returndata, errorMessage); +- } +- } ++ // Look for revert reason and bubble it up if present ++ if (returndata.length > 0) { ++ // The easiest way to bubble the revert reason is using memory via assembly + +- function _revert(bytes memory returndata, string memory errorMessage) private pure { +- // Look for revert reason and bubble it up if present +- if (returndata.length > 0) { +- // The easiest way to bubble the revert reason is using memory via assembly +- /// @solidity memory-safe-assembly +- assembly { +- let returndata_size := mload(returndata) +- revert(add(32, returndata), returndata_size) ++ assembly { ++ let returndata_size := mload(returndata) ++ revert(add(32, returndata), returndata_size) ++ } ++ } else { ++ revert(errorMessage); + } +- } else { +- revert(errorMessage); + } + } + } + +-// lib/solidity-utils/src/contracts/oz-common/interfaces/IERC20.sol +- +-// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) +-// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/a035b235b4f2c9af4ba88edc4447f02e37f8d124 ++// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ + interface IERC20 { +- /** +- * @dev Emitted when `value` tokens are moved from one account (`from`) to +- * another (`to`). +- * +- * Note that `value` may be zero. +- */ +- event Transfer(address indexed from, address indexed to, uint256 value); +- +- /** +- * @dev Emitted when the allowance of a `spender` for an `owner` is set by +- * a call to {approve}. `value` is the new allowance. +- */ +- event Approval(address indexed owner, address indexed spender, uint256 value); +- + /** + * @dev Returns the amount of tokens in existence. + */ +@@ -395,13 +308,13 @@ interface IERC20 { + function balanceOf(address account) external view returns (uint256); + + /** +- * @dev Moves `amount` tokens from the caller's account to `to`. ++ * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ +- function transfer(address to, uint256 amount) external returns (bool); ++ function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be +@@ -429,7 +342,7 @@ interface IERC20 { + function approve(address spender, uint256 amount) external returns (bool); + + /** +- * @dev Moves `amount` tokens from `from` to `to` using the ++ * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * +@@ -437,71 +350,101 @@ interface IERC20 { + * + * Emits a {Transfer} event. + */ +- function transferFrom(address from, address to, uint256 amount) external returns (bool); ++ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); ++ ++ /** ++ * @dev Emitted when `value` tokens are moved from one account (`from`) to ++ * another (`to`). ++ * ++ * Note that `value` may be zero. ++ */ ++ event Transfer(address indexed from, address indexed to, uint256 value); ++ ++ /** ++ * @dev Emitted when the allowance of a `spender` for an `owner` is set by ++ * a call to {approve}. `value` is the new allowance. ++ */ ++ event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// lib/solidity-utils/src/contracts/oz-common/interfaces/IERC20Permit.sol +- +-// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) +-// Modified from https://github.com/OpenZeppelin/openzeppelin-contracts/commit/00cbf5a236564c3b7aacdad1f378cae22d890ca6 ++// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol + + /** +- * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in +- * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. +- * +- * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by +- * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't +- * need to send a transaction, and thus is not required to hold Ether at all. ++ * @title VersionedInitializable ++ * @author Aave, inspired by the OpenZeppelin Initializable contract ++ * @notice Helper contract to implement initializer functions. To use it, replace ++ * the constructor with a function that has the `initializer` modifier. ++ * @dev WARNING: Unlike constructors, initializer functions must be manually ++ * invoked. This applies both to deploying an Initializable contract, as well ++ * as extending an Initializable contract via inheritance. ++ * WARNING: When used with inheritance, manual care must be taken to not invoke ++ * a parent initializer twice, or ensure that all initializers are idempotent, ++ * because this is not dealt with automatically as with constructors. + */ +-interface IERC20Permit { ++abstract contract VersionedInitializable { + /** +- * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, +- * given ``owner``'s signed approval. +- * +- * IMPORTANT: The same issues {IERC20-approve} has related to transaction +- * ordering also apply here. +- * +- * Emits an {Approval} event. +- * +- * Requirements: +- * +- * - `spender` cannot be the zero address. +- * - `deadline` must be a timestamp in the future. +- * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` +- * over the EIP712-formatted function arguments. +- * - the signature must use ``owner``'s current nonce (see {nonces}). +- * +- * For more information on the signature format, see the +- * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP +- * section]. ++ * @dev Indicates that the contract has been initialized. + */ +- function permit( +- address owner, +- address spender, +- uint256 value, +- uint256 deadline, +- uint8 v, +- bytes32 r, +- bytes32 s +- ) external; ++ uint256 private lastInitializedRevision = 0; + + /** +- * @dev Returns the current nonce for `owner`. This value must be +- * included whenever a signature is generated for {permit}. +- * +- * Every successful call to {permit} increases ``owner``'s nonce by one. This +- * prevents a signature from being used multiple times. ++ * @dev Indicates that the contract is in the process of being initialized. + */ +- function nonces(address owner) external view returns (uint256); ++ bool private initializing; + + /** +- * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. ++ * @dev Modifier to use in the initializer function of a contract. + */ +- // solhint-disable-next-line func-name-mixedcase +- function DOMAIN_SEPARATOR() external view returns (bytes32); ++ modifier initializer() { ++ uint256 revision = getRevision(); ++ require( ++ initializing || isConstructor() || revision > lastInitializedRevision, ++ 'Contract instance has already been initialized' ++ ); ++ ++ bool isTopLevelCall = !initializing; ++ if (isTopLevelCall) { ++ initializing = true; ++ lastInitializedRevision = revision; ++ } ++ ++ _; ++ ++ if (isTopLevelCall) { ++ initializing = false; ++ } ++ } ++ ++ /** ++ * @notice Returns the revision number of the contract ++ * @dev Needs to be defined in the inherited class as a constant. ++ * @return The revision number ++ */ ++ function getRevision() internal pure virtual returns (uint256); ++ ++ /** ++ * @notice Returns true if and only if the function is running in the constructor ++ * @return True if the function is running in the constructor ++ */ ++ function isConstructor() private view returns (bool) { ++ // extcodesize checks the size of the code stored in an address, and ++ // address returns the current address. Since the code is still not ++ // deployed when running a constructor, any checks on its code size will ++ // yield zero, making it an effective way to detect if a contract is ++ // under construction or not. ++ uint256 cs; ++ //solium-disable-next-line ++ assembly { ++ cs := extcodesize(address()) ++ } ++ return cs == 0; ++ } ++ ++ // Reserved storage space to allow for layout changes in the future. ++ uint256[50] private ______gap; + } + +-// downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/interfaces/ICollector.sol ++// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/ICollector.sol + + interface ICollector { + struct Stream { +@@ -673,10 +616,9 @@ interface ICollector { + function getNextStreamId() external view returns (uint256); + } + +-// lib/solidity-utils/src/contracts/oz-common/SafeERC20.sol ++// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/SafeERC20.sol + +-// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol) +-// Modified From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/00cbf5a236564c3b7aacdad1f378cae22d890ca6 ++// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) + + /** + * @title SafeERC20 +@@ -690,96 +632,52 @@ interface ICollector { + library SafeERC20 { + using Address for address; + +- /** +- * @dev An operation with an ERC20 token failed. +- */ +- error SafeERC20FailedOperation(address token); +- +- /** +- * @dev Indicates a failed `decreaseAllowance` request. +- */ +- error SafeERC20FailedDecreaseAllowance( +- address spender, +- uint256 currentAllowance, +- uint256 requestedDecrease +- ); +- +- /** +- * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, +- * non-reverting calls are assumed to be successful. +- */ + function safeTransfer(IERC20 token, address to, uint256 value) internal { +- _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); ++ _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); + } + +- /** +- * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the +- * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. +- */ + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { +- _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); ++ _callOptionalReturn( ++ token, ++ abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ++ ); + } + + /** +- * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, +- * non-reverting calls are assumed to be successful. ++ * @dev Deprecated. This function has issues similar to the ones found in ++ * {IERC20-approve}, and its usage is discouraged. ++ * ++ * Whenever possible, use {safeIncreaseAllowance} and ++ * {safeDecreaseAllowance} instead. + */ ++ function safeApprove(IERC20 token, address spender, uint256 value) internal { ++ // safeApprove should only be called when setting an initial allowance, ++ // or when resetting it to zero. To increase and decrease it, use ++ // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' ++ require( ++ (value == 0) || (token.allowance(address(this), spender) == 0), ++ 'SafeERC20: approve from non-zero to non-zero allowance' ++ ); ++ _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); ++ } ++ + function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { +- uint256 oldAllowance = token.allowance(address(this), spender); +- forceApprove(token, spender, oldAllowance + value); ++ uint256 newAllowance = token.allowance(address(this), spender) + value; ++ _callOptionalReturn( ++ token, ++ abi.encodeWithSelector(token.approve.selector, spender, newAllowance) ++ ); + } + +- /** +- * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no value, +- * non-reverting calls are assumed to be successful. +- */ +- function safeDecreaseAllowance( +- IERC20 token, +- address spender, +- uint256 requestedDecrease +- ) internal { ++ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { + unchecked { +- uint256 currentAllowance = token.allowance(address(this), spender); +- if (currentAllowance < requestedDecrease) { +- revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); +- } +- forceApprove(token, spender, currentAllowance - requestedDecrease); +- } +- } +- +- /** +- * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, +- * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval +- * to be set to zero before setting it to a non-zero value, such as USDT. +- */ +- function forceApprove(IERC20 token, address spender, uint256 value) internal { +- bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); +- +- if (!_callOptionalReturnBool(token, approvalCall)) { +- _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); +- _callOptionalReturn(token, approvalCall); +- } +- } +- +- /** +- * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. +- * Revert on invalid signature. +- */ +- function safePermit( +- IERC20Permit token, +- address owner, +- address spender, +- uint256 value, +- uint256 deadline, +- uint8 v, +- bytes32 r, +- bytes32 s +- ) internal { +- uint256 nonceBefore = token.nonces(owner); +- token.permit(owner, spender, value, deadline, v, r, s); +- uint256 nonceAfter = token.nonces(owner); +- if (nonceAfter != nonceBefore + 1) { +- revert SafeERC20FailedOperation(address(token)); ++ uint256 oldAllowance = token.allowance(address(this), spender); ++ require(oldAllowance >= value, 'SafeERC20: decreased allowance below zero'); ++ uint256 newAllowance = oldAllowance - value; ++ _callOptionalReturn( ++ token, ++ abi.encodeWithSelector(token.approve.selector, spender, newAllowance) ++ ); + } + } + +@@ -791,37 +689,18 @@ library SafeERC20 { + */ + function _callOptionalReturn(IERC20 token, bytes memory data) private { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since +- // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that ++ // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that + // the target address contains contract code and also asserts for success in the low-level call. + +- bytes memory returndata = address(token).functionCall(data); +- if (returndata.length != 0 && !abi.decode(returndata, (bool))) { +- revert SafeERC20FailedOperation(address(token)); ++ bytes memory returndata = address(token).functionCall(data, 'SafeERC20: low-level call failed'); ++ if (returndata.length > 0) { ++ // Return data is optional ++ require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed'); + } + } +- +- /** +- * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement +- * on the return value: the return value is optional (but if data is returned, it must not be false). +- * @param token The token targeted by the call. +- * @param data The call data (encoded using abi.encode or one of its variants). +- * +- * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. +- */ +- function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { +- // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since +- // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false +- // and not revert is the subcall reverts. +- +- (bool success, bytes memory returndata) = address(token).call(data); +- return +- success && +- (returndata.length == 0 || abi.decode(returndata, (bool))) && +- address(token).code.length > 0; +- } + } + +-// downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/contracts/Collector.sol ++// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/Collector.sol + + /** + * @title Collector +@@ -903,8 +782,6 @@ contract Collector is VersionedInitializable, ICollector, ReentrancyGuard { + _nextStreamId = nextStreamId; + } + +- // can be removed after first deployment +- _initGuard(); + _setFundsAdmin(fundsAdmin); + } + +@@ -1021,9 +898,6 @@ contract Collector is VersionedInitializable, ICollector, ReentrancyGuard { + } + } + +- /// @dev needed in order to receive ETH from the Aave v1 ecosystem reserve +- receive() external payable {} +- + /// @inheritdoc ICollector + function setFundsAdmin(address admin) external onlyFundsAdmin { + _setFundsAdmin(admin); +``` diff --git a/diffs/ARBITRUM_LINEA/CONFIGURATOR_LOGIC_DIFF.md b/diffs/ARBITRUM_LINEA/CONFIGURATOR_LOGIC_DIFF.md new file mode 100644 index 00000000..4203b8a0 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/CONFIGURATOR_LOGIC_DIFF.md @@ -0,0 +1,1003 @@ +```diff +diff --git a/./downloads/ARBITRUM/CONFIGURATOR_LOGIC.sol b/./downloads/LINEA/CONFIGURATOR_LOGIC.sol +index b92a1a1..22e067d 100644 +--- a/./downloads/ARBITRUM/CONFIGURATOR_LOGIC.sol ++++ b/./downloads/LINEA/CONFIGURATOR_LOGIC.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 + pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/Address.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + + // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +@@ -221,7 +221,7 @@ library Address { + } + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -297,7 +297,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol + + /** + * @title Proxy +@@ -378,7 +378,7 @@ abstract contract Proxy { + } + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IAaveIncentivesController.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IAaveIncentivesController.sol + + /** + * @title IAaveIncentivesController +@@ -397,7 +397,7 @@ interface IAaveIncentivesController { + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider +@@ -624,7 +624,7 @@ interface IPoolAddressesProvider { + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -662,17 +662,14 @@ library Errors { + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' +- string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' +- string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' +- string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' +@@ -685,7 +682,6 @@ library Errors { + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' +- string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' +@@ -714,11 +710,9 @@ library Errors { + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' +- string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' +- string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled +@@ -730,14 +724,14 @@ library Errors { + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state ++ string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol + + library ConfiguratorInputTypes { + struct InitReserveInput { + address aTokenImpl; +- address stableDebtTokenImpl; + address variableDebtTokenImpl; + bool useVirtualBalance; + address interestRateStrategyAddress; +@@ -748,8 +742,6 @@ library ConfiguratorInputTypes { + string aTokenSymbol; + string variableDebtTokenName; + string variableDebtTokenSymbol; +- string stableDebtTokenName; +- string stableDebtTokenSymbol; + bytes params; + bytes interestRateData; + } +@@ -774,7 +766,7 @@ library ConfiguratorInputTypes { + } + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { + /** +@@ -792,7 +784,7 @@ library DataTypes { + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; +- //the current stable borrow rate. Expressed in ray ++ // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; +@@ -800,7 +792,7 @@ library DataTypes { + uint16 id; + //aToken address + address aTokenAddress; +- //stableDebtToken address ++ // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; +@@ -825,8 +817,8 @@ library DataTypes { + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; +- //the current stable borrow rate. Expressed in ray +- uint128 currentStableBorrowRate; ++ // DEPRECATED on v3.2.0 ++ uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves +@@ -835,8 +827,8 @@ library DataTypes { + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; +- //stableDebtToken address +- address stableDebtTokenAddress; ++ // DEPRECATED on v3.2.0 ++ address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy +@@ -859,7 +851,7 @@ library DataTypes { + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled +- //bit 59: stable rate borrowing enabled ++ //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled +@@ -868,7 +860,7 @@ library DataTypes { + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee +- //bit 168-175: eMode category ++ //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve +@@ -886,30 +878,49 @@ library DataTypes { + uint256 data; + } + +- struct EModeCategory { ++ // DEPRECATED: kept for backwards compatibility, might be removed in a future version ++ struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; +- // each eMode category may or may not have a custom oracle to override the individual assets price oracles ++ // DEPRECATED + address priceSource; + string label; + } + ++ struct CollateralConfig { ++ uint16 ltv; ++ uint16 liquidationThreshold; ++ uint16 liquidationBonus; ++ } ++ ++ struct EModeCategoryBaseConfiguration { ++ uint16 ltv; ++ uint16 liquidationThreshold; ++ uint16 liquidationBonus; ++ string label; ++ } ++ ++ struct EModeCategory { ++ // each eMode category has a custom ltv and liquidation threshold ++ uint16 ltv; ++ uint16 liquidationThreshold; ++ uint16 liquidationBonus; ++ uint128 collateralBitmap; ++ string label; ++ uint128 borrowableBitmap; ++ } ++ + enum InterestRateMode { + NONE, +- STABLE, ++ __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; +- uint256 currPrincipalStableDebt; +- uint256 currAvgStableBorrowRate; +- uint256 currTotalStableDebt; +- uint256 nextAvgStableBorrowRate; +- uint256 nextTotalStableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; +@@ -919,10 +930,8 @@ library DataTypes { + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; +- address stableDebtTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; +- uint40 stableDebtLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { +@@ -952,7 +961,6 @@ library DataTypes { + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; +- uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; +@@ -1004,7 +1012,6 @@ library DataTypes { + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; +- uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address addressesProvider; + address pool; +@@ -1046,7 +1053,6 @@ library DataTypes { + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; +- uint256 maxStableLoanPercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; +@@ -1067,9 +1073,7 @@ library DataTypes { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; +- uint256 totalStableDebt; +- uint256 totalVariableDebt; +- uint256 averageStableBorrowRate; ++ uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; +@@ -1079,7 +1083,6 @@ library DataTypes { + struct InitReserveParams { + address asset; + address aTokenAddress; +- address stableDebtAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; +@@ -1087,7 +1090,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + + interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); +@@ -1097,7 +1100,7 @@ interface IERC20Detailed is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IReserveInterestRateStrategy.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + + /** + * @title IReserveInterestRateStrategy +@@ -1117,15 +1120,14 @@ interface IReserveInterestRateStrategy { + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray +- * @return stableBorrowRate The stable borrow rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params +- ) external view returns (uint256, uint256, uint256); ++ ) external view returns (uint256, uint256); + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol + + /** + * @title BaseUpgradeabilityProxy +@@ -1188,7 +1190,7 @@ contract BaseUpgradeabilityProxy is Proxy { + } + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPool.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPool.sol + + /** + * @title IPool +@@ -1253,7 +1255,7 @@ interface IPool { + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out +- * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable ++ * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ +@@ -1283,18 +1285,6 @@ interface IPool { + bool useATokens + ); + +- /** +- * @dev Emitted on swapBorrowRateMode() +- * @param reserve The address of the underlying asset of the reserve +- * @param user The address of the user swapping his rate mode +- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable +- */ +- event SwapBorrowRateMode( +- address indexed reserve, +- address indexed user, +- DataTypes.InterestRateMode interestRateMode +- ); +- + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve +@@ -1323,20 +1313,14 @@ interface IPool { + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + +- /** +- * @dev Emitted on rebalanceStableBorrowRate() +- * @param reserve The address of the underlying asset of the reserve +- * @param user The address of the user for which the rebalance has been executed +- */ +- event RebalanceStableBorrowRate(address indexed reserve, address indexed user); +- + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed +- * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt ++ * @param interestRateMode The flashloan mode: 0 for regular flashloan, ++ * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ +@@ -1375,7 +1359,7 @@ interface IPool { + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate +- * @param stableBorrowRate The next stable borrow rate ++ * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index +@@ -1474,13 +1458,12 @@ interface IPool { + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower +- * already supplied enough collateral, or he was given enough allowance by a credit delegator on the +- * corresponding debt token (StableDebtToken or VariableDebtToken) ++ * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet +- * and 100 stable/variable debt tokens, depending on the `interestRateMode` ++ * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed +- * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable ++ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself +@@ -1497,11 +1480,11 @@ interface IPool { + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned +- * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address ++ * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed +@@ -1520,7 +1503,7 @@ interface IPool { + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed +@@ -1544,13 +1527,13 @@ interface IPool { + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens +- * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens ++ * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( +@@ -1559,32 +1542,6 @@ interface IPool { + uint256 interestRateMode + ) external returns (uint256); + +- /** +- * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa +- * @param asset The address of the underlying asset borrowed +- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable +- */ +- function swapBorrowRateMode(address asset, uint256 interestRateMode) external; +- +- /** +- * @notice Permissionless method which allows anyone to swap a users stable debt to variable debt +- * @dev Introduced in favor of stable rate deprecation +- * @param asset The address of the underlying asset borrowed +- * @param user The address of the user whose debt will be swapped from stable to variable +- */ +- function swapToVariable(address asset, address user) external; +- +- /** +- * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. +- * - Users can be rebalanced if the following conditions are satisfied: +- * 1. Usage ratio is above 95% +- * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too +- * much has been borrowed at a stable rate and suppliers are not earning enough +- * @param asset The address of the underlying asset borrowed +- * @param user The address of the user to be rebalanced +- */ +- function rebalanceStableBorrowRate(address asset, address user) external; +- + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied +@@ -1621,9 +1578,9 @@ interface IPool { + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver +- * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address ++ * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address +- * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 ++ * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man +@@ -1688,14 +1645,12 @@ interface IPool { + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve +- * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, +- address stableDebtAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; +@@ -1703,6 +1658,7 @@ interface IPool { + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract ++ * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; +@@ -1793,6 +1749,7 @@ interface IPool { + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 ++ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ +@@ -1875,20 +1832,70 @@ interface IPool { + ) external; + + /** +- * @notice Configures a new category for the eMode. ++ * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ +- function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; ++ function configureEModeCategory( ++ uint8 id, ++ DataTypes.EModeCategoryBaseConfiguration memory config ++ ) external; ++ ++ /** ++ * @notice Replaces the current eMode collateralBitmap. ++ * @param id The id of the category ++ * @param collateralBitmap The collateralBitmap of the category ++ */ ++ function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; ++ ++ /** ++ * @notice Replaces the current eMode borrowableBitmap. ++ * @param id The id of the category ++ * @param borrowableBitmap The borrowableBitmap of the category ++ */ ++ function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category ++ * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ +- function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); ++ function getEModeCategoryData( ++ uint8 id ++ ) external view returns (DataTypes.EModeCategoryLegacy memory); ++ ++ /** ++ * @notice Returns the label of an eMode category ++ * @param id The id of the category ++ * @return The label of the category ++ */ ++ function getEModeCategoryLabel(uint8 id) external view returns (string memory); ++ ++ /** ++ * @notice Returns the collateral config of an eMode category ++ * @param id The id of the category ++ * @return The ltv,lt,lb of the category ++ */ ++ function getEModeCategoryCollateralConfig( ++ uint8 id ++ ) external view returns (DataTypes.CollateralConfig memory); ++ ++ /** ++ * @notice Returns the collateralBitmap of an eMode category ++ * @param id The id of the category ++ * @return The collateralBitmap of the category ++ */ ++ function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); ++ ++ /** ++ * @notice Returns the borrowableBitmap of an eMode category ++ * @param id The id of the category ++ * @return The borrowableBitmap of the category ++ */ ++ function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode +@@ -1926,12 +1933,6 @@ interface IPool { + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + +- /** +- * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate +- * @return The percentage of available liquidity to borrow, expressed in bps +- */ +- function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); +- + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans +@@ -1987,40 +1988,40 @@ interface IPool { + /** + * @notice Gets the address of the external FlashLoanLogic + */ +- function getFlashLoanLogic() external returns (address); ++ function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ +- function getBorrowLogic() external returns (address); ++ function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ +- function getBridgeLogic() external returns (address); ++ function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ +- function getEModeLogic() external returns (address); ++ function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ +- function getLiquidationLogic() external returns (address); ++ function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ +- function getPoolLogic() external returns (address); ++ function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ +- function getSupplyLogic() external returns (address); ++ function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/configuration/ReserveConfiguration.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + + /** + * @title ReserveConfiguration library +@@ -2035,7 +2036,7 @@ library ReserveConfiguration { + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore +- uint256 internal constant STABLE_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFF; // prettier-ignore ++ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore +@@ -2044,7 +2045,7 @@ library ReserveConfiguration { + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +- uint256 internal constant EMODE_CATEGORY_MASK = 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore ++ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +@@ -2056,7 +2057,6 @@ library ReserveConfiguration { + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; +- uint256 internal constant STABLE_BORROWING_ENABLED_START_BIT_POSITION = 59; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; +@@ -2065,7 +2065,7 @@ library ReserveConfiguration { + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; +- uint256 internal constant EMODE_CATEGORY_START_BIT_POSITION = 168; ++ //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; +@@ -2078,7 +2078,6 @@ library ReserveConfiguration { + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; +- uint256 internal constant MAX_VALID_EMODE_CATEGORY = 255; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + +@@ -2329,31 +2328,6 @@ library ReserveConfiguration { + return (self.data & ~BORROWING_MASK) != 0; + } + +- /** +- * @notice Enables or disables stable rate borrowing on the reserve +- * @param self The reserve configuration +- * @param enabled True if the stable rate borrowing needs to be enabled, false otherwise +- */ +- function setStableRateBorrowingEnabled( +- DataTypes.ReserveConfigurationMap memory self, +- bool enabled +- ) internal pure { +- self.data = +- (self.data & STABLE_BORROWING_MASK) | +- (uint256(enabled ? 1 : 0) << STABLE_BORROWING_ENABLED_START_BIT_POSITION); +- } +- +- /** +- * @notice Gets the stable rate borrowing state of the reserve +- * @param self The reserve configuration +- * @return The stable rate borrowing state +- */ +- function getStableRateBorrowingEnabled( +- DataTypes.ReserveConfigurationMap memory self +- ) internal pure returns (bool) { +- return (self.data & ~STABLE_BORROWING_MASK) != 0; +- } +- + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration +@@ -2514,31 +2488,6 @@ library ReserveConfiguration { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + +- /** +- * @notice Sets the eMode asset category +- * @param self The reserve configuration +- * @param category The asset category when the user selects the eMode +- */ +- function setEModeCategory( +- DataTypes.ReserveConfigurationMap memory self, +- uint256 category +- ) internal pure { +- require(category <= MAX_VALID_EMODE_CATEGORY, Errors.INVALID_EMODE_CATEGORY); +- +- self.data = (self.data & EMODE_CATEGORY_MASK) | (category << EMODE_CATEGORY_START_BIT_POSITION); +- } +- +- /** +- * @dev Gets the eMode asset category +- * @param self The reserve configuration +- * @return The eMode category for the asset +- */ +- function getEModeCategory( +- DataTypes.ReserveConfigurationMap memory self +- ) internal pure returns (uint256) { +- return (self.data & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION; +- } +- + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration +@@ -2597,19 +2546,17 @@ library ReserveConfiguration { + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled +- * @return The state flag representing stableRateBorrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self +- ) internal pure returns (bool, bool, bool, bool, bool) { ++ ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, +- (dataLocal & ~STABLE_BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } +@@ -2622,11 +2569,10 @@ library ReserveConfiguration { + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor +- * @return The state param representing eMode category + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self +- ) internal pure returns (uint256, uint256, uint256, uint256, uint256, uint256) { ++ ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( +@@ -2634,8 +2580,7 @@ library ReserveConfiguration { + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, +- (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION, +- (dataLocal & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION ++ (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + +@@ -2657,7 +2602,7 @@ library ReserveConfiguration { + } + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol + + /** + * @title InitializableUpgradeabilityProxy +@@ -2684,7 +2629,7 @@ contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { + } + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol + + /** + * @title BaseImmutableAdminUpgradeabilityProxy +@@ -2767,7 +2712,7 @@ contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + } + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableAToken.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableAToken.sol + + /** + * @title IInitializableAToken +@@ -2820,7 +2765,7 @@ interface IInitializableAToken { + ) external; + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableDebtToken.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableDebtToken.sol + + /** + * @title IInitializableDebtToken +@@ -2869,7 +2814,7 @@ interface IInitializableDebtToken { + ) external; + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol + + /** + * @title InitializableAdminUpgradeabilityProxy +@@ -2894,7 +2839,7 @@ contract InitializableImmutableAdminUpgradeabilityProxy is + } + } + +-// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/logic/ConfiguratorLogic.sol ++// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol + + /** + * @title ConfiguratorLogic library +@@ -2917,11 +2862,6 @@ library ConfiguratorLogic { + address indexed proxy, + address indexed implementation + ); +- event StableDebtTokenUpgraded( +- address indexed asset, +- address indexed proxy, +- address indexed implementation +- ); + event VariableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, +@@ -2929,7 +2869,7 @@ library ConfiguratorLogic { + ); + + /** +- * @notice Initialize a reserve by creating and initializing aToken, stable debt token and variable debt token ++ * @notice Initialize a reserve by creating and initializing aToken and variable debt token + * @dev Emits the `ReserveInitialized` event + * @param pool The Pool in which the reserve will be initialized + * @param input The needed parameters for the initialization +@@ -2957,20 +2897,6 @@ library ConfiguratorLogic { + ) + ); + +- address stableDebtTokenProxyAddress = _initTokenWithProxy( +- input.stableDebtTokenImpl, +- abi.encodeWithSelector( +- IInitializableDebtToken.initialize.selector, +- pool, +- input.underlyingAsset, +- input.incentivesController, +- underlyingAssetDecimals, +- input.stableDebtTokenName, +- input.stableDebtTokenSymbol, +- input.params +- ) +- ); +- + address variableDebtTokenProxyAddress = _initTokenWithProxy( + input.variableDebtTokenImpl, + abi.encodeWithSelector( +@@ -2988,7 +2914,6 @@ library ConfiguratorLogic { + pool.initReserve( + input.underlyingAsset, + aTokenProxyAddress, +- stableDebtTokenProxyAddress, + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); +@@ -3012,7 +2937,7 @@ library ConfiguratorLogic { + emit ReserveInitialized( + input.underlyingAsset, + aTokenProxyAddress, +- stableDebtTokenProxyAddress, ++ address(0), + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); +@@ -3030,7 +2955,7 @@ library ConfiguratorLogic { + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + +- (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); ++ (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableAToken.initialize.selector, +@@ -3049,44 +2974,6 @@ library ConfiguratorLogic { + emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); + } + +- /** +- * @notice Updates the stable debt token implementation and initializes it +- * @dev Emits the `StableDebtTokenUpgraded` event +- * @param cachedPool The Pool containing the reserve with the stable debt token +- * @param input The parameters needed for the initialize call +- */ +- function executeUpdateStableDebtToken( +- IPool cachedPool, +- ConfiguratorInputTypes.UpdateDebtTokenInput calldata input +- ) external { +- DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); +- +- (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); +- +- bytes memory encodedCall = abi.encodeWithSelector( +- IInitializableDebtToken.initialize.selector, +- cachedPool, +- input.asset, +- input.incentivesController, +- decimals, +- input.name, +- input.symbol, +- input.params +- ); +- +- _upgradeTokenImplementation( +- reserveData.stableDebtTokenAddress, +- input.implementation, +- encodedCall +- ); +- +- emit StableDebtTokenUpgraded( +- input.asset, +- reserveData.stableDebtTokenAddress, +- input.implementation +- ); +- } +- + /** + * @notice Updates the variable debt token implementation and initializes it + * @dev Emits the `VariableDebtTokenUpgraded` event +@@ -3099,7 +2986,7 @@ library ConfiguratorLogic { + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + +- (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); ++ (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, +``` diff --git a/diffs/ARBITRUM_LINEA/DEFAULT_A_TOKEN_IMPL_DIFF.md b/diffs/ARBITRUM_LINEA/DEFAULT_A_TOKEN_IMPL_DIFF.md new file mode 100644 index 00000000..8e5b155c --- /dev/null +++ b/diffs/ARBITRUM_LINEA/DEFAULT_A_TOKEN_IMPL_DIFF.md @@ -0,0 +1,974 @@ +```diff +diff --git a/./downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL.sol b/./downloads/LINEA/DEFAULT_A_TOKEN_IMPL.sol +index efb0fd4..fd9dc66 100644 +--- a/./downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL.sol ++++ b/./downloads/LINEA/DEFAULT_A_TOKEN_IMPL.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 +-pragma solidity =0.8.10 ^0.8.0; ++pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol + + /* + * @dev Provides information about the current execution context, including the +@@ -24,7 +24,7 @@ abstract contract Context { + } + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -100,7 +100,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + + // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +@@ -356,7 +356,7 @@ library SafeCast { + } + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol + + /** + * @title IAaveIncentivesController +@@ -375,7 +375,7 @@ interface IAaveIncentivesController { + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider +@@ -602,7 +602,7 @@ interface IPoolAddressesProvider { + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol + + /** + * @title IScaledBalanceToken +@@ -674,7 +674,7 @@ interface IScaledBalanceToken { + function getPreviousIndex(address user) external view returns (uint256); + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol + + /** + * @title VersionedInitializable +@@ -751,7 +751,7 @@ abstract contract VersionedInitializable { + uint256[50] private ______gap; + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -789,17 +789,14 @@ library Errors { + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' +- string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' +- string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' +- string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' +@@ -812,7 +809,6 @@ library Errors { + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' +- string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' +@@ -841,17 +837,24 @@ library Errors { + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' +- string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' +- string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled ++ string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid ++ string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed ++ string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed ++ string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 ++ string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' ++ string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' ++ string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range ++ string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state ++ string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol + + /** + * @title WadRayMath library +@@ -977,10 +980,14 @@ library WadRayMath { + } + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { +- struct ReserveData { ++ /** ++ * This exists specifically to maintain the `getReserveData()` interface, since the new, internal ++ * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. ++ */ ++ struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray +@@ -991,7 +998,7 @@ library DataTypes { + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; +- //the current stable borrow rate. Expressed in ray ++ // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; +@@ -999,7 +1006,7 @@ library DataTypes { + uint16 id; + //aToken address + address aTokenAddress; +- //stableDebtToken address ++ // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; +@@ -1013,6 +1020,43 @@ library DataTypes { + uint128 isolationModeTotalDebt; + } + ++ struct ReserveData { ++ //stores the reserve configuration ++ ReserveConfigurationMap configuration; ++ //the liquidity index. Expressed in ray ++ uint128 liquidityIndex; ++ //the current supply rate. Expressed in ray ++ uint128 currentLiquidityRate; ++ //variable borrow index. Expressed in ray ++ uint128 variableBorrowIndex; ++ //the current variable borrow rate. Expressed in ray ++ uint128 currentVariableBorrowRate; ++ // DEPRECATED on v3.2.0 ++ uint128 __deprecatedStableBorrowRate; ++ //timestamp of last update ++ uint40 lastUpdateTimestamp; ++ //the id of the reserve. Represents the position in the list of the active reserves ++ uint16 id; ++ //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed ++ uint40 liquidationGracePeriodUntil; ++ //aToken address ++ address aTokenAddress; ++ // DEPRECATED on v3.2.0 ++ address __deprecatedStableDebtTokenAddress; ++ //variableDebtToken address ++ address variableDebtTokenAddress; ++ //address of the interest rate strategy ++ address interestRateStrategyAddress; ++ //the current treasury balance, scaled ++ uint128 accruedToTreasury; ++ //the outstanding unbacked aTokens minted through the bridging feature ++ uint128 unbacked; ++ //the outstanding debt borrowed against this asset in isolation mode ++ uint128 isolationModeTotalDebt; ++ //the amount of underlying accounted for by the protocol ++ uint128 virtualUnderlyingBalance; ++ } ++ + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold +@@ -1021,18 +1065,20 @@ library DataTypes { + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled +- //bit 59: stable rate borrowing enabled ++ //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled +- //bit 62-63: reserved ++ //bit 62: siloed borrowing enabled ++ //bit 63: flashloaning enabled + //bit 64-79: reserve factor +- //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap +- //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap +- //bit 152-167 liquidation protocol fee +- //bit 168-175 eMode category +- //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled +- //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals +- //bit 252-255 unused ++ //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap ++ //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap ++ //bit 152-167: liquidation protocol fee ++ //bit 168-175: DEPRECATED: eMode category ++ //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled ++ //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals ++ //bit 252: virtual accounting is enabled for the reserve ++ //bit 253-255 unused + + uint256 data; + } +@@ -1046,30 +1092,49 @@ library DataTypes { + uint256 data; + } + +- struct EModeCategory { ++ // DEPRECATED: kept for backwards compatibility, might be removed in a future version ++ struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; +- // each eMode category may or may not have a custom oracle to override the individual assets price oracles ++ // DEPRECATED + address priceSource; + string label; + } + ++ struct CollateralConfig { ++ uint16 ltv; ++ uint16 liquidationThreshold; ++ uint16 liquidationBonus; ++ } ++ ++ struct EModeCategoryBaseConfiguration { ++ uint16 ltv; ++ uint16 liquidationThreshold; ++ uint16 liquidationBonus; ++ string label; ++ } ++ ++ struct EModeCategory { ++ // each eMode category has a custom ltv and liquidation threshold ++ uint16 ltv; ++ uint16 liquidationThreshold; ++ uint16 liquidationBonus; ++ uint128 collateralBitmap; ++ string label; ++ uint128 borrowableBitmap; ++ } ++ + enum InterestRateMode { + NONE, +- STABLE, ++ __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; +- uint256 currPrincipalStableDebt; +- uint256 currAvgStableBorrowRate; +- uint256 currTotalStableDebt; +- uint256 nextAvgStableBorrowRate; +- uint256 nextTotalStableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; +@@ -1079,10 +1144,8 @@ library DataTypes { + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; +- address stableDebtTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; +- uint40 stableDebtLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { +@@ -1112,7 +1175,6 @@ library DataTypes { + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; +- uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; +@@ -1164,9 +1226,9 @@ library DataTypes { + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; +- uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address addressesProvider; ++ address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } +@@ -1205,7 +1267,6 @@ library DataTypes { + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; +- uint256 maxStableLoanPercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; +@@ -1226,18 +1287,16 @@ library DataTypes { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; +- uint256 totalStableDebt; +- uint256 totalVariableDebt; +- uint256 averageStableBorrowRate; ++ uint256 totalDebt; + uint256 reserveFactor; + address reserve; +- address aToken; ++ bool usingVirtualBalance; ++ uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; +- address stableDebtAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; +@@ -1245,7 +1304,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol + + /** + * @title EIP712Base +@@ -1315,7 +1374,7 @@ abstract contract EIP712Base { + function _EIP712BaseId() internal view virtual returns (string memory); + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + + /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library + /// @author Gnosis Developers +@@ -1428,7 +1487,7 @@ library GPv2SafeERC20 { + } + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + + interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); +@@ -1438,7 +1497,7 @@ interface IERC20Detailed is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IACLManager.sol + + /** + * @title IACLManager +@@ -1611,7 +1670,7 @@ interface IACLManager { + function isAssetListingAdmin(address admin) external view returns (bool); + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPool.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPool.sol + + /** + * @title IPool +@@ -1676,7 +1735,7 @@ interface IPool { + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out +- * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable ++ * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ +@@ -1706,18 +1765,6 @@ interface IPool { + bool useATokens + ); + +- /** +- * @dev Emitted on swapBorrowRateMode() +- * @param reserve The address of the underlying asset of the reserve +- * @param user The address of the user swapping his rate mode +- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable +- */ +- event SwapBorrowRateMode( +- address indexed reserve, +- address indexed user, +- DataTypes.InterestRateMode interestRateMode +- ); +- + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve +@@ -1746,20 +1793,14 @@ interface IPool { + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + +- /** +- * @dev Emitted on rebalanceStableBorrowRate() +- * @param reserve The address of the underlying asset of the reserve +- * @param user The address of the user for which the rebalance has been executed +- */ +- event RebalanceStableBorrowRate(address indexed reserve, address indexed user); +- + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed +- * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt ++ * @param interestRateMode The flashloan mode: 0 for regular flashloan, ++ * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ +@@ -1798,7 +1839,7 @@ interface IPool { + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate +- * @param stableBorrowRate The next stable borrow rate ++ * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index +@@ -1897,13 +1938,12 @@ interface IPool { + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower +- * already supplied enough collateral, or he was given enough allowance by a credit delegator on the +- * corresponding debt token (StableDebtToken or VariableDebtToken) ++ * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet +- * and 100 stable/variable debt tokens, depending on the `interestRateMode` ++ * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed +- * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable ++ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself +@@ -1920,11 +1960,11 @@ interface IPool { + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned +- * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address ++ * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed +@@ -1943,7 +1983,7 @@ interface IPool { + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed +@@ -1967,13 +2007,13 @@ interface IPool { + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens +- * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens ++ * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( +@@ -1982,24 +2022,6 @@ interface IPool { + uint256 interestRateMode + ) external returns (uint256); + +- /** +- * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa +- * @param asset The address of the underlying asset borrowed +- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable +- */ +- function swapBorrowRateMode(address asset, uint256 interestRateMode) external; +- +- /** +- * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. +- * - Users can be rebalanced if the following conditions are satisfied: +- * 1. Usage ratio is above 95% +- * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too +- * much has been borrowed at a stable rate and suppliers are not earning enough +- * @param asset The address of the underlying asset borrowed +- * @param user The address of the user to be rebalanced +- */ +- function rebalanceStableBorrowRate(address asset, address user) external; +- + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied +@@ -2036,9 +2058,9 @@ interface IPool { + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver +- * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address ++ * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address +- * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 ++ * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man +@@ -2103,14 +2125,12 @@ interface IPool { + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve +- * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, +- address stableDebtAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; +@@ -2118,6 +2138,7 @@ interface IPool { + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract ++ * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; +@@ -2133,6 +2154,22 @@ interface IPool { + address rateStrategyAddress + ) external; + ++ /** ++ * @notice Accumulates interest to all indexes of the reserve ++ * @dev Only callable by the PoolConfigurator contract ++ * @dev To be used when required by the configurator, for example when updating interest rates strategy data ++ * @param asset The address of the underlying asset of the reserve ++ */ ++ function syncIndexesState(address asset) external; ++ ++ /** ++ * @notice Updates interest rates on the reserve data ++ * @dev Only callable by the PoolConfigurator contract ++ * @dev To be used when required by the configurator, for example when updating interest rates strategy data ++ * @param asset The address of the underlying asset of the reserve ++ */ ++ function syncRatesState(address asset) external; ++ + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract +@@ -2188,7 +2225,24 @@ interface IPool { + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ +- function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); ++ function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); ++ ++ /** ++ * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 ++ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) ++ * @param asset The address of the underlying asset of the reserve ++ * @return The state and configuration data of the reserve with virtual accounting ++ */ ++ function getReserveDataExtended( ++ address asset ++ ) external view returns (DataTypes.ReserveData memory); ++ ++ /** ++ * @notice Returns the virtual underlying balance of the reserve ++ * @param asset The address of the underlying asset of the reserve ++ * @return The reserve virtual underlying balance ++ */ ++ function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer +@@ -2216,6 +2270,13 @@ interface IPool { + */ + function getReservesList() external view returns (address[] memory); + ++ /** ++ * @notice Returns the number of initialized reserves ++ * @dev It includes dropped reserves ++ * @return The count ++ */ ++ function getReservesCount() external view returns (uint256); ++ + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct +@@ -2251,20 +2312,70 @@ interface IPool { + ) external; + + /** +- * @notice Configures a new category for the eMode. ++ * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ +- function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; ++ function configureEModeCategory( ++ uint8 id, ++ DataTypes.EModeCategoryBaseConfiguration memory config ++ ) external; ++ ++ /** ++ * @notice Replaces the current eMode collateralBitmap. ++ * @param id The id of the category ++ * @param collateralBitmap The collateralBitmap of the category ++ */ ++ function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; ++ ++ /** ++ * @notice Replaces the current eMode borrowableBitmap. ++ * @param id The id of the category ++ * @param borrowableBitmap The borrowableBitmap of the category ++ */ ++ function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category ++ * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ +- function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); ++ function getEModeCategoryData( ++ uint8 id ++ ) external view returns (DataTypes.EModeCategoryLegacy memory); ++ ++ /** ++ * @notice Returns the label of an eMode category ++ * @param id The id of the category ++ * @return The label of the category ++ */ ++ function getEModeCategoryLabel(uint8 id) external view returns (string memory); ++ ++ /** ++ * @notice Returns the collateral config of an eMode category ++ * @param id The id of the category ++ * @return The ltv,lt,lb of the category ++ */ ++ function getEModeCategoryCollateralConfig( ++ uint8 id ++ ) external view returns (DataTypes.CollateralConfig memory); ++ ++ /** ++ * @notice Returns the collateralBitmap of an eMode category ++ * @param id The id of the category ++ * @return The collateralBitmap of the category ++ */ ++ function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); ++ ++ /** ++ * @notice Returns the borrowableBitmap of an eMode category ++ * @param id The id of the category ++ * @return The borrowableBitmap of the category ++ */ ++ function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode +@@ -2287,10 +2398,20 @@ interface IPool { + function resetIsolationModeTotalDebt(address asset) external; + + /** +- * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate +- * @return The percentage of available liquidity to borrow, expressed in bps +- */ +- function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); ++ * @notice Sets the liquidation grace period of the given asset ++ * @dev To enable a liquidation grace period, a timestamp in the future should be set, ++ * To disable a liquidation grace period, any timestamp in the past works, like 0 ++ * @param asset The address of the underlying asset to set the liquidationGracePeriod ++ * @param until Timestamp when the liquidation grace period will end ++ **/ ++ function setLiquidationGracePeriod(address asset, uint40 until) external; ++ ++ /** ++ * @notice Returns the liquidation grace period of the given asset ++ * @param asset The address of the underlying asset ++ * @return Timestamp when the liquidation grace period will end ++ **/ ++ function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans +@@ -2343,9 +2464,44 @@ interface IPool { + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; ++ ++ /** ++ * @notice Gets the address of the external FlashLoanLogic ++ */ ++ function getFlashLoanLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external BorrowLogic ++ */ ++ function getBorrowLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external BridgeLogic ++ */ ++ function getBridgeLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external EModeLogic ++ */ ++ function getEModeLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external LiquidationLogic ++ */ ++ function getLiquidationLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external PoolLogic ++ */ ++ function getPoolLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external SupplyLogic ++ */ ++ function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IInitializableAToken.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IInitializableAToken.sol + + /** + * @title IInitializableAToken +@@ -2398,7 +2554,7 @@ interface IInitializableAToken { + ) external; + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAToken.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAToken.sol + + /** + * @title IAToken +@@ -2532,7 +2688,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + function rescueTokens(address token, address to, uint256 amount) external; + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + + /** + * @title IncentivizedERC20 +@@ -2563,8 +2719,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the +- * user's last supply/withdrawal/borrow/repayment. StableDebtTokens use +- * this field to store the user's stable rate. ++ * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; +@@ -2587,15 +2742,15 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract +- * @param name The name of the token +- * @param symbol The symbol of the token +- * @param decimals The number of decimals of the token ++ * @param name_ The name of the token ++ * @param symbol_ The symbol of the token ++ * @param decimals_ The number of decimals of the token + */ +- constructor(IPool pool, string memory name, string memory symbol, uint8 decimals) { ++ constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); +- _name = name; +- _symbol = symbol; +- _decimals = decimals; ++ _name = name_; ++ _symbol = symbol_; ++ _decimals = decimals_; + POOL = pool; + } + +@@ -2756,7 +2911,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { + } + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol + + /** + * @title MintableIncentivizedERC20 +@@ -2818,7 +2973,7 @@ abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { + } + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol + + /** + * @title ScaledBalanceTokenBase +@@ -2967,14 +3122,14 @@ abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBa + } + } + +-// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/AToken.sol + + /** + * @title Aave ERC20 AToken + * @author Aave + * @notice Implementation of the interest bearing token for the Aave protocol + */ +-contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, IAToken { ++abstract contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, IAToken { + using WadRayMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; +@@ -2982,16 +3137,9 @@ contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, I + bytes32 public constant PERMIT_TYPEHASH = + keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); + +- uint256 public constant ATOKEN_REVISION = 0x2; +- + address internal _treasury; + address internal _underlyingAsset; + +- /// @inheritdoc VersionedInitializable +- function getRevision() internal pure virtual override returns (uint256) { +- return ATOKEN_REVISION; +- } +- + /** + * @dev Constructor. + * @param pool The address of the Pool contract +@@ -3012,29 +3160,7 @@ contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, I + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params +- ) public virtual override initializer { +- require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); +- _setName(aTokenName); +- _setSymbol(aTokenSymbol); +- _setDecimals(aTokenDecimals); +- +- _treasury = treasury; +- _underlyingAsset = underlyingAsset; +- _incentivesController = incentivesController; +- +- _domainSeparator = _calculateDomainSeparator(); +- +- emit Initialized( +- underlyingAsset, +- address(POOL), +- treasury, +- address(incentivesController), +- aTokenDecimals, +- aTokenName, +- aTokenSymbol, +- params +- ); +- } ++ ) public virtual; + + /// @inheritdoc IAToken + function mint( +@@ -3208,3 +3334,50 @@ contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, I + IERC20(token).safeTransfer(to, amount); + } + } ++ ++// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/instances/ATokenInstance.sol ++ ++contract ATokenInstance is AToken { ++ uint256 public constant ATOKEN_REVISION = 1; ++ ++ constructor(IPool pool) AToken(pool) {} ++ ++ /// @inheritdoc VersionedInitializable ++ function getRevision() internal pure virtual override returns (uint256) { ++ return ATOKEN_REVISION; ++ } ++ ++ /// @inheritdoc IInitializableAToken ++ function initialize( ++ IPool initializingPool, ++ address treasury, ++ address underlyingAsset, ++ IAaveIncentivesController incentivesController, ++ uint8 aTokenDecimals, ++ string calldata aTokenName, ++ string calldata aTokenSymbol, ++ bytes calldata params ++ ) public virtual override initializer { ++ require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); ++ _setName(aTokenName); ++ _setSymbol(aTokenSymbol); ++ _setDecimals(aTokenDecimals); ++ ++ _treasury = treasury; ++ _underlyingAsset = underlyingAsset; ++ _incentivesController = incentivesController; ++ ++ _domainSeparator = _calculateDomainSeparator(); ++ ++ emit Initialized( ++ underlyingAsset, ++ address(POOL), ++ treasury, ++ address(incentivesController), ++ aTokenDecimals, ++ aTokenName, ++ aTokenSymbol, ++ params ++ ); ++ } ++} +``` diff --git a/diffs/ARBITRUM_LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL_DIFF.md b/diffs/ARBITRUM_LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL_DIFF.md new file mode 100644 index 00000000..8f77fa6a --- /dev/null +++ b/diffs/ARBITRUM_LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL_DIFF.md @@ -0,0 +1,257 @@ +```diff +diff --git a/./downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol b/./downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol +index 8c00995..8226df6 100644 +--- a/./downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol ++++ b/./downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 +-pragma solidity =0.8.10 ^0.8.0 ^0.8.10; ++pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -77,7 +77,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol ++// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + + // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +@@ -333,22 +333,41 @@ library SafeCast { + } + } + +-// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol ++// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol ++ ++interface IEACAggregatorProxy { ++ function decimals() external view returns (uint8); ++ ++ function latestAnswer() external view returns (int256); ++ ++ function latestTimestamp() external view returns (uint256); ++ ++ function latestRound() external view returns (uint256); ++ ++ function getAnswer(uint256 roundId) external view returns (int256); ++ ++ function getTimestamp(uint256 roundId) external view returns (uint256); ++ ++ event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); ++ event NewRound(uint256 indexed roundId, address indexed startedBy); ++} ++ ++// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/interfaces/IScaledBalanceToken.sol + + /** + * @title IScaledBalanceToken + * @author Aave +- * @notice Defines the basic interface for a scaledbalance token. +- **/ ++ * @notice Defines the basic interface for a scaled-balance token. ++ */ + interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint +- * @param onBehalfOf The address of the user that will receive the minted scaled balance tokens +- * @param value The amount being minted (user entered amount + balance increase from interest) +- * @param balanceIncrease The increase in balance since the last action of the user ++ * @param onBehalfOf The address of the user that will receive the minted tokens ++ * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) ++ * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve +- **/ ++ */ + event Mint( + address indexed caller, + address indexed onBehalfOf, +@@ -358,13 +377,14 @@ interface IScaledBalanceToken { + ); + + /** +- * @dev Emitted after scaled balance tokens are burned +- * @param from The address from which the scaled tokens will be burned ++ * @dev Emitted after the burn action ++ * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address ++ * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any +- * @param value The amount being burned (user entered amount - balance increase from interest) +- * @param balanceIncrease The increase in balance since the last action of the user ++ * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) ++ * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve +- **/ ++ */ + event Burn( + address indexed from, + address indexed target, +@@ -379,7 +399,7 @@ interface IScaledBalanceToken { + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user +- **/ ++ */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** +@@ -387,24 +407,24 @@ interface IScaledBalanceToken { + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply +- **/ ++ */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply +- **/ ++ */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray +- **/ ++ */ + function getPreviousIndex(address user) external view returns (uint256); + } + +-// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol ++// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol + + /** + * @title VersionedInitializable +@@ -456,13 +476,13 @@ abstract contract VersionedInitializable { + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number +- **/ ++ */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor +- **/ ++ */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not +@@ -481,26 +501,7 @@ abstract contract VersionedInitializable { + uint256[50] private ______gap; + } + +-// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/misc/interfaces/IEACAggregatorProxy.sol +- +-interface IEACAggregatorProxy { +- function decimals() external view returns (uint8); +- +- function latestAnswer() external view returns (int256); +- +- function latestTimestamp() external view returns (uint256); +- +- function latestRound() external view returns (uint256); +- +- function getAnswer(uint256 roundId) external view returns (int256); +- +- function getTimestamp(uint256 roundId) external view returns (uint256); +- +- event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); +- event NewRound(uint256 indexed roundId, address indexed startedBy); +-} +- +-// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsDistributor.sol ++// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsDistributor.sol + + /** + * @title IRewardsDistributor +@@ -677,7 +678,7 @@ interface IRewardsDistributor { + function getEmissionManager() external view returns (address); + } + +-// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/ITransferStrategyBase.sol ++// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/ITransferStrategyBase.sol + + interface ITransferStrategyBase { + event EmergencyWithdrawal( +@@ -715,7 +716,7 @@ interface ITransferStrategyBase { + function emergencyWithdrawal(address token, address to, uint256 amount) external; + } + +-// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol ++// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + + interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); +@@ -725,7 +726,7 @@ interface IERC20Detailed is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/libraries/RewardsDataTypes.sol ++// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/libraries/RewardsDataTypes.sol + + library RewardsDataTypes { + struct RewardsConfigInput { +@@ -776,7 +777,7 @@ library RewardsDataTypes { + } + } + +-// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsController.sol ++// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsController.sol + + /** + * @title IRewardsController +@@ -974,7 +975,7 @@ interface IRewardsController is IRewardsDistributor { + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + } + +-// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsDistributor.sol ++// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsDistributor.sol + + /** + * @title RewardsDistributor +@@ -1014,7 +1015,7 @@ abstract contract RewardsDistributor is IRewardsDistributor { + function getRewardsData( + address asset, + address reward +- ) public view override returns (uint256, uint256, uint256, uint256) { ++ ) external view override returns (uint256, uint256, uint256, uint256) { + return ( + _assets[asset].rewards[reward].index, + _assets[asset].rewards[reward].emissionPerSecond, +@@ -1066,7 +1067,7 @@ abstract contract RewardsDistributor is IRewardsDistributor { + address user, + address asset, + address reward +- ) public view override returns (uint256) { ++ ) external view override returns (uint256) { + return _assets[asset].rewards[reward].usersData[user].index; + } + +@@ -1505,7 +1506,7 @@ abstract contract RewardsDistributor is IRewardsDistributor { + } + } + +-// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsController.sol ++// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsController.sol + + /** + * @title RewardsController +@@ -1515,7 +1516,7 @@ abstract contract RewardsDistributor is IRewardsDistributor { + contract RewardsController is RewardsDistributor, VersionedInitializable, IRewardsController { + using SafeCast for uint256; + +- uint256 public constant REVISION = 2; ++ uint256 public constant REVISION = 1; + + // This mapping allows whitelisted addresses to claim on behalf of others + // useful for contracts that hold tokens to be rewarded but don't have any native logic to claim Liquidity Mining rewards +``` diff --git a/diffs/ARBITRUM_LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL_DIFF.md b/diffs/ARBITRUM_LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL_DIFF.md new file mode 100644 index 00000000..dcc6d057 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL_DIFF.md @@ -0,0 +1,978 @@ +```diff +diff --git a/./downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol b/./downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol +index d6d70f1..1be027a 100644 +--- a/./downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol ++++ b/./downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 +-pragma solidity =0.8.10 ^0.8.0; ++pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol + + /* + * @dev Provides information about the current execution context, including the +@@ -24,7 +24,7 @@ abstract contract Context { + } + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -100,7 +100,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + + // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +@@ -356,7 +356,7 @@ library SafeCast { + } + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol + + /** + * @title IAaveIncentivesController +@@ -375,7 +375,7 @@ interface IAaveIncentivesController { + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/ICreditDelegationToken.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/ICreditDelegationToken.sol + + /** + * @title ICreditDelegationToken +@@ -435,7 +435,7 @@ interface ICreditDelegationToken { + ) external; + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider +@@ -662,7 +662,7 @@ interface IPoolAddressesProvider { + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol + + /** + * @title IScaledBalanceToken +@@ -734,7 +734,7 @@ interface IScaledBalanceToken { + function getPreviousIndex(address user) external view returns (uint256); + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol + + /** + * @title VersionedInitializable +@@ -811,7 +811,7 @@ abstract contract VersionedInitializable { + uint256[50] private ______gap; + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -849,17 +849,14 @@ library Errors { + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' +- string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' +- string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' +- string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' +@@ -872,7 +869,6 @@ library Errors { + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' +- string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' +@@ -901,17 +897,24 @@ library Errors { + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' +- string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' +- string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled ++ string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid ++ string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed ++ string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed ++ string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 ++ string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' ++ string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' ++ string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range ++ string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state ++ string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol + + /** + * @title WadRayMath library +@@ -1037,10 +1040,14 @@ library WadRayMath { + } + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { +- struct ReserveData { ++ /** ++ * This exists specifically to maintain the `getReserveData()` interface, since the new, internal ++ * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. ++ */ ++ struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray +@@ -1051,7 +1058,7 @@ library DataTypes { + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; +- //the current stable borrow rate. Expressed in ray ++ // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; +@@ -1059,7 +1066,7 @@ library DataTypes { + uint16 id; + //aToken address + address aTokenAddress; +- //stableDebtToken address ++ // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; +@@ -1073,6 +1080,43 @@ library DataTypes { + uint128 isolationModeTotalDebt; + } + ++ struct ReserveData { ++ //stores the reserve configuration ++ ReserveConfigurationMap configuration; ++ //the liquidity index. Expressed in ray ++ uint128 liquidityIndex; ++ //the current supply rate. Expressed in ray ++ uint128 currentLiquidityRate; ++ //variable borrow index. Expressed in ray ++ uint128 variableBorrowIndex; ++ //the current variable borrow rate. Expressed in ray ++ uint128 currentVariableBorrowRate; ++ // DEPRECATED on v3.2.0 ++ uint128 __deprecatedStableBorrowRate; ++ //timestamp of last update ++ uint40 lastUpdateTimestamp; ++ //the id of the reserve. Represents the position in the list of the active reserves ++ uint16 id; ++ //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed ++ uint40 liquidationGracePeriodUntil; ++ //aToken address ++ address aTokenAddress; ++ // DEPRECATED on v3.2.0 ++ address __deprecatedStableDebtTokenAddress; ++ //variableDebtToken address ++ address variableDebtTokenAddress; ++ //address of the interest rate strategy ++ address interestRateStrategyAddress; ++ //the current treasury balance, scaled ++ uint128 accruedToTreasury; ++ //the outstanding unbacked aTokens minted through the bridging feature ++ uint128 unbacked; ++ //the outstanding debt borrowed against this asset in isolation mode ++ uint128 isolationModeTotalDebt; ++ //the amount of underlying accounted for by the protocol ++ uint128 virtualUnderlyingBalance; ++ } ++ + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold +@@ -1081,18 +1125,20 @@ library DataTypes { + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled +- //bit 59: stable rate borrowing enabled ++ //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled +- //bit 62-63: reserved ++ //bit 62: siloed borrowing enabled ++ //bit 63: flashloaning enabled + //bit 64-79: reserve factor +- //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap +- //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap +- //bit 152-167 liquidation protocol fee +- //bit 168-175 eMode category +- //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled +- //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals +- //bit 252-255 unused ++ //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap ++ //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap ++ //bit 152-167: liquidation protocol fee ++ //bit 168-175: DEPRECATED: eMode category ++ //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled ++ //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals ++ //bit 252: virtual accounting is enabled for the reserve ++ //bit 253-255 unused + + uint256 data; + } +@@ -1106,30 +1152,49 @@ library DataTypes { + uint256 data; + } + +- struct EModeCategory { ++ // DEPRECATED: kept for backwards compatibility, might be removed in a future version ++ struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; +- // each eMode category may or may not have a custom oracle to override the individual assets price oracles ++ // DEPRECATED + address priceSource; + string label; + } + ++ struct CollateralConfig { ++ uint16 ltv; ++ uint16 liquidationThreshold; ++ uint16 liquidationBonus; ++ } ++ ++ struct EModeCategoryBaseConfiguration { ++ uint16 ltv; ++ uint16 liquidationThreshold; ++ uint16 liquidationBonus; ++ string label; ++ } ++ ++ struct EModeCategory { ++ // each eMode category has a custom ltv and liquidation threshold ++ uint16 ltv; ++ uint16 liquidationThreshold; ++ uint16 liquidationBonus; ++ uint128 collateralBitmap; ++ string label; ++ uint128 borrowableBitmap; ++ } ++ + enum InterestRateMode { + NONE, +- STABLE, ++ __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; +- uint256 currPrincipalStableDebt; +- uint256 currAvgStableBorrowRate; +- uint256 currTotalStableDebt; +- uint256 nextAvgStableBorrowRate; +- uint256 nextTotalStableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; +@@ -1139,10 +1204,8 @@ library DataTypes { + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; +- address stableDebtTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; +- uint40 stableDebtLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { +@@ -1172,7 +1235,6 @@ library DataTypes { + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; +- uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; +@@ -1224,9 +1286,9 @@ library DataTypes { + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; +- uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address addressesProvider; ++ address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } +@@ -1265,7 +1327,6 @@ library DataTypes { + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; +- uint256 maxStableLoanPercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; +@@ -1286,18 +1347,16 @@ library DataTypes { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; +- uint256 totalStableDebt; +- uint256 totalVariableDebt; +- uint256 averageStableBorrowRate; ++ uint256 totalDebt; + uint256 reserveFactor; + address reserve; +- address aToken; ++ bool usingVirtualBalance; ++ uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; +- address stableDebtAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; +@@ -1305,7 +1364,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol + + /** + * @title EIP712Base +@@ -1375,7 +1434,7 @@ abstract contract EIP712Base { + function _EIP712BaseId() internal view virtual returns (string memory); + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + + interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); +@@ -1385,7 +1444,7 @@ interface IERC20Detailed is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IACLManager.sol + + /** + * @title IACLManager +@@ -1558,7 +1617,7 @@ interface IACLManager { + function isAssetListingAdmin(address admin) external view returns (bool); + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPool.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPool.sol + + /** + * @title IPool +@@ -1623,7 +1682,7 @@ interface IPool { + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out +- * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable ++ * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ +@@ -1653,18 +1712,6 @@ interface IPool { + bool useATokens + ); + +- /** +- * @dev Emitted on swapBorrowRateMode() +- * @param reserve The address of the underlying asset of the reserve +- * @param user The address of the user swapping his rate mode +- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable +- */ +- event SwapBorrowRateMode( +- address indexed reserve, +- address indexed user, +- DataTypes.InterestRateMode interestRateMode +- ); +- + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve +@@ -1693,20 +1740,14 @@ interface IPool { + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + +- /** +- * @dev Emitted on rebalanceStableBorrowRate() +- * @param reserve The address of the underlying asset of the reserve +- * @param user The address of the user for which the rebalance has been executed +- */ +- event RebalanceStableBorrowRate(address indexed reserve, address indexed user); +- + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed +- * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt ++ * @param interestRateMode The flashloan mode: 0 for regular flashloan, ++ * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ +@@ -1745,7 +1786,7 @@ interface IPool { + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate +- * @param stableBorrowRate The next stable borrow rate ++ * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index +@@ -1844,13 +1885,12 @@ interface IPool { + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower +- * already supplied enough collateral, or he was given enough allowance by a credit delegator on the +- * corresponding debt token (StableDebtToken or VariableDebtToken) ++ * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet +- * and 100 stable/variable debt tokens, depending on the `interestRateMode` ++ * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed +- * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable ++ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself +@@ -1867,11 +1907,11 @@ interface IPool { + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned +- * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address ++ * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed +@@ -1890,7 +1930,7 @@ interface IPool { + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed +@@ -1914,13 +1954,13 @@ interface IPool { + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens +- * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens ++ * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( +@@ -1929,24 +1969,6 @@ interface IPool { + uint256 interestRateMode + ) external returns (uint256); + +- /** +- * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa +- * @param asset The address of the underlying asset borrowed +- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable +- */ +- function swapBorrowRateMode(address asset, uint256 interestRateMode) external; +- +- /** +- * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. +- * - Users can be rebalanced if the following conditions are satisfied: +- * 1. Usage ratio is above 95% +- * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too +- * much has been borrowed at a stable rate and suppliers are not earning enough +- * @param asset The address of the underlying asset borrowed +- * @param user The address of the user to be rebalanced +- */ +- function rebalanceStableBorrowRate(address asset, address user) external; +- + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied +@@ -1983,9 +2005,9 @@ interface IPool { + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver +- * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address ++ * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address +- * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 ++ * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man +@@ -2050,14 +2072,12 @@ interface IPool { + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve +- * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, +- address stableDebtAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; +@@ -2065,6 +2085,7 @@ interface IPool { + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract ++ * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; +@@ -2080,6 +2101,22 @@ interface IPool { + address rateStrategyAddress + ) external; + ++ /** ++ * @notice Accumulates interest to all indexes of the reserve ++ * @dev Only callable by the PoolConfigurator contract ++ * @dev To be used when required by the configurator, for example when updating interest rates strategy data ++ * @param asset The address of the underlying asset of the reserve ++ */ ++ function syncIndexesState(address asset) external; ++ ++ /** ++ * @notice Updates interest rates on the reserve data ++ * @dev Only callable by the PoolConfigurator contract ++ * @dev To be used when required by the configurator, for example when updating interest rates strategy data ++ * @param asset The address of the underlying asset of the reserve ++ */ ++ function syncRatesState(address asset) external; ++ + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract +@@ -2135,7 +2172,24 @@ interface IPool { + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ +- function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); ++ function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); ++ ++ /** ++ * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 ++ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) ++ * @param asset The address of the underlying asset of the reserve ++ * @return The state and configuration data of the reserve with virtual accounting ++ */ ++ function getReserveDataExtended( ++ address asset ++ ) external view returns (DataTypes.ReserveData memory); ++ ++ /** ++ * @notice Returns the virtual underlying balance of the reserve ++ * @param asset The address of the underlying asset of the reserve ++ * @return The reserve virtual underlying balance ++ */ ++ function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer +@@ -2163,6 +2217,13 @@ interface IPool { + */ + function getReservesList() external view returns (address[] memory); + ++ /** ++ * @notice Returns the number of initialized reserves ++ * @dev It includes dropped reserves ++ * @return The count ++ */ ++ function getReservesCount() external view returns (uint256); ++ + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct +@@ -2198,20 +2259,70 @@ interface IPool { + ) external; + + /** +- * @notice Configures a new category for the eMode. ++ * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ +- function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; ++ function configureEModeCategory( ++ uint8 id, ++ DataTypes.EModeCategoryBaseConfiguration memory config ++ ) external; ++ ++ /** ++ * @notice Replaces the current eMode collateralBitmap. ++ * @param id The id of the category ++ * @param collateralBitmap The collateralBitmap of the category ++ */ ++ function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; ++ ++ /** ++ * @notice Replaces the current eMode borrowableBitmap. ++ * @param id The id of the category ++ * @param borrowableBitmap The borrowableBitmap of the category ++ */ ++ function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category ++ * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ +- function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); ++ function getEModeCategoryData( ++ uint8 id ++ ) external view returns (DataTypes.EModeCategoryLegacy memory); ++ ++ /** ++ * @notice Returns the label of an eMode category ++ * @param id The id of the category ++ * @return The label of the category ++ */ ++ function getEModeCategoryLabel(uint8 id) external view returns (string memory); ++ ++ /** ++ * @notice Returns the collateral config of an eMode category ++ * @param id The id of the category ++ * @return The ltv,lt,lb of the category ++ */ ++ function getEModeCategoryCollateralConfig( ++ uint8 id ++ ) external view returns (DataTypes.CollateralConfig memory); ++ ++ /** ++ * @notice Returns the collateralBitmap of an eMode category ++ * @param id The id of the category ++ * @return The collateralBitmap of the category ++ */ ++ function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); ++ ++ /** ++ * @notice Returns the borrowableBitmap of an eMode category ++ * @param id The id of the category ++ * @return The borrowableBitmap of the category ++ */ ++ function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode +@@ -2234,10 +2345,20 @@ interface IPool { + function resetIsolationModeTotalDebt(address asset) external; + + /** +- * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate +- * @return The percentage of available liquidity to borrow, expressed in bps +- */ +- function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); ++ * @notice Sets the liquidation grace period of the given asset ++ * @dev To enable a liquidation grace period, a timestamp in the future should be set, ++ * To disable a liquidation grace period, any timestamp in the past works, like 0 ++ * @param asset The address of the underlying asset to set the liquidationGracePeriod ++ * @param until Timestamp when the liquidation grace period will end ++ **/ ++ function setLiquidationGracePeriod(address asset, uint40 until) external; ++ ++ /** ++ * @notice Returns the liquidation grace period of the given asset ++ * @param asset The address of the underlying asset ++ * @return Timestamp when the liquidation grace period will end ++ **/ ++ function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans +@@ -2290,9 +2411,44 @@ interface IPool { + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; ++ ++ /** ++ * @notice Gets the address of the external FlashLoanLogic ++ */ ++ function getFlashLoanLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external BorrowLogic ++ */ ++ function getBorrowLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external BridgeLogic ++ */ ++ function getBridgeLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external EModeLogic ++ */ ++ function getEModeLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external LiquidationLogic ++ */ ++ function getLiquidationLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external PoolLogic ++ */ ++ function getPoolLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external SupplyLogic ++ */ ++ function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IInitializableDebtToken.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IInitializableDebtToken.sol + + /** + * @title IInitializableDebtToken +@@ -2341,12 +2497,12 @@ interface IInitializableDebtToken { + ) external; + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/DebtTokenBase.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/DebtTokenBase.sol + + /** + * @title DebtTokenBase + * @author Aave +- * @notice Base contract for different types of debt tokens, like StableDebtToken or VariableDebtToken ++ * @notice Base contract for different types of debt tokens, like VariableDebtToken + */ + abstract contract DebtTokenBase is + VersionedInitializable, +@@ -2437,7 +2593,7 @@ abstract contract DebtTokenBase is + } + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IVariableDebtToken.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IVariableDebtToken.sol + + /** + * @title IVariableDebtToken +@@ -2480,7 +2636,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + + /** + * @title IncentivizedERC20 +@@ -2511,8 +2667,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the +- * user's last supply/withdrawal/borrow/repayment. StableDebtTokens use +- * this field to store the user's stable rate. ++ * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; +@@ -2535,15 +2690,15 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract +- * @param name The name of the token +- * @param symbol The symbol of the token +- * @param decimals The number of decimals of the token ++ * @param name_ The name of the token ++ * @param symbol_ The symbol of the token ++ * @param decimals_ The number of decimals of the token + */ +- constructor(IPool pool, string memory name, string memory symbol, uint8 decimals) { ++ constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); +- _name = name; +- _symbol = symbol; +- _decimals = decimals; ++ _name = name_; ++ _symbol = symbol_; ++ _decimals = decimals_; + POOL = pool; + } + +@@ -2704,7 +2859,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { + } + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol + + /** + * @title MintableIncentivizedERC20 +@@ -2766,7 +2921,7 @@ abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { + } + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol + + /** + * @title ScaledBalanceTokenBase +@@ -2915,7 +3070,7 @@ abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBa + } + } + +-// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/VariableDebtToken.sol ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/VariableDebtToken.sol + + /** + * @title VariableDebtToken +@@ -2924,12 +3079,10 @@ abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBa + * at variable rate mode + * @dev Transfer and approve functionalities are disabled since its a non-transferable token + */ +-contract VariableDebtToken is DebtTokenBase, ScaledBalanceTokenBase, IVariableDebtToken { ++abstract contract VariableDebtToken is DebtTokenBase, ScaledBalanceTokenBase, IVariableDebtToken { + using WadRayMath for uint256; + using SafeCast for uint256; + +- uint256 public constant DEBT_TOKEN_REVISION = 0x2; +- + /** + * @dev Constructor. + * @param pool The address of the Pool contract +@@ -2952,32 +3105,7 @@ contract VariableDebtToken is DebtTokenBase, ScaledBalanceTokenBase, IVariableDe + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params +- ) external override initializer { +- require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); +- _setName(debtTokenName); +- _setSymbol(debtTokenSymbol); +- _setDecimals(debtTokenDecimals); +- +- _underlyingAsset = underlyingAsset; +- _incentivesController = incentivesController; +- +- _domainSeparator = _calculateDomainSeparator(); +- +- emit Initialized( +- underlyingAsset, +- address(POOL), +- address(incentivesController), +- debtTokenDecimals, +- debtTokenName, +- debtTokenSymbol, +- params +- ); +- } +- +- /// @inheritdoc VersionedInitializable +- function getRevision() internal pure virtual override returns (uint256) { +- return DEBT_TOKEN_REVISION; +- } ++ ) external virtual; + + /// @inheritdoc IERC20 + function balanceOf(address user) public view virtual override returns (uint256) { +@@ -3056,3 +3184,47 @@ contract VariableDebtToken is DebtTokenBase, ScaledBalanceTokenBase, IVariableDe + return _underlyingAsset; + } + } ++ ++// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/instances/VariableDebtTokenInstance.sol ++ ++contract VariableDebtTokenInstance is VariableDebtToken { ++ uint256 public constant DEBT_TOKEN_REVISION = 1; ++ ++ constructor(IPool pool) VariableDebtToken(pool) {} ++ ++ /// @inheritdoc VersionedInitializable ++ function getRevision() internal pure virtual override returns (uint256) { ++ return DEBT_TOKEN_REVISION; ++ } ++ ++ /// @inheritdoc IInitializableDebtToken ++ function initialize( ++ IPool initializingPool, ++ address underlyingAsset, ++ IAaveIncentivesController incentivesController, ++ uint8 debtTokenDecimals, ++ string memory debtTokenName, ++ string memory debtTokenSymbol, ++ bytes calldata params ++ ) external override initializer { ++ require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); ++ _setName(debtTokenName); ++ _setSymbol(debtTokenSymbol); ++ _setDecimals(debtTokenDecimals); ++ ++ _underlyingAsset = underlyingAsset; ++ _incentivesController = incentivesController; ++ ++ _domainSeparator = _calculateDomainSeparator(); ++ ++ emit Initialized( ++ underlyingAsset, ++ address(POOL), ++ address(incentivesController), ++ debtTokenDecimals, ++ debtTokenName, ++ debtTokenSymbol, ++ params ++ ); ++ } ++} +``` diff --git a/diffs/ARBITRUM_LINEA/EMISSION_MANAGER_DIFF.md b/diffs/ARBITRUM_LINEA/EMISSION_MANAGER_DIFF.md new file mode 100644 index 00000000..6c294aca --- /dev/null +++ b/diffs/ARBITRUM_LINEA/EMISSION_MANAGER_DIFF.md @@ -0,0 +1,228 @@ +```diff +diff --git a/./downloads/ARBITRUM/EMISSION_MANAGER.sol b/./downloads/LINEA/EMISSION_MANAGER.sol +index be75e57..9de846c 100644 +--- a/./downloads/ARBITRUM/EMISSION_MANAGER.sol ++++ b/./downloads/LINEA/EMISSION_MANAGER.sol +@@ -1,7 +1,7 @@ +-// SPDX-License-Identifier: agpl-3.0 +-pragma solidity =0.8.10; ++// SPDX-License-Identifier: BUSL-1.1 ++pragma solidity ^0.8.10; + +-// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol ++// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol + + /* + * @dev Provides information about the current execution context, including the +@@ -24,7 +24,7 @@ abstract contract Context { + } + } + +-// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol ++// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol + + interface IEACAggregatorProxy { + function decimals() external view returns (uint8); +@@ -43,7 +43,7 @@ interface IEACAggregatorProxy { + event NewRound(uint256 indexed roundId, address indexed startedBy); + } + +-// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol ++// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsDistributor.sol + + /** + * @title IRewardsDistributor +@@ -89,16 +89,6 @@ interface IRewardsDistributor { + uint256 rewardsAccrued + ); + +- /** +- * @dev Emitted when the emission manager address is updated. +- * @param oldEmissionManager The address of the old emission manager +- * @param newEmissionManager The address of the new emission manager +- */ +- event EmissionManagerUpdated( +- address indexed oldEmissionManager, +- address indexed newEmissionManager +- ); +- + /** + * @dev Sets the end date for the distribution + * @param asset The asset to incentivize +@@ -154,6 +144,15 @@ interface IRewardsDistributor { + address reward + ) external view returns (uint256, uint256, uint256, uint256); + ++ /** ++ * @dev Calculates the next value of an specific distribution index, with validations. ++ * @param asset The incentivized asset ++ * @param reward The reward token of the incentivized asset ++ * @return The old index of the asset distribution ++ * @return The new index of the asset distribution ++ **/ ++ function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); ++ + /** + * @dev Returns the list of available reward token addresses of an incentivized asset + * @param asset The incentivized asset +@@ -211,16 +210,17 @@ interface IRewardsDistributor { + * @dev Returns the address of the emission manager + * @return The address of the EmissionManager + */ ++ function EMISSION_MANAGER() external view returns (address); ++ ++ /** ++ * @dev Returns the address of the emission manager. ++ * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. ++ * @return The address of the EmissionManager ++ */ + function getEmissionManager() external view returns (address); +- +- /** +- * @dev Updates the address of the emission manager +- * @param emissionManager The address of the new EmissionManager +- */ +- function setEmissionManager(address emissionManager) external; + } + +-// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol ++// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/ITransferStrategyBase.sol + + interface ITransferStrategyBase { + event EmergencyWithdrawal( +@@ -258,7 +258,7 @@ interface ITransferStrategyBase { + function emergencyWithdrawal(address token, address to, uint256 amount) external; + } + +-// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol ++// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol + + /** + * @dev Contract module which provides a basic access control mechanism, where +@@ -324,7 +324,7 @@ contract Ownable is Context { + } + } + +-// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol ++// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/libraries/RewardsDataTypes.sol + + library RewardsDataTypes { + struct RewardsConfigInput { +@@ -344,27 +344,38 @@ library RewardsDataTypes { + } + + struct UserData { +- uint104 index; // matches reward index ++ // Liquidity index of the reward distribution for the user ++ uint104 index; ++ // Amount of accrued rewards for the user since last user index update + uint128 accrued; + } + + struct RewardData { ++ // Liquidity index of the reward distribution + uint104 index; ++ // Amount of reward tokens distributed per second + uint88 emissionPerSecond; ++ // Timestamp of the last reward index update + uint32 lastUpdateTimestamp; ++ // The end of the distribution of rewards (in seconds) + uint32 distributionEnd; ++ // Map of user addresses and their rewards data (userAddress => userData) + mapping(address => UserData) usersData; + } + + struct AssetData { ++ // Map of reward token addresses and their data (rewardTokenAddress => rewardData) + mapping(address => RewardData) rewards; ++ // List of reward token addresses for the asset + mapping(uint128 => address) availableRewards; ++ // Count of reward tokens for the asset + uint128 availableRewardsCount; ++ // Number of decimals of the asset + uint8 decimals; + } + } + +-// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol ++// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsController.sol + + /** + * @title IRewardsController +@@ -470,12 +481,13 @@ interface IRewardsController is IRewardsDistributor { + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** +- * @dev Called by the corresponding asset on any update that affects the rewards distribution +- * @param user The address of the user +- * @param userBalance The user balance of the asset +- * @param totalSupply The total supply of the asset ++ * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. ++ * @dev The units of `totalSupply` and `userBalance` should be the same. ++ * @param user The address of the user whose asset balance has changed ++ * @param totalSupply The total supply of the asset prior to user balance change ++ * @param userBalance The previous user balance prior to balance change + **/ +- function handleAction(address user, uint256 userBalance, uint256 totalSupply) external; ++ function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + + /** + * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards +@@ -561,7 +573,7 @@ interface IRewardsController is IRewardsDistributor { + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + } + +-// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IEmissionManager.sol ++// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IEmissionManager.sol + + /** + * @title IEmissionManager +@@ -645,13 +657,6 @@ interface IEmissionManager { + */ + function setClaimer(address user, address claimer) external; + +- /** +- * @dev Updates the address of the emission manager +- * @dev Only callable by the owner of the EmissionManager +- * @param emissionManager The address of the new EmissionManager +- */ +- function setEmissionManager(address emissionManager) external; +- + /** + * @dev Updates the admin of the reward emission + * @dev Only callable by the owner of the EmissionManager +@@ -681,7 +686,7 @@ interface IEmissionManager { + function getEmissionAdmin(address reward) external view returns (address); + } + +-// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/EmissionManager.sol ++// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/EmissionManager.sol + + /** + * @title EmissionManager +@@ -704,11 +709,9 @@ contract EmissionManager is Ownable, IEmissionManager { + + /** + * Constructor. +- * @param controller The address of the RewardsController contract + * @param owner The address of the owner + */ +- constructor(address controller, address owner) { +- _rewardsController = IRewardsController(controller); ++ constructor(address owner) { + transferOwnership(owner); + } + +@@ -762,11 +765,6 @@ contract EmissionManager is Ownable, IEmissionManager { + _rewardsController.setClaimer(user, claimer); + } + +- /// @inheritdoc IEmissionManager +- function setEmissionManager(address emissionManager) external override onlyOwner { +- _rewardsController.setEmissionManager(emissionManager); +- } +- + /// @inheritdoc IEmissionManager + function setEmissionAdmin(address reward, address admin) external override onlyOwner { + address oldAdmin = _emissionAdmins[reward]; +``` diff --git a/diffs/ARBITRUM_LINEA/EMODE_LOGIC_DIFF.md b/diffs/ARBITRUM_LINEA/EMODE_LOGIC_DIFF.md new file mode 100644 index 00000000..4cf04f31 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/EMODE_LOGIC_DIFF.md @@ -0,0 +1,319 @@ +```diff +diff --git a/./downloads/ARBITRUM/EMODE_LOGIC.sol b/./downloads/LINEA/EMODE_LOGIC.sol +index 38363c8..948a894 100644 +--- a/./downloads/ARBITRUM/EMODE_LOGIC.sol ++++ b/./downloads/LINEA/EMODE_LOGIC.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 + pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + + // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +@@ -221,7 +221,7 @@ library Address { + } + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + + /* + * @dev Provides information about the current execution context, including the +@@ -244,7 +244,7 @@ abstract contract Context { + } + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + + /** + * @dev External interface of AccessControl declared to support ERC165 detection. +@@ -334,7 +334,7 @@ interface IAccessControl { + function renounceRole(bytes32 role, address account) external; + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -410,7 +410,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + + // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +@@ -666,7 +666,7 @@ library SafeCast { + } + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol + + /** + * @title IAaveIncentivesController +@@ -685,7 +685,7 @@ interface IAaveIncentivesController { + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider +@@ -912,7 +912,7 @@ interface IPoolAddressesProvider { + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol + + /** + * @title IPriceOracleGetter +@@ -942,7 +942,7 @@ interface IPriceOracleGetter { + function getAssetPrice(address asset) external view returns (uint256); + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol + + /** + * @title IScaledBalanceToken +@@ -1014,7 +1014,7 @@ interface IScaledBalanceToken { + function getPreviousIndex(address user) external view returns (uint256); + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -1117,7 +1117,7 @@ library Errors { + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + + /** + * @title PercentageMath library +@@ -1178,7 +1178,7 @@ library PercentageMath { + } + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + + /** + * @title WadRayMath library +@@ -1304,7 +1304,7 @@ library WadRayMath { + } + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { + /** +@@ -1628,7 +1628,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + + /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library + /// @author Gnosis Developers +@@ -1741,7 +1741,7 @@ library GPv2SafeERC20 { + } + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + + interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); +@@ -1751,7 +1751,7 @@ interface IERC20Detailed is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol + + /** + * @title IACLManager +@@ -1924,7 +1924,7 @@ interface IACLManager { + function isAssetListingAdmin(address admin) external view returns (bool); + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + + /** + * @title IPriceOracleSentinel +@@ -1989,7 +1989,7 @@ interface IPriceOracleSentinel { + function getGracePeriod() external view returns (uint256); + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + + /** + * @title IReserveInterestRateStrategy +@@ -2016,7 +2016,7 @@ interface IReserveInterestRateStrategy { + ) external view returns (uint256, uint256); + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol + + /** + * @title MathUtils library +@@ -2113,7 +2113,7 @@ library MathUtils { + } + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol + + /** + * @title IPool +@@ -2672,6 +2672,7 @@ interface IPool { + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 ++ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ +@@ -2943,7 +2944,7 @@ interface IPool { + function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + + /** + * @title ReserveConfiguration library +@@ -2958,6 +2959,7 @@ library ReserveConfiguration { + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore ++ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore +@@ -2966,7 +2968,7 @@ library ReserveConfiguration { + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +- //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory ++ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +@@ -3523,7 +3525,7 @@ library ReserveConfiguration { + } + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + + /** + * @title EModeConfiguration library +@@ -3572,7 +3574,7 @@ library EModeConfiguration { + } + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + + /** + * @title UserConfiguration library +@@ -3804,7 +3806,7 @@ library UserConfiguration { + } + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol + + /** + * @title IInitializableAToken +@@ -3857,7 +3859,7 @@ interface IInitializableAToken { + ) external; + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol + + /** + * @title IInitializableDebtToken +@@ -3906,7 +3908,7 @@ interface IInitializableDebtToken { + ) external; + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol + + /** + * @title IVariableDebtToken +@@ -3949,7 +3951,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol + + /** + * @title IAToken +@@ -4083,7 +4085,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + function rescueTokens(address token, address to, uint256 amount) external; + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + + /** + * @title IncentivizedERC20 +@@ -4306,7 +4308,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { + } + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + + /** + * @title ReserveLogic library +@@ -4607,7 +4609,7 @@ library ReserveLogic { + } + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + + /** + * @title GenericLogic library +@@ -4851,7 +4853,7 @@ library GenericLogic { + } + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + + /** + * @title ReserveLogic library +@@ -5471,7 +5473,7 @@ library ValidationLogic { + } + } + +-// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol ++// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + + /** + * @title EModeLogic library +``` diff --git a/diffs/ARBITRUM_LINEA/FLASHLOAN_LOGIC_DIFF.md b/diffs/ARBITRUM_LINEA/FLASHLOAN_LOGIC_DIFF.md new file mode 100644 index 00000000..320bbb60 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/FLASHLOAN_LOGIC_DIFF.md @@ -0,0 +1,364 @@ +```diff +diff --git a/./downloads/ARBITRUM/FLASHLOAN_LOGIC.sol b/./downloads/LINEA/FLASHLOAN_LOGIC.sol +index 35feed8..639a33a 100644 +--- a/./downloads/ARBITRUM/FLASHLOAN_LOGIC.sol ++++ b/./downloads/LINEA/FLASHLOAN_LOGIC.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 + pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + + // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +@@ -221,7 +221,7 @@ library Address { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + + /* + * @dev Provides information about the current execution context, including the +@@ -244,7 +244,7 @@ abstract contract Context { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + + /** + * @dev External interface of AccessControl declared to support ERC165 detection. +@@ -334,7 +334,7 @@ interface IAccessControl { + function renounceRole(bytes32 role, address account) external; + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -410,7 +410,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + + // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +@@ -666,7 +666,7 @@ library SafeCast { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol + + /** + * @title IAaveIncentivesController +@@ -685,7 +685,7 @@ interface IAaveIncentivesController { + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider +@@ -912,7 +912,7 @@ interface IPoolAddressesProvider { + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol + + /** + * @title IPriceOracleGetter +@@ -942,7 +942,7 @@ interface IPriceOracleGetter { + function getAssetPrice(address asset) external view returns (uint256); + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol + + /** + * @title IScaledBalanceToken +@@ -1014,7 +1014,7 @@ interface IScaledBalanceToken { + function getPreviousIndex(address user) external view returns (uint256); + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -1117,7 +1117,7 @@ library Errors { + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + + /** + * @title PercentageMath library +@@ -1178,7 +1178,7 @@ library PercentageMath { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + + /** + * @title WadRayMath library +@@ -1304,7 +1304,7 @@ library WadRayMath { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { + /** +@@ -1628,7 +1628,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + + /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library + /// @author Gnosis Developers +@@ -1741,7 +1741,7 @@ library GPv2SafeERC20 { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + + interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); +@@ -1751,7 +1751,7 @@ interface IERC20Detailed is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol + + /** + * @title IACLManager +@@ -1924,7 +1924,7 @@ interface IACLManager { + function isAssetListingAdmin(address admin) external view returns (bool); + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + + /** + * @title IPriceOracleSentinel +@@ -1989,7 +1989,7 @@ interface IPriceOracleSentinel { + function getGracePeriod() external view returns (uint256); + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + + /** + * @title IReserveInterestRateStrategy +@@ -2016,7 +2016,7 @@ interface IReserveInterestRateStrategy { + ) external view returns (uint256, uint256); + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol + + /** + * @title MathUtils library +@@ -2113,7 +2113,7 @@ library MathUtils { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol + + /** + * @title IPool +@@ -2672,6 +2672,7 @@ interface IPool { + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 ++ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ +@@ -2943,7 +2944,7 @@ interface IPool { + function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + + /** + * @title ReserveConfiguration library +@@ -2958,6 +2959,7 @@ library ReserveConfiguration { + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore ++ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore +@@ -2966,7 +2968,7 @@ library ReserveConfiguration { + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +- //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory ++ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +@@ -3523,7 +3525,7 @@ library ReserveConfiguration { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol + + /** + * @title IFlashLoanReceiver +@@ -3556,7 +3558,7 @@ interface IFlashLoanReceiver { + function POOL() external view returns (IPool); + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol + + /** + * @title IFlashLoanSimpleReceiver +@@ -3589,7 +3591,7 @@ interface IFlashLoanSimpleReceiver { + function POOL() external view returns (IPool); + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + + /** + * @title EModeConfiguration library +@@ -3638,7 +3640,7 @@ library EModeConfiguration { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + + /** + * @title UserConfiguration library +@@ -3870,7 +3872,7 @@ library UserConfiguration { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol + + /** + * @title IInitializableAToken +@@ -3923,7 +3925,7 @@ interface IInitializableAToken { + ) external; + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol + + /** + * @title IInitializableDebtToken +@@ -3972,7 +3974,7 @@ interface IInitializableDebtToken { + ) external; + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol + + /** + * @title IsolationModeLogic library +@@ -4031,7 +4033,7 @@ library IsolationModeLogic { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol + + /** + * @title IVariableDebtToken +@@ -4074,7 +4076,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol + + /** + * @title IAToken +@@ -4208,7 +4210,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + function rescueTokens(address token, address to, uint256 amount) external; + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + + /** + * @title IncentivizedERC20 +@@ -4431,7 +4433,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + + /** + * @title ReserveLogic library +@@ -4732,7 +4734,7 @@ library ReserveLogic { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + + /** + * @title EModeLogic library +@@ -4794,7 +4796,7 @@ library EModeLogic { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + + /** + * @title GenericLogic library +@@ -5038,7 +5040,7 @@ library GenericLogic { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + + /** + * @title ReserveLogic library +@@ -5658,7 +5660,7 @@ library ValidationLogic { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol + + /** + * @title BorrowLogic library +@@ -5880,7 +5882,7 @@ library BorrowLogic { + } + } + +-// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol ++// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol + + /** + * @title FlashLoanLogic library +``` diff --git a/diffs/ARBITRUM_LINEA/L2_ENCODER_DIFF.md b/diffs/ARBITRUM_LINEA/L2_ENCODER_DIFF.md new file mode 100644 index 00000000..30966a65 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/L2_ENCODER_DIFF.md @@ -0,0 +1,1197 @@ +```diff +diff --git a/./downloads/ARBITRUM/L2_ENCODER.sol b/./downloads/LINEA/L2_ENCODER.sol +index 9ab49b3..42a5580 100644 +--- a/./downloads/ARBITRUM/L2_ENCODER.sol ++++ b/./downloads/LINEA/L2_ENCODER.sol +@@ -1,7 +1,7 @@ +-// SPDX-License-Identifier: BUSL-1.1 +-pragma solidity =0.8.10; ++// SPDX-License-Identifier: MIT ++pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeCast.sol ++// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + + // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +@@ -257,13 +257,13 @@ library SafeCast { + } + } + +-// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. +- **/ ++ */ + interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. +@@ -358,7 +358,7 @@ interface IPoolAddressesProvider { + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id +- **/ ++ */ + function getMarketId() external view returns (string memory); + + /** +@@ -400,27 +400,27 @@ interface IPoolAddressesProvider { + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address +- **/ ++ */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation +- **/ ++ */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address +- **/ ++ */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation +- **/ ++ */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** +@@ -444,7 +444,7 @@ interface IPoolAddressesProvider { + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager +- **/ ++ */ + function setACLManager(address newAclManager) external; + + /** +@@ -468,7 +468,7 @@ interface IPoolAddressesProvider { + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel +- **/ ++ */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** +@@ -480,14 +480,18 @@ interface IPoolAddressesProvider { + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider +- **/ ++ */ + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { +- struct ReserveData { ++ /** ++ * This exists specifically to maintain the `getReserveData()` interface, since the new, internal ++ * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. ++ */ ++ struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray +@@ -498,7 +502,7 @@ library DataTypes { + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; +- //the current stable borrow rate. Expressed in ray ++ // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; +@@ -506,7 +510,7 @@ library DataTypes { + uint16 id; + //aToken address + address aTokenAddress; +- //stableDebtToken address ++ // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; +@@ -520,6 +524,43 @@ library DataTypes { + uint128 isolationModeTotalDebt; + } + ++ struct ReserveData { ++ //stores the reserve configuration ++ ReserveConfigurationMap configuration; ++ //the liquidity index. Expressed in ray ++ uint128 liquidityIndex; ++ //the current supply rate. Expressed in ray ++ uint128 currentLiquidityRate; ++ //variable borrow index. Expressed in ray ++ uint128 variableBorrowIndex; ++ //the current variable borrow rate. Expressed in ray ++ uint128 currentVariableBorrowRate; ++ // DEPRECATED on v3.2.0 ++ uint128 __deprecatedStableBorrowRate; ++ //timestamp of last update ++ uint40 lastUpdateTimestamp; ++ //the id of the reserve. Represents the position in the list of the active reserves ++ uint16 id; ++ //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed ++ uint40 liquidationGracePeriodUntil; ++ //aToken address ++ address aTokenAddress; ++ // DEPRECATED on v3.2.0 ++ address __deprecatedStableDebtTokenAddress; ++ //variableDebtToken address ++ address variableDebtTokenAddress; ++ //address of the interest rate strategy ++ address interestRateStrategyAddress; ++ //the current treasury balance, scaled ++ uint128 accruedToTreasury; ++ //the outstanding unbacked aTokens minted through the bridging feature ++ uint128 unbacked; ++ //the outstanding debt borrowed against this asset in isolation mode ++ uint128 isolationModeTotalDebt; ++ //the amount of underlying accounted for by the protocol ++ uint128 virtualUnderlyingBalance; ++ } ++ + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold +@@ -528,18 +569,20 @@ library DataTypes { + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled +- //bit 59: stable rate borrowing enabled ++ //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled +- //bit 62-63: reserved ++ //bit 62: siloed borrowing enabled ++ //bit 63: flashloaning enabled + //bit 64-79: reserve factor +- //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap +- //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap +- //bit 152-167 liquidation protocol fee +- //bit 168-175 eMode category +- //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled +- //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals +- //bit 252-255 unused ++ //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap ++ //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap ++ //bit 152-167: liquidation protocol fee ++ //bit 168-175: DEPRECATED: eMode category ++ //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled ++ //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals ++ //bit 252: virtual accounting is enabled for the reserve ++ //bit 253-255 unused + + uint256 data; + } +@@ -553,30 +596,49 @@ library DataTypes { + uint256 data; + } + +- struct EModeCategory { ++ // DEPRECATED: kept for backwards compatibility, might be removed in a future version ++ struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; +- // each eMode category may or may not have a custom oracle to override the individual assets price oracles ++ // DEPRECATED + address priceSource; + string label; + } + ++ struct CollateralConfig { ++ uint16 ltv; ++ uint16 liquidationThreshold; ++ uint16 liquidationBonus; ++ } ++ ++ struct EModeCategoryBaseConfiguration { ++ uint16 ltv; ++ uint16 liquidationThreshold; ++ uint16 liquidationBonus; ++ string label; ++ } ++ ++ struct EModeCategory { ++ // each eMode category has a custom ltv and liquidation threshold ++ uint16 ltv; ++ uint16 liquidationThreshold; ++ uint16 liquidationBonus; ++ uint128 collateralBitmap; ++ string label; ++ uint128 borrowableBitmap; ++ } ++ + enum InterestRateMode { + NONE, +- STABLE, ++ __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; +- uint256 currPrincipalStableDebt; +- uint256 currAvgStableBorrowRate; +- uint256 currTotalStableDebt; +- uint256 nextAvgStableBorrowRate; +- uint256 nextTotalStableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; +@@ -586,10 +648,8 @@ library DataTypes { + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; +- address stableDebtTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; +- uint40 stableDebtLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { +@@ -619,7 +679,6 @@ library DataTypes { + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; +- uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; +@@ -671,9 +730,9 @@ library DataTypes { + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; +- uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address addressesProvider; ++ address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } +@@ -712,7 +771,6 @@ library DataTypes { + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; +- uint256 maxStableLoanPercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; +@@ -733,18 +791,16 @@ library DataTypes { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; +- uint256 totalStableDebt; +- uint256 totalVariableDebt; +- uint256 averageStableBorrowRate; ++ uint256 totalDebt; + uint256 reserveFactor; + address reserve; +- address aToken; ++ bool usingVirtualBalance; ++ uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; +- address stableDebtAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; +@@ -752,13 +808,13 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPool.sol ++// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPool.sol + + /** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. +- **/ ++ */ + interface IPool { + /** + * @dev Emitted on mintUnbacked() +@@ -767,7 +823,7 @@ interface IPool { + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used +- **/ ++ */ + event MintUnbacked( + address indexed reserve, + address user, +@@ -782,7 +838,7 @@ interface IPool { + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees +- **/ ++ */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** +@@ -792,7 +848,7 @@ interface IPool { + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used +- **/ ++ */ + event Supply( + address indexed reserve, + address user, +@@ -807,7 +863,7 @@ interface IPool { + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn +- **/ ++ */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** +@@ -817,10 +873,10 @@ interface IPool { + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out +- * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable ++ * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used +- **/ ++ */ + event Borrow( + address indexed reserve, + address user, +@@ -838,7 +894,7 @@ interface IPool { + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly +- **/ ++ */ + event Repay( + address indexed reserve, + address indexed user, +@@ -847,18 +903,6 @@ interface IPool { + bool useATokens + ); + +- /** +- * @dev Emitted on swapBorrowRateMode() +- * @param reserve The address of the underlying asset of the reserve +- * @param user The address of the user swapping his rate mode +- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable +- **/ +- event SwapBorrowRateMode( +- address indexed reserve, +- address indexed user, +- DataTypes.InterestRateMode interestRateMode +- ); +- + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve +@@ -870,40 +914,34 @@ interface IPool { + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id +- **/ ++ */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral +- **/ ++ */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral +- **/ ++ */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + +- /** +- * @dev Emitted on rebalanceStableBorrowRate() +- * @param reserve The address of the underlying asset of the reserve +- * @param user The address of the user for which the rebalance has been executed +- **/ +- event RebalanceStableBorrowRate(address indexed reserve, address indexed user); +- + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed +- * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt ++ * @param interestRateMode The flashloan mode: 0 for regular flashloan, ++ * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used +- **/ ++ */ + event FlashLoan( + address indexed target, + address initiator, +@@ -924,7 +962,7 @@ interface IPool { + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly +- **/ ++ */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, +@@ -939,11 +977,11 @@ interface IPool { + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate +- * @param stableBorrowRate The next stable borrow rate ++ * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index +- **/ ++ */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, +@@ -957,17 +995,17 @@ interface IPool { + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury +- **/ ++ */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** +- * @dev Mints an `amount` of aTokens to the `onBehalfOf` ++ * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man +- **/ ++ */ + function mintUnbacked( + address asset, + uint256 amount, +@@ -976,12 +1014,13 @@ interface IPool { + ) external; + + /** +- * @dev Back the current unbacked underlying with `amount` and pay `fee`. ++ * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees +- **/ +- function backUnbacked(address asset, uint256 amount, uint256 fee) external; ++ * @return The backed amount ++ */ ++ function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. +@@ -993,7 +1032,7 @@ interface IPool { + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man +- **/ ++ */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** +@@ -1010,7 +1049,7 @@ interface IPool { + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig +- **/ ++ */ + function supplyWithPermit( + address asset, + uint256 amount, +@@ -1032,24 +1071,23 @@ interface IPool { + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn +- **/ ++ */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower +- * already supplied enough collateral, or he was given enough allowance by a credit delegator on the +- * corresponding debt token (StableDebtToken or VariableDebtToken) ++ * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet +- * and 100 stable/variable debt tokens, depending on the `interestRateMode` ++ * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed +- * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable ++ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance +- **/ ++ */ + function borrow( + address asset, + uint256 amount, +@@ -1060,16 +1098,16 @@ interface IPool { + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned +- * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address ++ * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid +- **/ ++ */ + function repay( + address asset, + uint256 amount, +@@ -1083,7 +1121,7 @@ interface IPool { + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed +@@ -1092,7 +1130,7 @@ interface IPool { + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid +- **/ ++ */ + function repayWithPermit( + address asset, + uint256 amount, +@@ -1107,44 +1145,26 @@ interface IPool { + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens +- * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens ++ * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid +- **/ ++ */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + +- /** +- * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa +- * @param asset The address of the underlying asset borrowed +- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable +- **/ +- function swapBorrowRateMode(address asset, uint256 interestRateMode) external; +- +- /** +- * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. +- * - Users can be rebalanced if the following conditions are satisfied: +- * 1. Usage ratio is above 95% +- * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too +- * much has been borrowed at a stable rate and suppliers are not earning enough +- * @param asset The address of the underlying asset borrowed +- * @param user The address of the user to be rebalanced +- **/ +- function rebalanceStableBorrowRate(address asset, address user) external; +- + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise +- **/ ++ */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** +@@ -1157,7 +1177,7 @@ interface IPool { + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly +- **/ ++ */ + function liquidationCall( + address collateralAsset, + address debtAsset, +@@ -1170,19 +1190,19 @@ interface IPool { + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept +- * into consideration. For further details please visit https://developers.aave.com ++ * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver +- * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address ++ * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address +- * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 ++ * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man +- **/ ++ */ + function flashLoan( + address receiverAddress, + address[] calldata assets, +@@ -1197,14 +1217,14 @@ interface IPool { + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept +- * into consideration. For further details please visit https://developers.aave.com ++ * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man +- **/ ++ */ + function flashLoanSimple( + address receiverAddress, + address asset, +@@ -1222,7 +1242,7 @@ interface IPool { + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user +- **/ ++ */ + function getUserAccountData( + address user + ) +@@ -1243,14 +1263,12 @@ interface IPool { + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve +- * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract +- **/ ++ */ + function initReserve( + address asset, + address aTokenAddress, +- address stableDebtAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; +@@ -1258,8 +1276,9 @@ interface IPool { + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract ++ * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve +- **/ ++ */ + function dropReserve(address asset) external; + + /** +@@ -1267,18 +1286,34 @@ interface IPool { + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract +- **/ ++ */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + ++ /** ++ * @notice Accumulates interest to all indexes of the reserve ++ * @dev Only callable by the PoolConfigurator contract ++ * @dev To be used when required by the configurator, for example when updating interest rates strategy data ++ * @param asset The address of the underlying asset of the reserve ++ */ ++ function syncIndexesState(address asset) external; ++ ++ /** ++ * @notice Updates interest rates on the reserve data ++ * @dev Only callable by the PoolConfigurator contract ++ * @dev To be used when required by the configurator, for example when updating interest rates strategy data ++ * @param asset The address of the underlying asset of the reserve ++ */ ++ function syncRatesState(address asset) external; ++ + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap +- **/ ++ */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration +@@ -1288,7 +1323,7 @@ interface IPool { + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve +- **/ ++ */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); +@@ -1297,13 +1332,13 @@ interface IPool { + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user +- **/ ++ */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** +- * @notice Returns the normalized income normalized income of the reserve ++ * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ +@@ -1311,6 +1346,13 @@ interface IPool { + + /** + * @notice Returns the normalized variable debt per unit of asset ++ * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a ++ * "dynamic" variable index based on time, current stored index and virtual rate at the current ++ * moment (approx. a borrower would get if opening a position). This means that is always used in ++ * combination with variable debt supply/balances. ++ * If using this function externally, consider that is possible to have an increasing normalized ++ * variable debt that is not equivalent to how the variable debt index would be updated in storage ++ * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ +@@ -1320,8 +1362,25 @@ interface IPool { + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve +- **/ +- function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); ++ */ ++ function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); ++ ++ /** ++ * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 ++ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) ++ * @param asset The address of the underlying asset of the reserve ++ * @return The state and configuration data of the reserve with virtual accounting ++ */ ++ function getReserveDataExtended( ++ address asset ++ ) external view returns (DataTypes.ReserveData memory); ++ ++ /** ++ * @notice Returns the virtual underlying balance of the reserve ++ * @param asset The address of the underlying asset of the reserve ++ * @return The reserve virtual underlying balance ++ */ ++ function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer +@@ -1346,20 +1405,27 @@ interface IPool { + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves +- **/ ++ */ + function getReservesList() external view returns (address[] memory); + ++ /** ++ * @notice Returns the number of initialized reserves ++ * @dev It includes dropped reserves ++ * @return The count ++ */ ++ function getReservesCount() external view returns (uint256); ++ + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id +- **/ ++ */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider +- **/ ++ */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** +@@ -1384,20 +1450,70 @@ interface IPool { + ) external; + + /** +- * @notice Configures a new category for the eMode. ++ * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ +- function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; ++ function configureEModeCategory( ++ uint8 id, ++ DataTypes.EModeCategoryBaseConfiguration memory config ++ ) external; ++ ++ /** ++ * @notice Replaces the current eMode collateralBitmap. ++ * @param id The id of the category ++ * @param collateralBitmap The collateralBitmap of the category ++ */ ++ function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; ++ ++ /** ++ * @notice Replaces the current eMode borrowableBitmap. ++ * @param id The id of the category ++ * @param borrowableBitmap The borrowableBitmap of the category ++ */ ++ function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category ++ * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ +- function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); ++ function getEModeCategoryData( ++ uint8 id ++ ) external view returns (DataTypes.EModeCategoryLegacy memory); ++ ++ /** ++ * @notice Returns the label of an eMode category ++ * @param id The id of the category ++ * @return The label of the category ++ */ ++ function getEModeCategoryLabel(uint8 id) external view returns (string memory); ++ ++ /** ++ * @notice Returns the collateral config of an eMode category ++ * @param id The id of the category ++ * @return The ltv,lt,lb of the category ++ */ ++ function getEModeCategoryCollateralConfig( ++ uint8 id ++ ) external view returns (DataTypes.CollateralConfig memory); ++ ++ /** ++ * @notice Returns the collateralBitmap of an eMode category ++ * @param id The id of the category ++ * @return The collateralBitmap of the category ++ */ ++ function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); ++ ++ /** ++ * @notice Returns the borrowableBitmap of an eMode category ++ * @param id The id of the category ++ * @return The borrowableBitmap of the category ++ */ ++ function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode +@@ -1420,10 +1536,20 @@ interface IPool { + function resetIsolationModeTotalDebt(address asset) external; + + /** +- * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate +- * @return The percentage of available liquidity to borrow, expressed in bps +- */ +- function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); ++ * @notice Sets the liquidation grace period of the given asset ++ * @dev To enable a liquidation grace period, a timestamp in the future should be set, ++ * To disable a liquidation grace period, any timestamp in the past works, like 0 ++ * @param asset The address of the underlying asset to set the liquidationGracePeriod ++ * @param until Timestamp when the liquidation grace period will end ++ **/ ++ function setLiquidationGracePeriod(address asset, uint40 until) external; ++ ++ /** ++ * @notice Returns the liquidation grace period of the given asset ++ * @param asset The address of the underlying asset ++ * @return Timestamp when the liquidation grace period will end ++ **/ ++ function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans +@@ -1452,7 +1578,7 @@ interface IPool { + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed +- **/ ++ */ + function mintToTreasury(address[] calldata assets) external; + + /** +@@ -1474,11 +1600,46 @@ interface IPool { + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man +- **/ ++ */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; ++ ++ /** ++ * @notice Gets the address of the external FlashLoanLogic ++ */ ++ function getFlashLoanLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external BorrowLogic ++ */ ++ function getBorrowLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external BridgeLogic ++ */ ++ function getBridgeLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external EModeLogic ++ */ ++ function getEModeLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external LiquidationLogic ++ */ ++ function getLiquidationLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external PoolLogic ++ */ ++ function getPoolLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external SupplyLogic ++ */ ++ function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/L2Encoder.sol ++// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/helpers/L2Encoder.sol + + /** + * @title L2Encoder +@@ -1512,7 +1673,7 @@ contract L2Encoder { + uint256 amount, + uint16 referralCode + ) external view returns (bytes32) { +- DataTypes.ReserveData memory data = POOL.getReserveData(asset); ++ DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount.toUint128(); +@@ -1548,7 +1709,7 @@ contract L2Encoder { + bytes32 permitR, + bytes32 permitS + ) external view returns (bytes32, bytes32, bytes32) { +- DataTypes.ReserveData memory data = POOL.getReserveData(asset); ++ DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount.toUint128(); +@@ -1576,7 +1737,7 @@ contract L2Encoder { + * @return compact representation of withdraw parameters + */ + function encodeWithdrawParams(address asset, uint256 amount) external view returns (bytes32) { +- DataTypes.ReserveData memory data = POOL.getReserveData(asset); ++ DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); +@@ -1593,7 +1754,7 @@ contract L2Encoder { + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed +- * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable ++ * @param interestRateMode The interest rate mode at which the user wants to borrow: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @return compact representation of withdraw parameters +@@ -1604,7 +1765,7 @@ contract L2Encoder { + uint256 interestRateMode, + uint16 referralCode + ) external view returns (bytes32) { +- DataTypes.ReserveData memory data = POOL.getReserveData(asset); ++ DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount.toUint128(); +@@ -1628,7 +1789,7 @@ contract L2Encoder { + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `interestRateMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @return compact representation of repay parameters + */ + function encodeRepayParams( +@@ -1636,7 +1797,7 @@ contract L2Encoder { + uint256 amount, + uint256 interestRateMode + ) public view returns (bytes32) { +- DataTypes.ReserveData memory data = POOL.getReserveData(asset); ++ DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); +@@ -1655,7 +1816,7 @@ contract L2Encoder { + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig +@@ -1673,7 +1834,7 @@ contract L2Encoder { + bytes32 permitR, + bytes32 permitS + ) external view returns (bytes32, bytes32, bytes32) { +- DataTypes.ReserveData memory data = POOL.getReserveData(asset); ++ DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); +@@ -1701,7 +1862,7 @@ contract L2Encoder { + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @return compact representation of repay with aToken parameters + */ + function encodeRepayWithATokensParams( +@@ -1712,46 +1873,6 @@ contract L2Encoder { + return encodeRepayParams(asset, amount, interestRateMode); + } + +- /** +- * @notice Encodes swap borrow rate mode parameters from standard input to compact representation of 1 bytes32 +- * @param asset The address of the underlying asset borrowed +- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable +- * @return compact representation of swap borrow rate mode parameters +- */ +- function encodeSwapBorrowRateMode( +- address asset, +- uint256 interestRateMode +- ) external view returns (bytes32) { +- DataTypes.ReserveData memory data = POOL.getReserveData(asset); +- uint16 assetId = data.id; +- uint8 shortenedInterestRateMode = interestRateMode.toUint8(); +- bytes32 res; +- assembly { +- res := add(assetId, shl(16, shortenedInterestRateMode)) +- } +- return res; +- } +- +- /** +- * @notice Encodes rebalance stable borrow rate parameters from standard input to compact representation of 1 bytes32 +- * @param asset The address of the underlying asset borrowed +- * @param user The address of the user to be rebalanced +- * @return compact representation of rebalance stable borrow rate parameters +- */ +- function encodeRebalanceStableBorrowRate( +- address asset, +- address user +- ) external view returns (bytes32) { +- DataTypes.ReserveData memory data = POOL.getReserveData(asset); +- uint16 assetId = data.id; +- +- bytes32 res; +- assembly { +- res := add(assetId, shl(16, user)) +- } +- return res; +- } +- + /** + * @notice Encodes set user use reserve as collateral parameters from standard input to compact representation of 1 bytes32 + * @param asset The address of the underlying asset borrowed +@@ -1762,7 +1883,7 @@ contract L2Encoder { + address asset, + bool useAsCollateral + ) external view returns (bytes32) { +- DataTypes.ReserveData memory data = POOL.getReserveData(asset); ++ DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + uint16 assetId = data.id; + bytes32 res; + assembly { +@@ -1789,10 +1910,10 @@ contract L2Encoder { + uint256 debtToCover, + bool receiveAToken + ) external view returns (bytes32, bytes32) { +- DataTypes.ReserveData memory collateralData = POOL.getReserveData(collateralAsset); ++ DataTypes.ReserveDataLegacy memory collateralData = POOL.getReserveData(collateralAsset); + uint16 collateralAssetId = collateralData.id; + +- DataTypes.ReserveData memory debtData = POOL.getReserveData(debtAsset); ++ DataTypes.ReserveDataLegacy memory debtData = POOL.getReserveData(debtAsset); + uint16 debtAssetId = debtData.id; + + uint128 shortenedDebtToCover = debtToCover == type(uint256).max +``` diff --git a/diffs/ARBITRUM_LINEA/L2_POOL_IMPL_DIFF.md b/diffs/ARBITRUM_LINEA/L2_POOL_IMPL_DIFF.md new file mode 100644 index 00000000..9f565d5f --- /dev/null +++ b/diffs/ARBITRUM_LINEA/L2_POOL_IMPL_DIFF.md @@ -0,0 +1,465 @@ +```diff +diff --git a/./downloads/ARBITRUM/L2_POOL_IMPL.sol b/./downloads/LINEA/L2_POOL_IMPL.sol +index 50a2a4d..8f4817d 100644 +--- a/./downloads/ARBITRUM/L2_POOL_IMPL.sol ++++ b/./downloads/LINEA/L2_POOL_IMPL.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 + pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol + + // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +@@ -221,7 +221,7 @@ library Address { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol + + /* + * @dev Provides information about the current execution context, including the +@@ -244,7 +244,7 @@ abstract contract Context { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + + /** + * @dev External interface of AccessControl declared to support ERC165 detection. +@@ -334,7 +334,7 @@ interface IAccessControl { + function renounceRole(bytes32 role, address account) external; + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -410,7 +410,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + + // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +@@ -666,7 +666,7 @@ library SafeCast { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAaveIncentivesController.sol + + /** + * @title IAaveIncentivesController +@@ -685,7 +685,7 @@ interface IAaveIncentivesController { + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IL2Pool.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IL2Pool.sol + + /** + * @title IL2Pool +@@ -801,7 +801,7 @@ interface IL2Pool { + function liquidationCall(bytes32 args1, bytes32 args2) external; + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider +@@ -1028,7 +1028,7 @@ interface IPoolAddressesProvider { + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleGetter.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleGetter.sol + + /** + * @title IPriceOracleGetter +@@ -1058,7 +1058,7 @@ interface IPriceOracleGetter { + function getAssetPrice(address asset) external view returns (uint256); + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IScaledBalanceToken.sol + + /** + * @title IScaledBalanceToken +@@ -1130,7 +1130,7 @@ interface IScaledBalanceToken { + function getPreviousIndex(address user) external view returns (uint256); + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol + + /** + * @title VersionedInitializable +@@ -1207,7 +1207,7 @@ abstract contract VersionedInitializable { + uint256[50] private ______gap; + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -1310,7 +1310,7 @@ library Errors { + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/CalldataLogic.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/CalldataLogic.sol + + /** + * @title CalldataLogic library +@@ -1543,7 +1543,7 @@ library CalldataLogic { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/PercentageMath.sol + + /** + * @title PercentageMath library +@@ -1604,7 +1604,7 @@ library PercentageMath { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/WadRayMath.sol + + /** + * @title WadRayMath library +@@ -1730,7 +1730,7 @@ library WadRayMath { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { + /** +@@ -2054,7 +2054,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + + /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library + /// @author Gnosis Developers +@@ -2167,7 +2167,7 @@ library GPv2SafeERC20 { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + + interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); +@@ -2177,7 +2177,7 @@ interface IERC20Detailed is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IACLManager.sol + + /** + * @title IACLManager +@@ -2350,7 +2350,7 @@ interface IACLManager { + function isAssetListingAdmin(address admin) external view returns (bool); + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IERC20WithPermit.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IERC20WithPermit.sol + + /** + * @title IERC20WithPermit +@@ -2381,7 +2381,7 @@ interface IERC20WithPermit is IERC20 { + ) external; + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleSentinel.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleSentinel.sol + + /** + * @title IPriceOracleSentinel +@@ -2446,7 +2446,7 @@ interface IPriceOracleSentinel { + function getGracePeriod() external view returns (uint256); + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol + + /** + * @title IReserveInterestRateStrategy +@@ -2473,7 +2473,7 @@ interface IReserveInterestRateStrategy { + ) external view returns (uint256, uint256); + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/MathUtils.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/MathUtils.sol + + /** + * @title MathUtils library +@@ -2570,7 +2570,7 @@ library MathUtils { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPool.sol + + /** + * @title IPool +@@ -3401,7 +3401,7 @@ interface IPool { + function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + + /** + * @title ReserveConfiguration library +@@ -3982,7 +3982,7 @@ library ReserveConfiguration { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol + + /** + * @title IFlashLoanReceiver +@@ -4015,7 +4015,7 @@ interface IFlashLoanReceiver { + function POOL() external view returns (IPool); + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol + + /** + * @title IFlashLoanSimpleReceiver +@@ -4048,7 +4048,7 @@ interface IFlashLoanSimpleReceiver { + function POOL() external view returns (IPool); + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + + /** + * @title EModeConfiguration library +@@ -4097,7 +4097,7 @@ library EModeConfiguration { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + + /** + * @title UserConfiguration library +@@ -4329,7 +4329,7 @@ library UserConfiguration { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableAToken.sol + + /** + * @title IInitializableAToken +@@ -4382,7 +4382,7 @@ interface IInitializableAToken { + ) external; + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableDebtToken.sol + + /** + * @title IInitializableDebtToken +@@ -4431,7 +4431,7 @@ interface IInitializableDebtToken { + ) external; + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol + + /** + * @title IsolationModeLogic library +@@ -4490,7 +4490,7 @@ library IsolationModeLogic { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IVariableDebtToken.sol + + /** + * @title IVariableDebtToken +@@ -4533,7 +4533,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAToken.sol + + /** + * @title IAToken +@@ -4667,7 +4667,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + function rescueTokens(address token, address to, uint256 amount) external; + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + + /** + * @title IncentivizedERC20 +@@ -4890,7 +4890,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ReserveLogic.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ReserveLogic.sol + + /** + * @title ReserveLogic library +@@ -5191,7 +5191,7 @@ library ReserveLogic { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/PoolStorage.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/PoolStorage.sol + + /** + * @title PoolStorage +@@ -5237,7 +5237,7 @@ contract PoolStorage { + uint16 internal _reservesCount; + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/EModeLogic.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/EModeLogic.sol + + /** + * @title EModeLogic library +@@ -5299,7 +5299,7 @@ library EModeLogic { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/GenericLogic.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/GenericLogic.sol + + /** + * @title GenericLogic library +@@ -5543,7 +5543,7 @@ library GenericLogic { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ValidationLogic.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ValidationLogic.sol + + /** + * @title ReserveLogic library +@@ -6163,7 +6163,7 @@ library ValidationLogic { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BridgeLogic.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BridgeLogic.sol + + library BridgeLogic { + using ReserveLogic for DataTypes.ReserveCache; +@@ -6300,7 +6300,7 @@ library BridgeLogic { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/PoolLogic.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/PoolLogic.sol + + /** + * @title PoolLogic library +@@ -6489,7 +6489,7 @@ library PoolLogic { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/SupplyLogic.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/SupplyLogic.sol + + /** + * @title SupplyLogic library +@@ -6777,7 +6777,7 @@ library SupplyLogic { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BorrowLogic.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BorrowLogic.sol + + /** + * @title BorrowLogic library +@@ -6999,7 +6999,7 @@ library BorrowLogic { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/LiquidationLogic.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/LiquidationLogic.sol + + /** + * @title LiquidationLogic library +@@ -7442,7 +7442,7 @@ library LiquidationLogic { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol + + /** + * @title FlashLoanLogic library +@@ -7702,7 +7702,7 @@ library FlashLoanLogic { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/Pool.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/Pool.sol + + /** + * @title Pool contract +@@ -8137,7 +8137,7 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { + res.isolationModeTotalDebt = reserve.isolationModeTotalDebt; + // This is a temporary workaround for integrations that are broken by Aave 3.2 + // While the new pool data provider is backward compatible, some integrations hard-code an old implementation +- // To allow them to unlock the funds, the pool address provider is setting a stable debt token, so balanceOf() and totalSupply() will return zero instead of reverting ++ // To allow them to not have any infrastructural blocker, a mock must be configured in the Aave Pool Addresses Provider, returning zero on all required view methods, instead of reverting + res.stableDebtTokenAddress = ADDRESSES_PROVIDER.getAddress(bytes32('MOCK_STABLE_DEBT')); + return res; + } +@@ -8555,7 +8555,7 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/PoolInstance.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/PoolInstance.sol + + contract PoolInstance is Pool { + uint256 public constant POOL_REVISION = 6; +@@ -8578,7 +8578,7 @@ contract PoolInstance is Pool { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/L2Pool.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/L2Pool.sol + + /** + * @title L2Pool +@@ -8675,7 +8675,7 @@ abstract contract L2Pool is Pool, IL2Pool { + } + } + +-// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/L2PoolInstance.sol ++// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/L2PoolInstance.sol + + contract L2PoolInstance is L2Pool, PoolInstance { + constructor(IPoolAddressesProvider provider) PoolInstance(provider) {} +``` diff --git a/diffs/ARBITRUM_LINEA/LIQUIDATION_LOGIC_DIFF.md b/diffs/ARBITRUM_LINEA/LIQUIDATION_LOGIC_DIFF.md new file mode 100644 index 00000000..d8b6009e --- /dev/null +++ b/diffs/ARBITRUM_LINEA/LIQUIDATION_LOGIC_DIFF.md @@ -0,0 +1,337 @@ +```diff +diff --git a/./downloads/ARBITRUM/LIQUIDATION_LOGIC.sol b/./downloads/LINEA/LIQUIDATION_LOGIC.sol +index 7169fb3..00aebcf 100644 +--- a/./downloads/ARBITRUM/LIQUIDATION_LOGIC.sol ++++ b/./downloads/LINEA/LIQUIDATION_LOGIC.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 + pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + + // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +@@ -221,7 +221,7 @@ library Address { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + + /* + * @dev Provides information about the current execution context, including the +@@ -244,7 +244,7 @@ abstract contract Context { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + + /** + * @dev External interface of AccessControl declared to support ERC165 detection. +@@ -334,7 +334,7 @@ interface IAccessControl { + function renounceRole(bytes32 role, address account) external; + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -410,7 +410,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + + // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +@@ -666,7 +666,7 @@ library SafeCast { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol + + /** + * @title IAaveIncentivesController +@@ -685,7 +685,7 @@ interface IAaveIncentivesController { + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider +@@ -912,7 +912,7 @@ interface IPoolAddressesProvider { + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol + + /** + * @title IPriceOracleGetter +@@ -942,7 +942,7 @@ interface IPriceOracleGetter { + function getAssetPrice(address asset) external view returns (uint256); + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol + + /** + * @title IScaledBalanceToken +@@ -1014,7 +1014,7 @@ interface IScaledBalanceToken { + function getPreviousIndex(address user) external view returns (uint256); + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -1117,7 +1117,7 @@ library Errors { + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + + /** + * @title PercentageMath library +@@ -1178,7 +1178,7 @@ library PercentageMath { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + + /** + * @title WadRayMath library +@@ -1304,7 +1304,7 @@ library WadRayMath { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { + /** +@@ -1628,7 +1628,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + + /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library + /// @author Gnosis Developers +@@ -1741,7 +1741,7 @@ library GPv2SafeERC20 { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + + interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); +@@ -1751,7 +1751,7 @@ interface IERC20Detailed is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol + + /** + * @title IACLManager +@@ -1924,7 +1924,7 @@ interface IACLManager { + function isAssetListingAdmin(address admin) external view returns (bool); + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + + /** + * @title IPriceOracleSentinel +@@ -1989,7 +1989,7 @@ interface IPriceOracleSentinel { + function getGracePeriod() external view returns (uint256); + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + + /** + * @title IReserveInterestRateStrategy +@@ -2016,7 +2016,7 @@ interface IReserveInterestRateStrategy { + ) external view returns (uint256, uint256); + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol + + /** + * @title MathUtils library +@@ -2113,7 +2113,7 @@ library MathUtils { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol + + /** + * @title IPool +@@ -2672,6 +2672,7 @@ interface IPool { + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 ++ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ +@@ -2943,7 +2944,7 @@ interface IPool { + function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + + /** + * @title ReserveConfiguration library +@@ -2958,6 +2959,7 @@ library ReserveConfiguration { + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore ++ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore +@@ -2966,7 +2968,7 @@ library ReserveConfiguration { + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +- //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory ++ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +@@ -3523,7 +3525,7 @@ library ReserveConfiguration { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + + /** + * @title EModeConfiguration library +@@ -3572,7 +3574,7 @@ library EModeConfiguration { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + + /** + * @title UserConfiguration library +@@ -3804,7 +3806,7 @@ library UserConfiguration { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol + + /** + * @title IInitializableAToken +@@ -3857,7 +3859,7 @@ interface IInitializableAToken { + ) external; + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol + + /** + * @title IInitializableDebtToken +@@ -3906,7 +3908,7 @@ interface IInitializableDebtToken { + ) external; + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol + + /** + * @title IsolationModeLogic library +@@ -3965,7 +3967,7 @@ library IsolationModeLogic { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol + + /** + * @title IVariableDebtToken +@@ -4008,7 +4010,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol + + /** + * @title IAToken +@@ -4142,7 +4144,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + function rescueTokens(address token, address to, uint256 amount) external; + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + + /** + * @title IncentivizedERC20 +@@ -4365,7 +4367,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + + /** + * @title ReserveLogic library +@@ -4666,7 +4668,7 @@ library ReserveLogic { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + + /** + * @title EModeLogic library +@@ -4728,7 +4730,7 @@ library EModeLogic { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + + /** + * @title GenericLogic library +@@ -4972,7 +4974,7 @@ library GenericLogic { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + + /** + * @title ReserveLogic library +@@ -5592,7 +5594,7 @@ library ValidationLogic { + } + } + +-// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol ++// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol + + /** + * @title LiquidationLogic library +``` diff --git a/diffs/ARBITRUM_LINEA/ORACLE_DIFF.md b/diffs/ARBITRUM_LINEA/ORACLE_DIFF.md new file mode 100644 index 00000000..a34261f6 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/ORACLE_DIFF.md @@ -0,0 +1,253 @@ +```diff +diff --git a/./downloads/ARBITRUM/ORACLE.sol b/./downloads/LINEA/ORACLE.sol +index 4729969..9828b58 100644 +--- a/./downloads/ARBITRUM/ORACLE.sol ++++ b/./downloads/LINEA/ORACLE.sol +@@ -1,7 +1,7 @@ +-// SPDX-License-Identifier: BUSL-1.1 +-pragma solidity =0.8.10 ^0.8.0; ++// SPDX-License-Identifier: MIT ++pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol ++// downloads/LINEA/ORACLE/AaveOracle/src/contracts/dependencies/chainlink/AggregatorInterface.sol + + // Chainlink Contracts v0.8 + +@@ -21,13 +21,13 @@ interface AggregatorInterface { + event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); + } + +-// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. +- **/ ++ */ + interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. +@@ -122,7 +122,7 @@ interface IPoolAddressesProvider { + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id +- **/ ++ */ + function getMarketId() external view returns (string memory); + + /** +@@ -164,27 +164,27 @@ interface IPoolAddressesProvider { + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address +- **/ ++ */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation +- **/ ++ */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address +- **/ ++ */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation +- **/ ++ */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** +@@ -208,7 +208,7 @@ interface IPoolAddressesProvider { + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager +- **/ ++ */ + function setACLManager(address newAclManager) external; + + /** +@@ -232,7 +232,7 @@ interface IPoolAddressesProvider { + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel +- **/ ++ */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** +@@ -244,41 +244,41 @@ interface IPoolAddressesProvider { + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider +- **/ ++ */ + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol ++// downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPriceOracleGetter.sol + + /** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. +- **/ ++ */ + interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. +- **/ ++ */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. +- **/ ++ */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset +- **/ ++ */ + function getAssetPrice(address asset) external view returns (uint256); + } + +-// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/ORACLE/AaveOracle/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -316,38 +316,33 @@ library Errors { + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' +- string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' +- string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' +- string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' +- string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' +- string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' +- string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' ++ string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' +- string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' ++ string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' +@@ -369,22 +364,30 @@ library Errors { + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' +- string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' +- string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 ++ string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled ++ string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid ++ string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed ++ string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed ++ string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 ++ string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' ++ string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' ++ string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range ++ string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state ++ string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IACLManager.sol ++// downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IACLManager.sol + + /** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager +- **/ ++ */ + interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider +@@ -500,7 +503,7 @@ interface IACLManager { + function addFlashBorrower(address borrower) external; + + /** +- * @notice Removes an admin as FlashBorrower ++ * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; +@@ -551,7 +554,7 @@ interface IACLManager { + function isAssetListingAdmin(address admin) external view returns (bool); + } + +-// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IAaveOracle.sol ++// downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IAaveOracle.sol + + /** + * @title IAaveOracle +@@ -619,7 +622,7 @@ interface IAaveOracle is IPriceOracleGetter { + function getFallbackOracle() external view returns (address); + } + +-// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/misc/AaveOracle.sol ++// downloads/LINEA/ORACLE/AaveOracle/src/contracts/misc/AaveOracle.sol + + /** + * @title AaveOracle +@@ -641,7 +644,7 @@ contract AaveOracle is IAaveOracle { + + /** + * @dev Only asset listing or pool admin can call functions marked by this modifier. +- **/ ++ */ + modifier onlyAssetListingOrPoolAdmins() { + _onlyAssetListingOrPoolAdmins(); + _; +``` diff --git a/diffs/ARBITRUM_LINEA/POOL_ADDRESSES_PROVIDER_DIFF.md b/diffs/ARBITRUM_LINEA/POOL_ADDRESSES_PROVIDER_DIFF.md new file mode 100644 index 00000000..29683e64 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/POOL_ADDRESSES_PROVIDER_DIFF.md @@ -0,0 +1,415 @@ +```diff +diff --git a/./downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER.sol b/./downloads/LINEA/POOL_ADDRESSES_PROVIDER.sol +index 9478e36..7a14597 100644 +--- a/./downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER.sol ++++ b/./downloads/LINEA/POOL_ADDRESSES_PROVIDER.sol +@@ -1,7 +1,9 @@ + // SPDX-License-Identifier: BUSL-1.1 +-pragma solidity =0.8.10; ++pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol ++// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol ++ ++// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + + /** + * @dev Collection of functions related to the address type +@@ -25,16 +27,15 @@ library Address { + * ==== + */ + function isContract(address account) internal view returns (bool) { +- // According to EIP-1052, 0x0 is the value returned for not-yet created accounts +- // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned +- // for accounts without code, i.e. `keccak256('')` +- bytes32 codehash; +- bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; +- // solhint-disable-next-line no-inline-assembly ++ // This method relies on extcodesize, which returns 0 for contracts in ++ // construction, since the code is only stored at the end of the ++ // constructor execution. ++ ++ uint256 size; + assembly { +- codehash := extcodehash(account) ++ size := extcodesize(account) + } +- return (codehash != accountHash && codehash != 0x0); ++ return size > 0; + } + + /** +@@ -56,13 +57,171 @@ library Address { + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + +- // solhint-disable-next-line avoid-low-level-calls, avoid-call-value + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } ++ ++ /** ++ * @dev Performs a Solidity function call using a low level `call`. A ++ * plain `call` is an unsafe replacement for a function call: use this ++ * function instead. ++ * ++ * If `target` reverts with a revert reason, it is bubbled up by this ++ * function (like regular Solidity function calls). ++ * ++ * Returns the raw returned data. To convert to the expected return value, ++ * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. ++ * ++ * Requirements: ++ * ++ * - `target` must be a contract. ++ * - calling `target` with `data` must not revert. ++ * ++ * _Available since v3.1._ ++ */ ++ function functionCall(address target, bytes memory data) internal returns (bytes memory) { ++ return functionCall(target, data, 'Address: low-level call failed'); ++ } ++ ++ /** ++ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with ++ * `errorMessage` as a fallback revert reason when `target` reverts. ++ * ++ * _Available since v3.1._ ++ */ ++ function functionCall( ++ address target, ++ bytes memory data, ++ string memory errorMessage ++ ) internal returns (bytes memory) { ++ return functionCallWithValue(target, data, 0, errorMessage); ++ } ++ ++ /** ++ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], ++ * but also transferring `value` wei to `target`. ++ * ++ * Requirements: ++ * ++ * - the calling contract must have an ETH balance of at least `value`. ++ * - the called Solidity function must be `payable`. ++ * ++ * _Available since v3.1._ ++ */ ++ function functionCallWithValue( ++ address target, ++ bytes memory data, ++ uint256 value ++ ) internal returns (bytes memory) { ++ return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); ++ } ++ ++ /** ++ * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but ++ * with `errorMessage` as a fallback revert reason when `target` reverts. ++ * ++ * _Available since v3.1._ ++ */ ++ function functionCallWithValue( ++ address target, ++ bytes memory data, ++ uint256 value, ++ string memory errorMessage ++ ) internal returns (bytes memory) { ++ require(address(this).balance >= value, 'Address: insufficient balance for call'); ++ require(isContract(target), 'Address: call to non-contract'); ++ ++ (bool success, bytes memory returndata) = target.call{value: value}(data); ++ return verifyCallResult(success, returndata, errorMessage); ++ } ++ ++ /** ++ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], ++ * but performing a static call. ++ * ++ * _Available since v3.3._ ++ */ ++ function functionStaticCall( ++ address target, ++ bytes memory data ++ ) internal view returns (bytes memory) { ++ return functionStaticCall(target, data, 'Address: low-level static call failed'); ++ } ++ ++ /** ++ * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], ++ * but performing a static call. ++ * ++ * _Available since v3.3._ ++ */ ++ function functionStaticCall( ++ address target, ++ bytes memory data, ++ string memory errorMessage ++ ) internal view returns (bytes memory) { ++ require(isContract(target), 'Address: static call to non-contract'); ++ ++ (bool success, bytes memory returndata) = target.staticcall(data); ++ return verifyCallResult(success, returndata, errorMessage); ++ } ++ ++ /** ++ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], ++ * but performing a delegate call. ++ * ++ * _Available since v3.4._ ++ */ ++ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { ++ return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); ++ } ++ ++ /** ++ * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], ++ * but performing a delegate call. ++ * ++ * _Available since v3.4._ ++ */ ++ function functionDelegateCall( ++ address target, ++ bytes memory data, ++ string memory errorMessage ++ ) internal returns (bytes memory) { ++ require(isContract(target), 'Address: delegate call to non-contract'); ++ ++ (bool success, bytes memory returndata) = target.delegatecall(data); ++ return verifyCallResult(success, returndata, errorMessage); ++ } ++ ++ /** ++ * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the ++ * revert reason using the provided one. ++ * ++ * _Available since v4.3._ ++ */ ++ function verifyCallResult( ++ bool success, ++ bytes memory returndata, ++ string memory errorMessage ++ ) internal pure returns (bytes memory) { ++ if (success) { ++ return returndata; ++ } else { ++ // Look for revert reason and bubble it up if present ++ if (returndata.length > 0) { ++ // The easiest way to bubble the revert reason is using memory via assembly ++ ++ assembly { ++ let returndata_size := mload(returndata) ++ revert(add(32, returndata), returndata_size) ++ } ++ } else { ++ revert(errorMessage); ++ } ++ } ++ } + } + +-// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol ++// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Context.sol + + /* + * @dev Provides information about the current execution context, including the +@@ -85,7 +244,7 @@ abstract contract Context { + } + } + +-// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol ++// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol + + /** + * @title Proxy +@@ -104,6 +263,14 @@ abstract contract Proxy { + _fallback(); + } + ++ /** ++ * @dev Fallback function that will run if call data is empty. ++ * IMPORTANT. receive() on implementation contracts will be unreachable ++ */ ++ receive() external payable { ++ _fallback(); ++ } ++ + /** + * @return The Address of the implementation. + */ +@@ -158,13 +325,13 @@ abstract contract Proxy { + } + } + +-// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. +- **/ ++ */ + interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. +@@ -259,7 +426,7 @@ interface IPoolAddressesProvider { + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id +- **/ ++ */ + function getMarketId() external view returns (string memory); + + /** +@@ -301,27 +468,27 @@ interface IPoolAddressesProvider { + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address +- **/ ++ */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation +- **/ ++ */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address +- **/ ++ */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation +- **/ ++ */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** +@@ -345,7 +512,7 @@ interface IPoolAddressesProvider { + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager +- **/ ++ */ + function setACLManager(address newAclManager) external; + + /** +@@ -369,7 +536,7 @@ interface IPoolAddressesProvider { + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel +- **/ ++ */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** +@@ -381,11 +548,11 @@ interface IPoolAddressesProvider { + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider +- **/ ++ */ + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol ++// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol + + /** + * @dev Contract module which provides a basic access control mechanism, where +@@ -451,7 +618,7 @@ contract Ownable is Context { + } + } + +-// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol ++// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol + + /** + * @title BaseUpgradeabilityProxy +@@ -514,7 +681,7 @@ contract BaseUpgradeabilityProxy is Proxy { + } + } + +-// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol ++// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol + + /** + * @title InitializableUpgradeabilityProxy +@@ -541,7 +708,7 @@ contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { + } + } + +-// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol ++// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol + + /** + * @title BaseImmutableAdminUpgradeabilityProxy +@@ -558,10 +725,10 @@ contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + + /** + * @dev Constructor. +- * @param admin The address of the admin ++ * @param admin_ The address of the admin + */ +- constructor(address admin) { +- _admin = admin; ++ constructor(address admin_) { ++ _admin = admin_; + } + + modifier ifAdmin() { +@@ -624,7 +791,7 @@ contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + } + } + +-// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol ++// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol + + /** + * @title InitializableAdminUpgradeabilityProxy +@@ -649,7 +816,7 @@ contract InitializableImmutableAdminUpgradeabilityProxy is + } + } + +-// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol ++// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/protocol/configuration/PoolAddressesProvider.sol + + /** + * @title PoolAddressesProvider +@@ -657,7 +824,7 @@ contract InitializableImmutableAdminUpgradeabilityProxy is + * @notice Main registry of addresses part of or connected to the protocol, including permissioned roles + * @dev Acts as factory of proxies and admin of those, so with right to change its implementations + * @dev Owned by the Aave Governance +- **/ ++ */ + contract PoolAddressesProvider is Ownable, IPoolAddressesProvider { + // Identifier of the Aave Market + string private _marketId; +@@ -809,7 +976,7 @@ contract PoolAddressesProvider is Ownable, IPoolAddressesProvider { + * calls the initialize() function via upgradeToAndCall() in the proxy + * @param id The id of the proxy to be updated + * @param newAddress The address of the new implementation +- **/ ++ */ + function _updateImpl(bytes32 id, address newAddress) internal { + address proxyAddress = _addresses[id]; + InitializableImmutableAdminUpgradeabilityProxy proxy; +@@ -829,7 +996,7 @@ contract PoolAddressesProvider is Ownable, IPoolAddressesProvider { + /** + * @notice Updates the identifier of the Aave market. + * @param newMarketId The new id of the market +- **/ ++ */ + function _setMarketId(string memory newMarketId) internal { + string memory oldMarketId = _marketId; + _marketId = newMarketId; +``` diff --git a/diffs/ARBITRUM_LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY_DIFF.md b/diffs/ARBITRUM_LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY_DIFF.md new file mode 100644 index 00000000..ca9bad4f --- /dev/null +++ b/diffs/ARBITRUM_LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY_DIFF.md @@ -0,0 +1,149 @@ +```diff +diff --git a/./downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY.sol b/./downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY.sol +index b396e1f..8ab717f 100644 +--- a/./downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY.sol ++++ b/./downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 +-pragma solidity =0.8.10; ++pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol ++// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Context.sol + + /* + * @dev Provides information about the current execution context, including the +@@ -24,13 +24,13 @@ abstract contract Context { + } + } + +-// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol ++// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/interfaces/IPoolAddressesProviderRegistry.sol + + /** + * @title IPoolAddressesProviderRegistry + * @author Aave + * @notice Defines the basic interface for an Aave Pool Addresses Provider Registry. +- **/ ++ */ + interface IPoolAddressesProviderRegistry { + /** + * @dev Emitted when a new AddressesProvider is registered. +@@ -49,7 +49,7 @@ interface IPoolAddressesProviderRegistry { + /** + * @notice Returns the list of registered addresses providers + * @return The list of addresses providers +- **/ ++ */ + function getAddressesProvidersList() external view returns (address[] memory); + + /** +@@ -74,17 +74,17 @@ interface IPoolAddressesProviderRegistry { + * @dev The id must not be used by an already registered PoolAddressesProvider + * @param provider The address of the new PoolAddressesProvider + * @param id The id for the new PoolAddressesProvider, referring to the market it belongs to +- **/ ++ */ + function registerAddressesProvider(address provider, uint256 id) external; + + /** + * @notice Removes an addresses provider from the list of registered addresses providers + * @param provider The PoolAddressesProvider address +- **/ ++ */ + function unregisterAddressesProvider(address provider) external; + } + +-// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -122,38 +122,33 @@ library Errors { + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' +- string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' +- string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' +- string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' +- string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' +- string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' +- string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' ++ string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' +- string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' ++ string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' +@@ -175,16 +170,24 @@ library Errors { + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' +- string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' +- string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 ++ string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled ++ string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid ++ string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed ++ string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed ++ string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 ++ string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' ++ string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' ++ string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range ++ string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state ++ string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol ++// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol + + /** + * @dev Contract module which provides a basic access control mechanism, where +@@ -250,7 +253,7 @@ contract Ownable is Context { + } + } + +-// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol ++// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol + + /** + * @title PoolAddressesProviderRegistry +@@ -258,7 +261,7 @@ contract Ownable is Context { + * @notice Main registry of PoolAddressesProvider of Aave markets. + * @dev Used for indexing purposes of Aave protocol's markets. The id assigned to a PoolAddressesProvider refers to the + * market it is connected with, for example with `1` for the Aave main market and `2` for the next created. +- **/ ++ */ + contract PoolAddressesProviderRegistry is Ownable, IPoolAddressesProviderRegistry { + // Map of address provider ids (addressesProvider => id) + mapping(address => uint256) private _addressesProviderToId; +``` diff --git a/diffs/ARBITRUM_LINEA/POOL_CONFIGURATOR_IMPL_DIFF.md b/diffs/ARBITRUM_LINEA/POOL_CONFIGURATOR_IMPL_DIFF.md new file mode 100644 index 00000000..f0f29d46 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/POOL_CONFIGURATOR_IMPL_DIFF.md @@ -0,0 +1,258 @@ +```diff +diff --git a/./downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL.sol b/./downloads/LINEA/POOL_CONFIGURATOR_IMPL.sol +index 09a7d9d..e6effd0 100644 +--- a/./downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL.sol ++++ b/./downloads/LINEA/POOL_CONFIGURATOR_IMPL.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 + pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol + + // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +@@ -221,7 +221,7 @@ library Address { + } + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -297,7 +297,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol + + /** + * @title Proxy +@@ -378,7 +378,7 @@ abstract contract Proxy { + } + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IAaveIncentivesController.sol + + /** + * @title IAaveIncentivesController +@@ -397,7 +397,7 @@ interface IAaveIncentivesController { + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider +@@ -624,7 +624,7 @@ interface IPoolAddressesProvider { + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol + + /** + * @title VersionedInitializable +@@ -701,7 +701,7 @@ abstract contract VersionedInitializable { + uint256[50] private ______gap; + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -804,7 +804,7 @@ library Errors { + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/math/PercentageMath.sol + + /** + * @title PercentageMath library +@@ -865,7 +865,7 @@ library PercentageMath { + } + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol + + library ConfiguratorInputTypes { + struct InitReserveInput { +@@ -904,7 +904,7 @@ library ConfiguratorInputTypes { + } + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { + /** +@@ -1228,7 +1228,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + + interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); +@@ -1238,7 +1238,7 @@ interface IERC20Detailed is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IACLManager.sol + + /** + * @title IACLManager +@@ -1411,7 +1411,7 @@ interface IACLManager { + function isAssetListingAdmin(address admin) external view returns (bool); + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolDataProvider.sol + + /** + * @title IPoolDataProvider +@@ -1659,7 +1659,7 @@ interface IPoolDataProvider { + function getVirtualUnderlyingBalance(address asset) external view returns (uint256); + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol + + /** + * @title IReserveInterestRateStrategy +@@ -1686,7 +1686,7 @@ interface IReserveInterestRateStrategy { + ) external view returns (uint256, uint256); + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol + + /** + * @title BaseUpgradeabilityProxy +@@ -1749,7 +1749,7 @@ contract BaseUpgradeabilityProxy is Proxy { + } + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPool.sol + + /** + * @title IPool +@@ -2580,7 +2580,7 @@ interface IPool { + function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + + /** + * @title ReserveConfiguration library +@@ -3161,7 +3161,7 @@ library ReserveConfiguration { + } + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol + + /** + * @title InitializableUpgradeabilityProxy +@@ -3188,7 +3188,7 @@ contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { + } + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol + + /** + * @title IDefaultInterestRateStrategyV2 +@@ -3346,7 +3346,7 @@ interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { + function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol + + /** + * @title BaseImmutableAdminUpgradeabilityProxy +@@ -3429,7 +3429,7 @@ contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + } + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + + /** + * @title EModeConfiguration library +@@ -3478,7 +3478,7 @@ library EModeConfiguration { + } + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableAToken.sol + + /** + * @title IInitializableAToken +@@ -3531,7 +3531,7 @@ interface IInitializableAToken { + ) external; + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableDebtToken.sol + + /** + * @title IInitializableDebtToken +@@ -3580,7 +3580,7 @@ interface IInitializableDebtToken { + ) external; + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolConfigurator.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolConfigurator.sol + + /** + * @title IPoolConfigurator +@@ -4128,7 +4128,7 @@ interface IPoolConfigurator { + function MAX_GRACE_PERIOD() external view returns (uint40); + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol + + /** + * @title InitializableAdminUpgradeabilityProxy +@@ -4153,7 +4153,7 @@ contract InitializableImmutableAdminUpgradeabilityProxy is + } + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol + + /** + * @title ConfiguratorLogic library +@@ -4365,7 +4365,7 @@ library ConfiguratorLogic { + } + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/pool/PoolConfigurator.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/pool/PoolConfigurator.sol + + /** + * @title PoolConfigurator +@@ -4978,7 +4978,7 @@ abstract contract PoolConfigurator is VersionedInitializable, IPoolConfigurator + } + } + +-// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/instances/PoolConfiguratorInstance.sol ++// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/instances/PoolConfiguratorInstance.sol + + contract PoolConfiguratorInstance is PoolConfigurator { + uint256 public constant CONFIGURATOR_REVISION = 4; +``` diff --git a/diffs/ARBITRUM_LINEA/POOL_LOGIC_DIFF.md b/diffs/ARBITRUM_LINEA/POOL_LOGIC_DIFF.md new file mode 100644 index 00000000..b8418ee8 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/POOL_LOGIC_DIFF.md @@ -0,0 +1,328 @@ +```diff +diff --git a/./downloads/ARBITRUM/POOL_LOGIC.sol b/./downloads/LINEA/POOL_LOGIC.sol +index a04f0bb..61a4f73 100644 +--- a/./downloads/ARBITRUM/POOL_LOGIC.sol ++++ b/./downloads/LINEA/POOL_LOGIC.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 + pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + + // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +@@ -221,7 +221,7 @@ library Address { + } + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + + /* + * @dev Provides information about the current execution context, including the +@@ -244,7 +244,7 @@ abstract contract Context { + } + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + + /** + * @dev External interface of AccessControl declared to support ERC165 detection. +@@ -334,7 +334,7 @@ interface IAccessControl { + function renounceRole(bytes32 role, address account) external; + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -410,7 +410,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + + // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +@@ -666,7 +666,7 @@ library SafeCast { + } + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol + + /** + * @title IAaveIncentivesController +@@ -685,7 +685,7 @@ interface IAaveIncentivesController { + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider +@@ -912,7 +912,7 @@ interface IPoolAddressesProvider { + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol + + /** + * @title IPriceOracleGetter +@@ -942,7 +942,7 @@ interface IPriceOracleGetter { + function getAssetPrice(address asset) external view returns (uint256); + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol + + /** + * @title IScaledBalanceToken +@@ -1014,7 +1014,7 @@ interface IScaledBalanceToken { + function getPreviousIndex(address user) external view returns (uint256); + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -1117,7 +1117,7 @@ library Errors { + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + + /** + * @title PercentageMath library +@@ -1178,7 +1178,7 @@ library PercentageMath { + } + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + + /** + * @title WadRayMath library +@@ -1304,7 +1304,7 @@ library WadRayMath { + } + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { + /** +@@ -1628,7 +1628,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + + /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library + /// @author Gnosis Developers +@@ -1741,7 +1741,7 @@ library GPv2SafeERC20 { + } + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + + interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); +@@ -1751,7 +1751,7 @@ interface IERC20Detailed is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol + + /** + * @title IACLManager +@@ -1924,7 +1924,7 @@ interface IACLManager { + function isAssetListingAdmin(address admin) external view returns (bool); + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + + /** + * @title IPriceOracleSentinel +@@ -1989,7 +1989,7 @@ interface IPriceOracleSentinel { + function getGracePeriod() external view returns (uint256); + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + + /** + * @title IReserveInterestRateStrategy +@@ -2016,7 +2016,7 @@ interface IReserveInterestRateStrategy { + ) external view returns (uint256, uint256); + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol + + /** + * @title MathUtils library +@@ -2113,7 +2113,7 @@ library MathUtils { + } + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol + + /** + * @title IPool +@@ -2672,6 +2672,7 @@ interface IPool { + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 ++ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ +@@ -2943,7 +2944,7 @@ interface IPool { + function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + + /** + * @title ReserveConfiguration library +@@ -2958,6 +2959,7 @@ library ReserveConfiguration { + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore ++ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore +@@ -2966,7 +2968,7 @@ library ReserveConfiguration { + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +- //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory ++ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +@@ -3523,7 +3525,7 @@ library ReserveConfiguration { + } + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + + /** + * @title EModeConfiguration library +@@ -3572,7 +3574,7 @@ library EModeConfiguration { + } + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + + /** + * @title UserConfiguration library +@@ -3804,7 +3806,7 @@ library UserConfiguration { + } + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol + + /** + * @title IInitializableAToken +@@ -3857,7 +3859,7 @@ interface IInitializableAToken { + ) external; + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol + + /** + * @title IInitializableDebtToken +@@ -3906,7 +3908,7 @@ interface IInitializableDebtToken { + ) external; + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol + + /** + * @title IVariableDebtToken +@@ -3949,7 +3951,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol + + /** + * @title IAToken +@@ -4083,7 +4085,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + function rescueTokens(address token, address to, uint256 amount) external; + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + + /** + * @title IncentivizedERC20 +@@ -4306,7 +4308,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { + } + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + + /** + * @title ReserveLogic library +@@ -4607,7 +4609,7 @@ library ReserveLogic { + } + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + + /** + * @title EModeLogic library +@@ -4669,7 +4671,7 @@ library EModeLogic { + } + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + + /** + * @title GenericLogic library +@@ -4913,7 +4915,7 @@ library GenericLogic { + } + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + + /** + * @title ReserveLogic library +@@ -5533,7 +5535,7 @@ library ValidationLogic { + } + } + +-// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol ++// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol + + /** + * @title PoolLogic library +``` diff --git a/diffs/ARBITRUM_LINEA/SUPPLY_LOGIC_DIFF.md b/diffs/ARBITRUM_LINEA/SUPPLY_LOGIC_DIFF.md new file mode 100644 index 00000000..15ac15e3 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/SUPPLY_LOGIC_DIFF.md @@ -0,0 +1,328 @@ +```diff +diff --git a/./downloads/ARBITRUM/SUPPLY_LOGIC.sol b/./downloads/LINEA/SUPPLY_LOGIC.sol +index 99515df..a3cc5dd 100644 +--- a/./downloads/ARBITRUM/SUPPLY_LOGIC.sol ++++ b/./downloads/LINEA/SUPPLY_LOGIC.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 + pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + + // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +@@ -221,7 +221,7 @@ library Address { + } + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + + /* + * @dev Provides information about the current execution context, including the +@@ -244,7 +244,7 @@ abstract contract Context { + } + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + + /** + * @dev External interface of AccessControl declared to support ERC165 detection. +@@ -334,7 +334,7 @@ interface IAccessControl { + function renounceRole(bytes32 role, address account) external; + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -410,7 +410,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + + // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +@@ -666,7 +666,7 @@ library SafeCast { + } + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol + + /** + * @title IAaveIncentivesController +@@ -685,7 +685,7 @@ interface IAaveIncentivesController { + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider +@@ -912,7 +912,7 @@ interface IPoolAddressesProvider { + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol + + /** + * @title IPriceOracleGetter +@@ -942,7 +942,7 @@ interface IPriceOracleGetter { + function getAssetPrice(address asset) external view returns (uint256); + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol + + /** + * @title IScaledBalanceToken +@@ -1014,7 +1014,7 @@ interface IScaledBalanceToken { + function getPreviousIndex(address user) external view returns (uint256); + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -1117,7 +1117,7 @@ library Errors { + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + + /** + * @title PercentageMath library +@@ -1178,7 +1178,7 @@ library PercentageMath { + } + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + + /** + * @title WadRayMath library +@@ -1304,7 +1304,7 @@ library WadRayMath { + } + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { + /** +@@ -1628,7 +1628,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + + /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library + /// @author Gnosis Developers +@@ -1741,7 +1741,7 @@ library GPv2SafeERC20 { + } + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + + interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); +@@ -1751,7 +1751,7 @@ interface IERC20Detailed is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol + + /** + * @title IACLManager +@@ -1924,7 +1924,7 @@ interface IACLManager { + function isAssetListingAdmin(address admin) external view returns (bool); + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + + /** + * @title IPriceOracleSentinel +@@ -1989,7 +1989,7 @@ interface IPriceOracleSentinel { + function getGracePeriod() external view returns (uint256); + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + + /** + * @title IReserveInterestRateStrategy +@@ -2016,7 +2016,7 @@ interface IReserveInterestRateStrategy { + ) external view returns (uint256, uint256); + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol + + /** + * @title MathUtils library +@@ -2113,7 +2113,7 @@ library MathUtils { + } + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol + + /** + * @title IPool +@@ -2672,6 +2672,7 @@ interface IPool { + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 ++ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ +@@ -2943,7 +2944,7 @@ interface IPool { + function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + + /** + * @title ReserveConfiguration library +@@ -2958,6 +2959,7 @@ library ReserveConfiguration { + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore ++ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore +@@ -2966,7 +2968,7 @@ library ReserveConfiguration { + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +- //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory ++ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +@@ -3523,7 +3525,7 @@ library ReserveConfiguration { + } + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + + /** + * @title EModeConfiguration library +@@ -3572,7 +3574,7 @@ library EModeConfiguration { + } + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + + /** + * @title UserConfiguration library +@@ -3804,7 +3806,7 @@ library UserConfiguration { + } + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol + + /** + * @title IInitializableAToken +@@ -3857,7 +3859,7 @@ interface IInitializableAToken { + ) external; + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol + + /** + * @title IInitializableDebtToken +@@ -3906,7 +3908,7 @@ interface IInitializableDebtToken { + ) external; + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol + + /** + * @title IVariableDebtToken +@@ -3949,7 +3951,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol + + /** + * @title IAToken +@@ -4083,7 +4085,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + function rescueTokens(address token, address to, uint256 amount) external; + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + + /** + * @title IncentivizedERC20 +@@ -4306,7 +4308,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { + } + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + + /** + * @title ReserveLogic library +@@ -4607,7 +4609,7 @@ library ReserveLogic { + } + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + + /** + * @title EModeLogic library +@@ -4669,7 +4671,7 @@ library EModeLogic { + } + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + + /** + * @title GenericLogic library +@@ -4913,7 +4915,7 @@ library GenericLogic { + } + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + + /** + * @title ReserveLogic library +@@ -5533,7 +5535,7 @@ library ValidationLogic { + } + } + +-// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol ++// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol + + /** + * @title SupplyLogic library +``` diff --git a/diffs/ARBITRUM_LINEA/UI_INCENTIVE_DATA_PROVIDER_DIFF.md b/diffs/ARBITRUM_LINEA/UI_INCENTIVE_DATA_PROVIDER_DIFF.md new file mode 100644 index 00000000..94901233 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/UI_INCENTIVE_DATA_PROVIDER_DIFF.md @@ -0,0 +1,195 @@ +```diff +diff --git a/./downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER.sol b/./downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER.sol +index d31e3f7..64c6bd5 100644 +--- a/./downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER.sol ++++ b/./downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 + pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol + + /* + * @dev Provides information about the current execution context, including the +@@ -24,7 +24,7 @@ abstract contract Context { + } + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -100,7 +100,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + + // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +@@ -356,7 +356,7 @@ library SafeCast { + } + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol + + interface IEACAggregatorProxy { + function decimals() external view returns (uint8); +@@ -375,7 +375,7 @@ interface IEACAggregatorProxy { + event NewRound(uint256 indexed roundId, address indexed startedBy); + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol + + /** + * @title IAaveIncentivesController +@@ -394,7 +394,7 @@ interface IAaveIncentivesController { + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider +@@ -621,7 +621,7 @@ interface IPoolAddressesProvider { + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -724,7 +724,7 @@ library Errors { + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol + + /** + * @title WadRayMath library +@@ -850,7 +850,7 @@ library WadRayMath { + } + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { + /** +@@ -1174,7 +1174,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol + + /** + * @title IRewardsDistributor +@@ -1351,7 +1351,7 @@ interface IRewardsDistributor { + function getEmissionManager() external view returns (address); + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol + + interface ITransferStrategyBase { + event EmergencyWithdrawal( +@@ -1389,7 +1389,7 @@ interface ITransferStrategyBase { + function emergencyWithdrawal(address token, address to, uint256 amount) external; + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + + interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); +@@ -1399,7 +1399,7 @@ interface IERC20Detailed is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol + + interface IUiIncentiveDataProviderV3 { + struct AggregatedReserveIncentiveData { +@@ -1470,7 +1470,7 @@ interface IUiIncentiveDataProviderV3 { + returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory); + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol + + /** + * @title IACLManager +@@ -1643,7 +1643,7 @@ interface IACLManager { + function isAssetListingAdmin(address admin) external view returns (bool); + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol + + /** + * @title IPool +@@ -2474,7 +2474,7 @@ interface IPool { + function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + + /** + * @title ReserveConfiguration library +@@ -3055,7 +3055,7 @@ library ReserveConfiguration { + } + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol + + library RewardsDataTypes { + struct RewardsConfigInput { +@@ -3106,7 +3106,7 @@ library RewardsDataTypes { + } + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + + /** + * @title UserConfiguration library +@@ -3338,7 +3338,7 @@ library UserConfiguration { + } + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol + + /** + * @title IRewardsController +@@ -3536,7 +3536,7 @@ interface IRewardsController is IRewardsDistributor { + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + + /** + * @title IncentivizedERC20 +@@ -3759,7 +3759,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { + } + } + +-// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol ++// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol + + contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { + using UserConfiguration for DataTypes.UserConfigurationMap; +``` diff --git a/diffs/ARBITRUM_LINEA/UI_POOL_DATA_PROVIDER_DIFF.md b/diffs/ARBITRUM_LINEA/UI_POOL_DATA_PROVIDER_DIFF.md new file mode 100644 index 00000000..7d95d85b --- /dev/null +++ b/diffs/ARBITRUM_LINEA/UI_POOL_DATA_PROVIDER_DIFF.md @@ -0,0 +1,231 @@ +```diff +diff --git a/./downloads/ARBITRUM/UI_POOL_DATA_PROVIDER.sol b/./downloads/LINEA/UI_POOL_DATA_PROVIDER.sol +index 1457bcc..2d97366 100644 +--- a/./downloads/ARBITRUM/UI_POOL_DATA_PROVIDER.sol ++++ b/./downloads/LINEA/UI_POOL_DATA_PROVIDER.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 + pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -77,7 +77,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol + + interface IEACAggregatorProxy { + function decimals() external view returns (uint8); +@@ -96,7 +96,7 @@ interface IEACAggregatorProxy { + event NewRound(uint256 indexed roundId, address indexed startedBy); + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol + + /** + * @title IAaveIncentivesController +@@ -115,7 +115,7 @@ interface IAaveIncentivesController { + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider +@@ -342,7 +342,7 @@ interface IPoolAddressesProvider { + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol + + /** + * @title IPriceOracleGetter +@@ -372,7 +372,7 @@ interface IPriceOracleGetter { + function getAssetPrice(address asset) external view returns (uint256); + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol + + /** + * @title IScaledBalanceToken +@@ -444,7 +444,7 @@ interface IScaledBalanceToken { + function getPreviousIndex(address user) external view returns (uint256); + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -547,7 +547,7 @@ library Errors { + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol + + /** + * @title WadRayMath library +@@ -673,7 +673,7 @@ library WadRayMath { + } + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { + /** +@@ -997,7 +997,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + + interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); +@@ -1007,7 +1007,7 @@ interface IERC20Detailed is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol + + interface IERC20DetailedBytes is IERC20 { + function name() external view returns (bytes32); +@@ -1017,7 +1017,7 @@ interface IERC20DetailedBytes is IERC20 { + function decimals() external view returns (uint8); + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol + + /** + * @title IPoolDataProvider +@@ -1265,7 +1265,7 @@ interface IPoolDataProvider { + function getVirtualUnderlyingBalance(address asset) external view returns (uint256); + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol + + /** + * @title IReserveInterestRateStrategy +@@ -1292,7 +1292,7 @@ interface IReserveInterestRateStrategy { + ) external view returns (uint256, uint256); + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol + + interface IUiPoolDataProviderV3 { + struct AggregatedReserveData { +@@ -1384,7 +1384,7 @@ interface IUiPoolDataProviderV3 { + function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory); + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol + + /** + * @title IAaveOracle +@@ -1452,7 +1452,7 @@ interface IAaveOracle is IPriceOracleGetter { + function getFallbackOracle() external view returns (address); + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol + + /** + * @title IPool +@@ -2283,7 +2283,7 @@ interface IPool { + function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + + /** + * @title ReserveConfiguration library +@@ -2864,7 +2864,7 @@ library ReserveConfiguration { + } + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol + + /** + * @title IDefaultInterestRateStrategyV2 +@@ -3022,7 +3022,7 @@ interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { + function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + + /** + * @title UserConfiguration library +@@ -3254,7 +3254,7 @@ library UserConfiguration { + } + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol + + /** + * @title IInitializableAToken +@@ -3307,7 +3307,7 @@ interface IInitializableAToken { + ) external; + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol + + /** + * @title IInitializableDebtToken +@@ -3356,7 +3356,7 @@ interface IInitializableDebtToken { + ) external; + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol + + /** + * @title IVariableDebtToken +@@ -3399,7 +3399,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol + + /** + * @title IAToken +@@ -3533,7 +3533,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + function rescueTokens(address token, address to, uint256 amount) external; + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol + + /** + * @title AaveProtocolDataProvider +@@ -3818,7 +3818,7 @@ contract AaveProtocolDataProvider is IPoolDataProvider { + } + } + +-// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol ++// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol + + contract UiPoolDataProviderV3 is IUiPoolDataProviderV3 { + using WadRayMath for uint256; +``` diff --git a/diffs/ARBITRUM_LINEA/WALLET_BALANCE_PROVIDER_DIFF.md b/diffs/ARBITRUM_LINEA/WALLET_BALANCE_PROVIDER_DIFF.md new file mode 100644 index 00000000..26ac0526 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/WALLET_BALANCE_PROVIDER_DIFF.md @@ -0,0 +1,1827 @@ +```diff +diff --git a/./downloads/ARBITRUM/WALLET_BALANCE_PROVIDER.sol b/./downloads/LINEA/WALLET_BALANCE_PROVIDER.sol +index 0195ac0..a31677f 100644 +--- a/./downloads/ARBITRUM/WALLET_BALANCE_PROVIDER.sol ++++ b/./downloads/LINEA/WALLET_BALANCE_PROVIDER.sol +@@ -1,7 +1,9 @@ +-// SPDX-License-Identifier: agpl-3.0 +-pragma solidity =0.8.10; ++// SPDX-License-Identifier: BUSL-1.1 ++pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol ++// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol ++ ++// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + + /** + * @dev Collection of functions related to the address type +@@ -25,16 +27,15 @@ library Address { + * ==== + */ + function isContract(address account) internal view returns (bool) { +- // According to EIP-1052, 0x0 is the value returned for not-yet created accounts +- // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned +- // for accounts without code, i.e. `keccak256('')` +- bytes32 codehash; +- bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; +- // solhint-disable-next-line no-inline-assembly ++ // This method relies on extcodesize, which returns 0 for contracts in ++ // construction, since the code is only stored at the end of the ++ // constructor execution. ++ ++ uint256 size; + assembly { +- codehash := extcodehash(account) ++ size := extcodesize(account) + } +- return (codehash != accountHash && codehash != 0x0); ++ return size > 0; + } + + /** +@@ -56,13 +57,171 @@ library Address { + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + +- // solhint-disable-next-line avoid-low-level-calls, avoid-call-value + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } ++ ++ /** ++ * @dev Performs a Solidity function call using a low level `call`. A ++ * plain `call` is an unsafe replacement for a function call: use this ++ * function instead. ++ * ++ * If `target` reverts with a revert reason, it is bubbled up by this ++ * function (like regular Solidity function calls). ++ * ++ * Returns the raw returned data. To convert to the expected return value, ++ * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. ++ * ++ * Requirements: ++ * ++ * - `target` must be a contract. ++ * - calling `target` with `data` must not revert. ++ * ++ * _Available since v3.1._ ++ */ ++ function functionCall(address target, bytes memory data) internal returns (bytes memory) { ++ return functionCall(target, data, 'Address: low-level call failed'); ++ } ++ ++ /** ++ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with ++ * `errorMessage` as a fallback revert reason when `target` reverts. ++ * ++ * _Available since v3.1._ ++ */ ++ function functionCall( ++ address target, ++ bytes memory data, ++ string memory errorMessage ++ ) internal returns (bytes memory) { ++ return functionCallWithValue(target, data, 0, errorMessage); ++ } ++ ++ /** ++ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], ++ * but also transferring `value` wei to `target`. ++ * ++ * Requirements: ++ * ++ * - the calling contract must have an ETH balance of at least `value`. ++ * - the called Solidity function must be `payable`. ++ * ++ * _Available since v3.1._ ++ */ ++ function functionCallWithValue( ++ address target, ++ bytes memory data, ++ uint256 value ++ ) internal returns (bytes memory) { ++ return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); ++ } ++ ++ /** ++ * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but ++ * with `errorMessage` as a fallback revert reason when `target` reverts. ++ * ++ * _Available since v3.1._ ++ */ ++ function functionCallWithValue( ++ address target, ++ bytes memory data, ++ uint256 value, ++ string memory errorMessage ++ ) internal returns (bytes memory) { ++ require(address(this).balance >= value, 'Address: insufficient balance for call'); ++ require(isContract(target), 'Address: call to non-contract'); ++ ++ (bool success, bytes memory returndata) = target.call{value: value}(data); ++ return verifyCallResult(success, returndata, errorMessage); ++ } ++ ++ /** ++ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], ++ * but performing a static call. ++ * ++ * _Available since v3.3._ ++ */ ++ function functionStaticCall( ++ address target, ++ bytes memory data ++ ) internal view returns (bytes memory) { ++ return functionStaticCall(target, data, 'Address: low-level static call failed'); ++ } ++ ++ /** ++ * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], ++ * but performing a static call. ++ * ++ * _Available since v3.3._ ++ */ ++ function functionStaticCall( ++ address target, ++ bytes memory data, ++ string memory errorMessage ++ ) internal view returns (bytes memory) { ++ require(isContract(target), 'Address: static call to non-contract'); ++ ++ (bool success, bytes memory returndata) = target.staticcall(data); ++ return verifyCallResult(success, returndata, errorMessage); ++ } ++ ++ /** ++ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], ++ * but performing a delegate call. ++ * ++ * _Available since v3.4._ ++ */ ++ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { ++ return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); ++ } ++ ++ /** ++ * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], ++ * but performing a delegate call. ++ * ++ * _Available since v3.4._ ++ */ ++ function functionDelegateCall( ++ address target, ++ bytes memory data, ++ string memory errorMessage ++ ) internal returns (bytes memory) { ++ require(isContract(target), 'Address: delegate call to non-contract'); ++ ++ (bool success, bytes memory returndata) = target.delegatecall(data); ++ return verifyCallResult(success, returndata, errorMessage); ++ } ++ ++ /** ++ * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the ++ * revert reason using the provided one. ++ * ++ * _Available since v4.3._ ++ */ ++ function verifyCallResult( ++ bool success, ++ bytes memory returndata, ++ string memory errorMessage ++ ) internal pure returns (bytes memory) { ++ if (success) { ++ return returndata; ++ } else { ++ // Look for revert reason and bubble it up if present ++ if (returndata.length > 0) { ++ // The easiest way to bubble the revert reason is using memory via assembly ++ ++ assembly { ++ let returndata_size := mload(returndata) ++ revert(add(32, returndata), returndata_size) ++ } ++ } else { ++ revert(errorMessage); ++ } ++ } ++ } + } + +-// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -138,13 +297,13 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. +- **/ ++ */ + interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. +@@ -239,7 +398,7 @@ interface IPoolAddressesProvider { + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id +- **/ ++ */ + function getMarketId() external view returns (string memory); + + /** +@@ -281,27 +440,27 @@ interface IPoolAddressesProvider { + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address +- **/ ++ */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation +- **/ ++ */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address +- **/ ++ */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation +- **/ ++ */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** +@@ -325,7 +484,7 @@ interface IPoolAddressesProvider { + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager +- **/ ++ */ + function setACLManager(address newAclManager) external; + + /** +@@ -349,7 +508,7 @@ interface IPoolAddressesProvider { + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel +- **/ ++ */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** +@@ -361,11 +520,11 @@ interface IPoolAddressesProvider { + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider +- **/ ++ */ + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -403,38 +562,33 @@ library Errors { + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' +- string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' +- string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' +- string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' +- string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' +- string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' +- string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' ++ string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' +- string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' ++ string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' +@@ -456,19 +610,31 @@ library Errors { + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' +- string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' +- string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 ++ string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled ++ string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid ++ string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed ++ string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed ++ string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 ++ string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' ++ string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' ++ string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range ++ string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state ++ string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { +- struct ReserveData { ++ /** ++ * This exists specifically to maintain the `getReserveData()` interface, since the new, internal ++ * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. ++ */ ++ struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray +@@ -479,7 +645,7 @@ library DataTypes { + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; +- //the current stable borrow rate. Expressed in ray ++ // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; +@@ -487,7 +653,7 @@ library DataTypes { + uint16 id; + //aToken address + address aTokenAddress; +- //stableDebtToken address ++ // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; +@@ -501,6 +667,43 @@ library DataTypes { + uint128 isolationModeTotalDebt; + } + ++ struct ReserveData { ++ //stores the reserve configuration ++ ReserveConfigurationMap configuration; ++ //the liquidity index. Expressed in ray ++ uint128 liquidityIndex; ++ //the current supply rate. Expressed in ray ++ uint128 currentLiquidityRate; ++ //variable borrow index. Expressed in ray ++ uint128 variableBorrowIndex; ++ //the current variable borrow rate. Expressed in ray ++ uint128 currentVariableBorrowRate; ++ // DEPRECATED on v3.2.0 ++ uint128 __deprecatedStableBorrowRate; ++ //timestamp of last update ++ uint40 lastUpdateTimestamp; ++ //the id of the reserve. Represents the position in the list of the active reserves ++ uint16 id; ++ //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed ++ uint40 liquidationGracePeriodUntil; ++ //aToken address ++ address aTokenAddress; ++ // DEPRECATED on v3.2.0 ++ address __deprecatedStableDebtTokenAddress; ++ //variableDebtToken address ++ address variableDebtTokenAddress; ++ //address of the interest rate strategy ++ address interestRateStrategyAddress; ++ //the current treasury balance, scaled ++ uint128 accruedToTreasury; ++ //the outstanding unbacked aTokens minted through the bridging feature ++ uint128 unbacked; ++ //the outstanding debt borrowed against this asset in isolation mode ++ uint128 isolationModeTotalDebt; ++ //the amount of underlying accounted for by the protocol ++ uint128 virtualUnderlyingBalance; ++ } ++ + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold +@@ -509,18 +712,20 @@ library DataTypes { + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled +- //bit 59: stable rate borrowing enabled ++ //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled +- //bit 62-63: reserved ++ //bit 62: siloed borrowing enabled ++ //bit 63: flashloaning enabled + //bit 64-79: reserve factor +- //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap +- //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap +- //bit 152-167 liquidation protocol fee +- //bit 168-175 eMode category +- //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled +- //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals +- //bit 252-255 unused ++ //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap ++ //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap ++ //bit 152-167: liquidation protocol fee ++ //bit 168-175: DEPRECATED: eMode category ++ //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled ++ //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals ++ //bit 252: virtual accounting is enabled for the reserve ++ //bit 253-255 unused + + uint256 data; + } +@@ -534,30 +739,49 @@ library DataTypes { + uint256 data; + } + +- struct EModeCategory { ++ // DEPRECATED: kept for backwards compatibility, might be removed in a future version ++ struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; +- // each eMode category may or may not have a custom oracle to override the individual assets price oracles ++ // DEPRECATED + address priceSource; + string label; + } + ++ struct CollateralConfig { ++ uint16 ltv; ++ uint16 liquidationThreshold; ++ uint16 liquidationBonus; ++ } ++ ++ struct EModeCategoryBaseConfiguration { ++ uint16 ltv; ++ uint16 liquidationThreshold; ++ uint16 liquidationBonus; ++ string label; ++ } ++ ++ struct EModeCategory { ++ // each eMode category has a custom ltv and liquidation threshold ++ uint16 ltv; ++ uint16 liquidationThreshold; ++ uint16 liquidationBonus; ++ uint128 collateralBitmap; ++ string label; ++ uint128 borrowableBitmap; ++ } ++ + enum InterestRateMode { + NONE, +- STABLE, ++ __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; +- uint256 currPrincipalStableDebt; +- uint256 currAvgStableBorrowRate; +- uint256 currTotalStableDebt; +- uint256 nextAvgStableBorrowRate; +- uint256 nextTotalStableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; +@@ -567,10 +791,8 @@ library DataTypes { + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; +- address stableDebtTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; +- uint40 stableDebtLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { +@@ -600,7 +822,6 @@ library DataTypes { + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; +- uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; +@@ -652,9 +873,9 @@ library DataTypes { + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; +- uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address addressesProvider; ++ address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } +@@ -693,7 +914,6 @@ library DataTypes { + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; +- uint256 maxStableLoanPercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; +@@ -714,18 +934,16 @@ library DataTypes { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; +- uint256 totalStableDebt; +- uint256 totalVariableDebt; +- uint256 averageStableBorrowRate; ++ uint256 totalDebt; + uint256 reserveFactor; + address reserve; +- address aToken; ++ bool usingVirtualBalance; ++ uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; +- address stableDebtAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; +@@ -733,7 +951,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol ++// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + + /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library + /// @author Gnosis Developers +@@ -846,13 +1064,13 @@ library GPv2SafeERC20 { + } + } + +-// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPool.sol ++// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPool.sol + + /** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. +- **/ ++ */ + interface IPool { + /** + * @dev Emitted on mintUnbacked() +@@ -861,7 +1079,7 @@ interface IPool { + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used +- **/ ++ */ + event MintUnbacked( + address indexed reserve, + address user, +@@ -876,7 +1094,7 @@ interface IPool { + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees +- **/ ++ */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** +@@ -886,7 +1104,7 @@ interface IPool { + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used +- **/ ++ */ + event Supply( + address indexed reserve, + address user, +@@ -901,7 +1119,7 @@ interface IPool { + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn +- **/ ++ */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** +@@ -911,10 +1129,10 @@ interface IPool { + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out +- * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable ++ * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used +- **/ ++ */ + event Borrow( + address indexed reserve, + address user, +@@ -932,7 +1150,7 @@ interface IPool { + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly +- **/ ++ */ + event Repay( + address indexed reserve, + address indexed user, +@@ -941,18 +1159,6 @@ interface IPool { + bool useATokens + ); + +- /** +- * @dev Emitted on swapBorrowRateMode() +- * @param reserve The address of the underlying asset of the reserve +- * @param user The address of the user swapping his rate mode +- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable +- **/ +- event SwapBorrowRateMode( +- address indexed reserve, +- address indexed user, +- DataTypes.InterestRateMode interestRateMode +- ); +- + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve +@@ -964,40 +1170,34 @@ interface IPool { + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id +- **/ ++ */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral +- **/ ++ */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral +- **/ ++ */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + +- /** +- * @dev Emitted on rebalanceStableBorrowRate() +- * @param reserve The address of the underlying asset of the reserve +- * @param user The address of the user for which the rebalance has been executed +- **/ +- event RebalanceStableBorrowRate(address indexed reserve, address indexed user); +- + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed +- * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt ++ * @param interestRateMode The flashloan mode: 0 for regular flashloan, ++ * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used +- **/ ++ */ + event FlashLoan( + address indexed target, + address initiator, +@@ -1018,7 +1218,7 @@ interface IPool { + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly +- **/ ++ */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, +@@ -1033,11 +1233,11 @@ interface IPool { + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate +- * @param stableBorrowRate The next stable borrow rate ++ * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index +- **/ ++ */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, +@@ -1051,17 +1251,17 @@ interface IPool { + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury +- **/ ++ */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** +- * @dev Mints an `amount` of aTokens to the `onBehalfOf` ++ * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man +- **/ ++ */ + function mintUnbacked( + address asset, + uint256 amount, +@@ -1070,12 +1270,13 @@ interface IPool { + ) external; + + /** +- * @dev Back the current unbacked underlying with `amount` and pay `fee`. ++ * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees +- **/ +- function backUnbacked(address asset, uint256 amount, uint256 fee) external; ++ * @return The backed amount ++ */ ++ function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. +@@ -1087,7 +1288,7 @@ interface IPool { + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man +- **/ ++ */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** +@@ -1104,7 +1305,7 @@ interface IPool { + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig +- **/ ++ */ + function supplyWithPermit( + address asset, + uint256 amount, +@@ -1126,24 +1327,23 @@ interface IPool { + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn +- **/ ++ */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower +- * already supplied enough collateral, or he was given enough allowance by a credit delegator on the +- * corresponding debt token (StableDebtToken or VariableDebtToken) ++ * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet +- * and 100 stable/variable debt tokens, depending on the `interestRateMode` ++ * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed +- * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable ++ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance +- **/ ++ */ + function borrow( + address asset, + uint256 amount, +@@ -1154,16 +1354,16 @@ interface IPool { + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned +- * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address ++ * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid +- **/ ++ */ + function repay( + address asset, + uint256 amount, +@@ -1177,7 +1377,7 @@ interface IPool { + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed +@@ -1186,7 +1386,7 @@ interface IPool { + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid +- **/ ++ */ + function repayWithPermit( + address asset, + uint256 amount, +@@ -1201,44 +1401,26 @@ interface IPool { + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens +- * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens ++ * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` +- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable ++ * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid +- **/ ++ */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + +- /** +- * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa +- * @param asset The address of the underlying asset borrowed +- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable +- **/ +- function swapBorrowRateMode(address asset, uint256 interestRateMode) external; +- +- /** +- * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. +- * - Users can be rebalanced if the following conditions are satisfied: +- * 1. Usage ratio is above 95% +- * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too +- * much has been borrowed at a stable rate and suppliers are not earning enough +- * @param asset The address of the underlying asset borrowed +- * @param user The address of the user to be rebalanced +- **/ +- function rebalanceStableBorrowRate(address asset, address user) external; +- + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise +- **/ ++ */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** +@@ -1251,7 +1433,7 @@ interface IPool { + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly +- **/ ++ */ + function liquidationCall( + address collateralAsset, + address debtAsset, +@@ -1264,19 +1446,19 @@ interface IPool { + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept +- * into consideration. For further details please visit https://developers.aave.com ++ * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver +- * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address ++ * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address +- * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 ++ * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man +- **/ ++ */ + function flashLoan( + address receiverAddress, + address[] calldata assets, +@@ -1291,14 +1473,14 @@ interface IPool { + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept +- * into consideration. For further details please visit https://developers.aave.com ++ * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man +- **/ ++ */ + function flashLoanSimple( + address receiverAddress, + address asset, +@@ -1316,7 +1498,7 @@ interface IPool { + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user +- **/ ++ */ + function getUserAccountData( + address user + ) +@@ -1337,14 +1519,12 @@ interface IPool { + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve +- * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract +- **/ ++ */ + function initReserve( + address asset, + address aTokenAddress, +- address stableDebtAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; +@@ -1352,8 +1532,9 @@ interface IPool { + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract ++ * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve +- **/ ++ */ + function dropReserve(address asset) external; + + /** +@@ -1361,18 +1542,34 @@ interface IPool { + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract +- **/ ++ */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + ++ /** ++ * @notice Accumulates interest to all indexes of the reserve ++ * @dev Only callable by the PoolConfigurator contract ++ * @dev To be used when required by the configurator, for example when updating interest rates strategy data ++ * @param asset The address of the underlying asset of the reserve ++ */ ++ function syncIndexesState(address asset) external; ++ ++ /** ++ * @notice Updates interest rates on the reserve data ++ * @dev Only callable by the PoolConfigurator contract ++ * @dev To be used when required by the configurator, for example when updating interest rates strategy data ++ * @param asset The address of the underlying asset of the reserve ++ */ ++ function syncRatesState(address asset) external; ++ + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap +- **/ ++ */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration +@@ -1382,7 +1579,7 @@ interface IPool { + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve +- **/ ++ */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); +@@ -1391,13 +1588,13 @@ interface IPool { + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user +- **/ ++ */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** +- * @notice Returns the normalized income normalized income of the reserve ++ * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ +@@ -1405,6 +1602,13 @@ interface IPool { + + /** + * @notice Returns the normalized variable debt per unit of asset ++ * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a ++ * "dynamic" variable index based on time, current stored index and virtual rate at the current ++ * moment (approx. a borrower would get if opening a position). This means that is always used in ++ * combination with variable debt supply/balances. ++ * If using this function externally, consider that is possible to have an increasing normalized ++ * variable debt that is not equivalent to how the variable debt index would be updated in storage ++ * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ +@@ -1414,8 +1618,25 @@ interface IPool { + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve +- **/ +- function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); ++ */ ++ function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); ++ ++ /** ++ * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 ++ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) ++ * @param asset The address of the underlying asset of the reserve ++ * @return The state and configuration data of the reserve with virtual accounting ++ */ ++ function getReserveDataExtended( ++ address asset ++ ) external view returns (DataTypes.ReserveData memory); ++ ++ /** ++ * @notice Returns the virtual underlying balance of the reserve ++ * @param asset The address of the underlying asset of the reserve ++ * @return The reserve virtual underlying balance ++ */ ++ function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer +@@ -1440,20 +1661,27 @@ interface IPool { + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves +- **/ ++ */ + function getReservesList() external view returns (address[] memory); + ++ /** ++ * @notice Returns the number of initialized reserves ++ * @dev It includes dropped reserves ++ * @return The count ++ */ ++ function getReservesCount() external view returns (uint256); ++ + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id +- **/ ++ */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider +- **/ ++ */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** +@@ -1478,20 +1706,70 @@ interface IPool { + ) external; + + /** +- * @notice Configures a new category for the eMode. ++ * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ +- function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; ++ function configureEModeCategory( ++ uint8 id, ++ DataTypes.EModeCategoryBaseConfiguration memory config ++ ) external; ++ ++ /** ++ * @notice Replaces the current eMode collateralBitmap. ++ * @param id The id of the category ++ * @param collateralBitmap The collateralBitmap of the category ++ */ ++ function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; ++ ++ /** ++ * @notice Replaces the current eMode borrowableBitmap. ++ * @param id The id of the category ++ * @param borrowableBitmap The borrowableBitmap of the category ++ */ ++ function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category ++ * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ +- function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); ++ function getEModeCategoryData( ++ uint8 id ++ ) external view returns (DataTypes.EModeCategoryLegacy memory); ++ ++ /** ++ * @notice Returns the label of an eMode category ++ * @param id The id of the category ++ * @return The label of the category ++ */ ++ function getEModeCategoryLabel(uint8 id) external view returns (string memory); ++ ++ /** ++ * @notice Returns the collateral config of an eMode category ++ * @param id The id of the category ++ * @return The ltv,lt,lb of the category ++ */ ++ function getEModeCategoryCollateralConfig( ++ uint8 id ++ ) external view returns (DataTypes.CollateralConfig memory); ++ ++ /** ++ * @notice Returns the collateralBitmap of an eMode category ++ * @param id The id of the category ++ * @return The collateralBitmap of the category ++ */ ++ function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); ++ ++ /** ++ * @notice Returns the borrowableBitmap of an eMode category ++ * @param id The id of the category ++ * @return The borrowableBitmap of the category ++ */ ++ function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode +@@ -1514,10 +1792,20 @@ interface IPool { + function resetIsolationModeTotalDebt(address asset) external; + + /** +- * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate +- * @return The percentage of available liquidity to borrow, expressed in bps +- */ +- function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); ++ * @notice Sets the liquidation grace period of the given asset ++ * @dev To enable a liquidation grace period, a timestamp in the future should be set, ++ * To disable a liquidation grace period, any timestamp in the past works, like 0 ++ * @param asset The address of the underlying asset to set the liquidationGracePeriod ++ * @param until Timestamp when the liquidation grace period will end ++ **/ ++ function setLiquidationGracePeriod(address asset, uint40 until) external; ++ ++ /** ++ * @notice Returns the liquidation grace period of the given asset ++ * @param asset The address of the underlying asset ++ * @return Timestamp when the liquidation grace period will end ++ **/ ++ function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans +@@ -1546,7 +1834,7 @@ interface IPool { + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed +- **/ ++ */ + function mintToTreasury(address[] calldata assets) external; + + /** +@@ -1568,11 +1856,46 @@ interface IPool { + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man +- **/ ++ */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; ++ ++ /** ++ * @notice Gets the address of the external FlashLoanLogic ++ */ ++ function getFlashLoanLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external BorrowLogic ++ */ ++ function getBorrowLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external BridgeLogic ++ */ ++ function getBridgeLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external EModeLogic ++ */ ++ function getEModeLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external LiquidationLogic ++ */ ++ function getLiquidationLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external PoolLogic ++ */ ++ function getPoolLogic() external view returns (address); ++ ++ /** ++ * @notice Gets the address of the external SupplyLogic ++ */ ++ function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol ++// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + + /** + * @title ReserveConfiguration library +@@ -1587,17 +1910,19 @@ library ReserveConfiguration { + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore +- uint256 internal constant STABLE_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFF; // prettier-ignore ++ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore ++ uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore +- uint256 internal constant EMODE_CATEGORY_MASK = 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore ++ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore ++ uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; +@@ -1606,19 +1931,18 @@ library ReserveConfiguration { + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; +- uint256 internal constant STABLE_BORROWING_ENABLED_START_BIT_POSITION = 59; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; +- /// @dev bit 63 reserved +- ++ uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; +- uint256 internal constant EMODE_CATEGORY_START_BIT_POSITION = 168; ++ //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; ++ uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; +@@ -1628,7 +1952,6 @@ library ReserveConfiguration { + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; +- uint256 internal constant MAX_VALID_EMODE_CATEGORY = 255; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + +@@ -1639,7 +1962,7 @@ library ReserveConfiguration { + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv +- **/ ++ */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + +@@ -1650,7 +1973,7 @@ library ReserveConfiguration { + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value +- **/ ++ */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } +@@ -1659,7 +1982,7 @@ library ReserveConfiguration { + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold +- **/ ++ */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold +@@ -1675,7 +1998,7 @@ library ReserveConfiguration { + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold +- **/ ++ */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { +@@ -1686,7 +2009,7 @@ library ReserveConfiguration { + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus +- **/ ++ */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus +@@ -1702,7 +2025,7 @@ library ReserveConfiguration { + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus +- **/ ++ */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { +@@ -1713,7 +2036,7 @@ library ReserveConfiguration { + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals +- **/ ++ */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals +@@ -1727,7 +2050,7 @@ library ReserveConfiguration { + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset +- **/ ++ */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { +@@ -1738,7 +2061,7 @@ library ReserveConfiguration { + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state +- **/ ++ */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | +@@ -1749,7 +2072,7 @@ library ReserveConfiguration { + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state +- **/ ++ */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } +@@ -1758,7 +2081,7 @@ library ReserveConfiguration { + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state +- **/ ++ */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | +@@ -1769,7 +2092,7 @@ library ReserveConfiguration { + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state +- **/ ++ */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } +@@ -1778,7 +2101,7 @@ library ReserveConfiguration { + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state +- **/ ++ */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | +@@ -1789,7 +2112,7 @@ library ReserveConfiguration { + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state +- **/ ++ */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } +@@ -1802,7 +2125,7 @@ library ReserveConfiguration { + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable +- **/ ++ */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable +@@ -1820,7 +2143,7 @@ library ReserveConfiguration { + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag +- **/ ++ */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { +@@ -1832,7 +2155,7 @@ library ReserveConfiguration { + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed +- **/ ++ */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed +@@ -1847,7 +2170,7 @@ library ReserveConfiguration { + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag +- **/ ++ */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { +@@ -1858,7 +2181,7 @@ library ReserveConfiguration { + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise +- **/ ++ */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled +@@ -1872,43 +2195,18 @@ library ReserveConfiguration { + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state +- **/ ++ */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + +- /** +- * @notice Enables or disables stable rate borrowing on the reserve +- * @param self The reserve configuration +- * @param enabled True if the stable rate borrowing needs to be enabled, false otherwise +- **/ +- function setStableRateBorrowingEnabled( +- DataTypes.ReserveConfigurationMap memory self, +- bool enabled +- ) internal pure { +- self.data = +- (self.data & STABLE_BORROWING_MASK) | +- (uint256(enabled ? 1 : 0) << STABLE_BORROWING_ENABLED_START_BIT_POSITION); +- } +- +- /** +- * @notice Gets the stable rate borrowing state of the reserve +- * @param self The reserve configuration +- * @return The stable rate borrowing state +- **/ +- function getStableRateBorrowingEnabled( +- DataTypes.ReserveConfigurationMap memory self +- ) internal pure returns (bool) { +- return (self.data & ~STABLE_BORROWING_MASK) != 0; +- } +- + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor +- **/ ++ */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor +@@ -1924,7 +2222,7 @@ library ReserveConfiguration { + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor +- **/ ++ */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { +@@ -1935,7 +2233,7 @@ library ReserveConfiguration { + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap +- **/ ++ */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap +@@ -1949,7 +2247,7 @@ library ReserveConfiguration { + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap +- **/ ++ */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { +@@ -1960,7 +2258,7 @@ library ReserveConfiguration { + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap +- **/ ++ */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap +@@ -1974,7 +2272,7 @@ library ReserveConfiguration { + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap +- **/ ++ */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { +@@ -1985,7 +2283,7 @@ library ReserveConfiguration { + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset +- **/ ++ */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling +@@ -1999,7 +2297,7 @@ library ReserveConfiguration { + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) +- **/ ++ */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { +@@ -2010,7 +2308,7 @@ library ReserveConfiguration { + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee +- **/ ++ */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee +@@ -2029,7 +2327,7 @@ library ReserveConfiguration { + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee +- **/ ++ */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { +@@ -2041,7 +2339,7 @@ library ReserveConfiguration { + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap +- **/ ++ */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap +@@ -2057,7 +2355,7 @@ library ReserveConfiguration { + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap +- **/ ++ */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { +@@ -2065,28 +2363,55 @@ library ReserveConfiguration { + } + + /** +- * @notice Sets the eMode asset category ++ * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration +- * @param category The asset category when the user selects the eMode +- **/ +- function setEModeCategory( ++ * @param flashLoanEnabled True if the asset is flashloanable, false otherwise ++ */ ++ function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, +- uint256 category ++ bool flashLoanEnabled + ) internal pure { +- require(category <= MAX_VALID_EMODE_CATEGORY, Errors.INVALID_EMODE_CATEGORY); ++ self.data = ++ (self.data & FLASHLOAN_ENABLED_MASK) | ++ (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); ++ } ++ ++ /** ++ * @notice Gets the flashloanable flag for the reserve ++ * @param self The reserve configuration ++ * @return The flashloanable flag ++ */ ++ function getFlashLoanEnabled( ++ DataTypes.ReserveConfigurationMap memory self ++ ) internal pure returns (bool) { ++ return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; ++ } + +- self.data = (self.data & EMODE_CATEGORY_MASK) | (category << EMODE_CATEGORY_START_BIT_POSITION); ++ /** ++ * @notice Sets the virtual account active/not state of the reserve ++ * @param self The reserve configuration ++ * @param active The active state ++ */ ++ function setVirtualAccActive( ++ DataTypes.ReserveConfigurationMap memory self, ++ bool active ++ ) internal pure { ++ self.data = ++ (self.data & VIRTUAL_ACC_ACTIVE_MASK) | ++ (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** +- * @dev Gets the eMode asset category ++ * @notice Gets the virtual account active/not state of the reserve ++ * @dev The state should be true for all normal assets and should be false ++ * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration +- * @return The eMode category for the asset +- **/ +- function getEModeCategory( ++ * @return The active state ++ */ ++ function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self +- ) internal pure returns (uint256) { +- return (self.data & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION; ++ ) internal pure returns (bool) { ++ return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** +@@ -2095,19 +2420,17 @@ library ReserveConfiguration { + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled +- * @return The state flag representing stableRateBorrowing enabled + * @return The state flag representing paused +- **/ ++ */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self +- ) internal pure returns (bool, bool, bool, bool, bool) { ++ ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, +- (dataLocal & ~STABLE_BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } +@@ -2120,11 +2443,10 @@ library ReserveConfiguration { + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor +- * @return The state param representing eMode category +- **/ ++ */ + function getParams( + DataTypes.ReserveConfigurationMap memory self +- ) internal pure returns (uint256, uint256, uint256, uint256, uint256, uint256) { ++ ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( +@@ -2132,8 +2454,7 @@ library ReserveConfiguration { + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, +- (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION, +- (dataLocal & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION ++ (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + +@@ -2142,7 +2463,7 @@ library ReserveConfiguration { + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. +- **/ ++ */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { +@@ -2155,7 +2476,7 @@ library ReserveConfiguration { + } + } + +-// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol ++// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/helpers/WalletBalanceProvider.sol + + /** + * @title WalletBalanceProvider contract +@@ -2240,7 +2561,7 @@ contract WalletBalanceProvider { + reservesWithEth[j] + ); + +- (bool isActive, , , , ) = configuration.getFlags(); ++ (bool isActive, , , ) = configuration.getFlags(); + + if (!isActive) { + balances[j] = 0; +``` diff --git a/diffs/ARBITRUM_LINEA/WETH_GATEWAY_DIFF.md b/diffs/ARBITRUM_LINEA/WETH_GATEWAY_DIFF.md new file mode 100644 index 00000000..5c0c8010 --- /dev/null +++ b/diffs/ARBITRUM_LINEA/WETH_GATEWAY_DIFF.md @@ -0,0 +1,159 @@ +```diff +diff --git a/./downloads/ARBITRUM/WETH_GATEWAY.sol b/./downloads/LINEA/WETH_GATEWAY.sol +index 5984e04..cba4608 100644 +--- a/./downloads/ARBITRUM/WETH_GATEWAY.sol ++++ b/./downloads/LINEA/WETH_GATEWAY.sol +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: BUSL-1.1 + pragma solidity ^0.8.0 ^0.8.10; + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol + + /* + * @dev Provides information about the current execution context, including the +@@ -24,7 +24,7 @@ abstract contract Context { + } + } + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + + /** + * @dev Interface of the ERC20 standard as defined in the EIP. +@@ -100,7 +100,7 @@ interface IERC20 { + event Approval(address indexed owner, address indexed spender, uint256 value); + } + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWETH.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWETH.sol + + interface IWETH { + function deposit() external payable; +@@ -112,7 +112,7 @@ interface IWETH { + function transferFrom(address src, address dst, uint256 wad) external returns (bool); + } + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol + + interface IWrappedTokenGatewayV3 { + function depositETH(address pool, address onBehalfOf, uint16 referralCode) external payable; +@@ -134,7 +134,7 @@ interface IWrappedTokenGatewayV3 { + ) external; + } + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAaveIncentivesController.sol + + /** + * @title IAaveIncentivesController +@@ -153,7 +153,7 @@ interface IAaveIncentivesController { + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + } + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPoolAddressesProvider.sol + + /** + * @title IPoolAddressesProvider +@@ -380,7 +380,7 @@ interface IPoolAddressesProvider { + function setPoolDataProvider(address newDataProvider) external; + } + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IScaledBalanceToken.sol + + /** + * @title IScaledBalanceToken +@@ -452,7 +452,7 @@ interface IScaledBalanceToken { + function getPreviousIndex(address user) external view returns (uint256); + } + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/helpers/Errors.sol + + /** + * @title Errors library +@@ -555,7 +555,7 @@ library Errors { + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode + } + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/types/DataTypes.sol + + library DataTypes { + /** +@@ -879,7 +879,7 @@ library DataTypes { + } + } + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + + /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library + /// @author Gnosis Developers +@@ -992,7 +992,7 @@ library GPv2SafeERC20 { + } + } + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol + + /** + * @dev Contract module which provides a basic access control mechanism, where +@@ -1058,7 +1058,7 @@ contract Ownable is Context { + } + } + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPool.sol + + /** + * @title IPool +@@ -1889,7 +1889,7 @@ interface IPool { + function getSupplyLogic() external view returns (address); + } + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + + /** + * @title ReserveConfiguration library +@@ -2470,7 +2470,7 @@ library ReserveConfiguration { + } + } + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + + /** + * @title UserConfiguration library +@@ -2702,7 +2702,7 @@ library UserConfiguration { + } + } + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IInitializableAToken.sol + + /** + * @title IInitializableAToken +@@ -2755,7 +2755,7 @@ interface IInitializableAToken { + ) external; + } + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAToken.sol + + /** + * @title IAToken +@@ -2889,7 +2889,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + function rescueTokens(address token, address to, uint256 amount) external; + } + +-// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/WrappedTokenGatewayV3.sol ++// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/WrappedTokenGatewayV3.sol + + /** + * @dev This contract is an upgrade of the WrappedTokenGatewayV3 contract, with immutable pool address. +``` diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER.sol new file mode 100644 index 00000000..81421916 --- /dev/null +++ b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER.sol @@ -0,0 +1,3226 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol + +/** + * @title IPoolDataProvider + * @author Aave + * @notice Defines the basic interface of a PoolDataProvider + */ +interface IPoolDataProvider { + struct TokenData { + string symbol; + address tokenAddress; + } + + /** + * @notice Returns the address for the PoolAddressesProvider contract. + * @return The address for the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the list of the existing reserves in the pool. + * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. + * @return The list of reserves, pairs of symbols and addresses + */ + function getAllReservesTokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the list of the existing ATokens in the pool. + * @return The list of ATokens, pairs of symbols and addresses + */ + function getAllATokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the configuration data of the reserve + * @dev Not returning borrow and supply caps for compatibility, nor pause flag + * @param asset The address of the underlying asset of the reserve + * @return decimals The number of decimals of the reserve + * @return ltv The ltv of the reserve + * @return liquidationThreshold The liquidationThreshold of the reserve + * @return liquidationBonus The liquidationBonus of the reserve + * @return reserveFactor The reserveFactor of the reserve + * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise + * @return borrowingEnabled True if borrowing is enabled, false otherwise + * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise + * @return isActive True if it is active, false otherwise + * @return isFrozen True if it is frozen, false otherwise + */ + function getReserveConfigurationData( + address asset + ) + external + view + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ); + + /** + * @notice Returns the caps parameters of the reserve + * @param asset The address of the underlying asset of the reserve + * @return borrowCap The borrow cap of the reserve + * @return supplyCap The supply cap of the reserve + */ + function getReserveCaps( + address asset + ) external view returns (uint256 borrowCap, uint256 supplyCap); + + /** + * @notice Returns if the pool is paused + * @param asset The address of the underlying asset of the reserve + * @return isPaused True if the pool is paused, false otherwise + */ + function getPaused(address asset) external view returns (bool isPaused); + + /** + * @notice Returns the siloed borrowing flag + * @param asset The address of the underlying asset of the reserve + * @return True if the asset is siloed for borrowing + */ + function getSiloedBorrowing(address asset) external view returns (bool); + + /** + * @notice Returns the protocol fee on the liquidation bonus + * @param asset The address of the underlying asset of the reserve + * @return The protocol fee on liquidation + */ + function getLiquidationProtocolFee(address asset) external view returns (uint256); + + /** + * @notice Returns the unbacked mint cap of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The unbacked mint cap of the reserve + */ + function getUnbackedMintCap(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The debt ceiling of the reserve + */ + function getDebtCeiling(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling decimals + * @return The debt ceiling decimals + */ + function getDebtCeilingDecimals() external pure returns (uint256); + + /** + * @notice Returns the reserve data + * @param asset The address of the underlying asset of the reserve + * @return unbacked The amount of unbacked tokens + * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted + * @return totalAToken The total supply of the aToken + * @return totalStableDebt The total stable debt of the reserve + * @return totalVariableDebt The total variable debt of the reserve + * @return liquidityRate The liquidity rate of the reserve + * @return variableBorrowRate The variable borrow rate of the reserve + * @return stableBorrowRate The stable borrow rate of the reserve + * @return averageStableBorrowRate The average stable borrow rate of the reserve + * @return liquidityIndex The liquidity index of the reserve + * @return variableBorrowIndex The variable borrow index of the reserve + * @return lastUpdateTimestamp The timestamp of the last update of the reserve + */ + function getReserveData( + address asset + ) + external + view + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ); + + /** + * @notice Returns the total supply of aTokens for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total supply of the aToken + */ + function getATokenTotalSupply(address asset) external view returns (uint256); + + /** + * @notice Returns the total debt for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total debt for asset + */ + function getTotalDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the user data in a reserve + * @param asset The address of the underlying asset of the reserve + * @param user The address of the user + * @return currentATokenBalance The current AToken balance of the user + * @return currentStableDebt The current stable debt of the user + * @return currentVariableDebt The current variable debt of the user + * @return principalStableDebt The principal stable debt of the user + * @return scaledVariableDebt The scaled variable debt of the user + * @return stableBorrowRate The stable borrow rate of the user + * @return liquidityRate The liquidity rate of the reserve + * @return stableRateLastUpdated The timestamp of the last update of the user stable rate + * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false + * otherwise + */ + function getUserReserveData( + address asset, + address user + ) + external + view + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ); + + /** + * @notice Returns the token addresses of the reserve + * @param asset The address of the underlying asset of the reserve + * @return aTokenAddress The AToken address of the reserve + * @return stableDebtTokenAddress DEPRECATED in v3.2.0 + * @return variableDebtTokenAddress The VariableDebtToken address of the reserve + */ + function getReserveTokensAddresses( + address asset + ) + external + view + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ); + + /** + * @notice Returns the address of the Interest Rate strategy + * @param asset The address of the underlying asset of the reserve + * @return irStrategyAddress The address of the Interest Rate strategy + */ + function getInterestRateStrategyAddress( + address asset + ) external view returns (address irStrategyAddress); + + /** + * @notice Returns whether the reserve has FlashLoans enabled or disabled + * @param asset The address of the underlying asset of the reserve + * @return True if FlashLoans are enabled, false otherwise + */ + function getFlashLoanEnabled(address asset) external view returns (bool); + + /** + * @notice Returns whether virtual accounting is enabled/not for a reserve + * @param asset The address of the underlying asset of the reserve + * @return True if active, false otherwise + */ + function getIsVirtualAccActive(address asset) external view returns (bool); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint256); +} + +// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/AaveProtocolDataProvider.sol + +/** + * @title AaveProtocolDataProvider + * @author Aave + * @notice Peripheral contract to collect and pre-process information from the Pool. + */ +contract AaveProtocolDataProvider is IPoolDataProvider { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + + address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; + address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /// @inheritdoc IPoolDataProvider + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @notice Constructor + * @param addressesProvider The address of the PoolAddressesProvider contract + */ + constructor(IPoolAddressesProvider addressesProvider) { + ADDRESSES_PROVIDER = addressesProvider; + } + + /// @inheritdoc IPoolDataProvider + function getAllReservesTokens() external view override returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory reservesTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + if (reserves[i] == MKR) { + reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); + continue; + } + if (reserves[i] == ETH) { + reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); + continue; + } + reservesTokens[i] = TokenData({ + symbol: IERC20Detailed(reserves[i]).symbol(), + tokenAddress: reserves[i] + }); + } + return reservesTokens; + } + + /// @inheritdoc IPoolDataProvider + function getAllATokens() external view override returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory aTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveDataLegacy memory reserveData = pool.getReserveData(reserves[i]); + aTokens[i] = TokenData({ + symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), + tokenAddress: reserveData.aTokenAddress + }); + } + return aTokens; + } + + /// @inheritdoc IPoolDataProvider + function getReserveConfigurationData( + address asset + ) + external + view + override + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ) + { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration + .getParams(); + + (isActive, isFrozen, borrowingEnabled, ) = configuration.getFlags(); + + // @notice all stable debt related parameters deprecated in v3.2.0 + stableBorrowRateEnabled = false; + + usageAsCollateralEnabled = liquidationThreshold != 0; + } + + /// @inheritdoc IPoolDataProvider + function getReserveCaps( + address asset + ) external view override returns (uint256 borrowCap, uint256 supplyCap) { + (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); + } + + /// @inheritdoc IPoolDataProvider + function getPaused(address asset) external view override returns (bool isPaused) { + (, , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); + } + + /// @inheritdoc IPoolDataProvider + function getSiloedBorrowing(address asset) external view override returns (bool) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); + } + + /// @inheritdoc IPoolDataProvider + function getLiquidationProtocolFee(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); + } + + /// @inheritdoc IPoolDataProvider + function getUnbackedMintCap(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); + } + + /// @inheritdoc IPoolDataProvider + function getDebtCeiling(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); + } + + /// @inheritdoc IPoolDataProvider + function getDebtCeilingDecimals() external pure override returns (uint256) { + return ReserveConfiguration.DEBT_CEILING_DECIMALS; + } + + /// @inheritdoc IPoolDataProvider + function getReserveData( + address asset + ) + external + view + override + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + // @notice all stable debt related parameters deprecated in v3.2.0 + return ( + reserve.unbacked, + reserve.accruedToTreasury, + IERC20Detailed(reserve.aTokenAddress).totalSupply(), + 0, + IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), + reserve.currentLiquidityRate, + reserve.currentVariableBorrowRate, + 0, + 0, + reserve.liquidityIndex, + reserve.variableBorrowIndex, + reserve.lastUpdateTimestamp + ); + } + + /// @inheritdoc IPoolDataProvider + function getATokenTotalSupply(address asset) external view override returns (uint256) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.aTokenAddress).totalSupply(); + } + + /// @inheritdoc IPoolDataProvider + function getTotalDebt(address asset) external view override returns (uint256) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); + } + + /// @inheritdoc IPoolDataProvider + function getUserReserveData( + address asset, + address user + ) + external + view + override + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) + .getUserConfiguration(user); + + currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); + currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); + + // @notice all stable debt related parameters deprecated in v3.2.0 + currentStableDebt = principalStableDebt = stableBorrowRate = stableRateLastUpdated = 0; + + scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); + liquidityRate = reserve.currentLiquidityRate; + usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); + } + + /// @inheritdoc IPoolDataProvider + function getReserveTokensAddresses( + address asset + ) + external + view + override + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + // @notice all stable debt related parameters deprecated in v3.2.0 + return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); + } + + /// @inheritdoc IPoolDataProvider + function getInterestRateStrategyAddress( + address asset + ) external view override returns (address irStrategyAddress) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + return (reserve.interestRateStrategyAddress); + } + + /// @inheritdoc IPoolDataProvider + function getFlashLoanEnabled(address asset) external view override returns (bool) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + return configuration.getFlashLoanEnabled(); + } + + /// @inheritdoc IPoolDataProvider + function getIsVirtualAccActive(address asset) external view override returns (bool) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + return configuration.getIsVirtualAccActive(); + } + + /// @inheritdoc IPoolDataProvider + function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); + } +} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/AaveProtocolDataProvider.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/AaveProtocolDataProvider.sol new file mode 100644 index 00000000..671b658b --- /dev/null +++ b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/AaveProtocolDataProvider.sol @@ -0,0 +1,295 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; +import {WadRayMath} from '../protocol/libraries/math/WadRayMath.sol'; +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {IVariableDebtToken} from '../interfaces/IVariableDebtToken.sol'; +import {IPool} from '../interfaces/IPool.sol'; +import {IPoolDataProvider} from '../interfaces/IPoolDataProvider.sol'; + +/** + * @title AaveProtocolDataProvider + * @author Aave + * @notice Peripheral contract to collect and pre-process information from the Pool. + */ +contract AaveProtocolDataProvider is IPoolDataProvider { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + + address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; + address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /// @inheritdoc IPoolDataProvider + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @notice Constructor + * @param addressesProvider The address of the PoolAddressesProvider contract + */ + constructor(IPoolAddressesProvider addressesProvider) { + ADDRESSES_PROVIDER = addressesProvider; + } + + /// @inheritdoc IPoolDataProvider + function getAllReservesTokens() external view override returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory reservesTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + if (reserves[i] == MKR) { + reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); + continue; + } + if (reserves[i] == ETH) { + reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); + continue; + } + reservesTokens[i] = TokenData({ + symbol: IERC20Detailed(reserves[i]).symbol(), + tokenAddress: reserves[i] + }); + } + return reservesTokens; + } + + /// @inheritdoc IPoolDataProvider + function getAllATokens() external view override returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory aTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveDataLegacy memory reserveData = pool.getReserveData(reserves[i]); + aTokens[i] = TokenData({ + symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), + tokenAddress: reserveData.aTokenAddress + }); + } + return aTokens; + } + + /// @inheritdoc IPoolDataProvider + function getReserveConfigurationData( + address asset + ) + external + view + override + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ) + { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration + .getParams(); + + (isActive, isFrozen, borrowingEnabled, ) = configuration.getFlags(); + + // @notice all stable debt related parameters deprecated in v3.2.0 + stableBorrowRateEnabled = false; + + usageAsCollateralEnabled = liquidationThreshold != 0; + } + + /// @inheritdoc IPoolDataProvider + function getReserveCaps( + address asset + ) external view override returns (uint256 borrowCap, uint256 supplyCap) { + (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); + } + + /// @inheritdoc IPoolDataProvider + function getPaused(address asset) external view override returns (bool isPaused) { + (, , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); + } + + /// @inheritdoc IPoolDataProvider + function getSiloedBorrowing(address asset) external view override returns (bool) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); + } + + /// @inheritdoc IPoolDataProvider + function getLiquidationProtocolFee(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); + } + + /// @inheritdoc IPoolDataProvider + function getUnbackedMintCap(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); + } + + /// @inheritdoc IPoolDataProvider + function getDebtCeiling(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); + } + + /// @inheritdoc IPoolDataProvider + function getDebtCeilingDecimals() external pure override returns (uint256) { + return ReserveConfiguration.DEBT_CEILING_DECIMALS; + } + + /// @inheritdoc IPoolDataProvider + function getReserveData( + address asset + ) + external + view + override + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + // @notice all stable debt related parameters deprecated in v3.2.0 + return ( + reserve.unbacked, + reserve.accruedToTreasury, + IERC20Detailed(reserve.aTokenAddress).totalSupply(), + 0, + IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), + reserve.currentLiquidityRate, + reserve.currentVariableBorrowRate, + 0, + 0, + reserve.liquidityIndex, + reserve.variableBorrowIndex, + reserve.lastUpdateTimestamp + ); + } + + /// @inheritdoc IPoolDataProvider + function getATokenTotalSupply(address asset) external view override returns (uint256) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.aTokenAddress).totalSupply(); + } + + /// @inheritdoc IPoolDataProvider + function getTotalDebt(address asset) external view override returns (uint256) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); + } + + /// @inheritdoc IPoolDataProvider + function getUserReserveData( + address asset, + address user + ) + external + view + override + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) + .getUserConfiguration(user); + + currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); + currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); + + // @notice all stable debt related parameters deprecated in v3.2.0 + currentStableDebt = principalStableDebt = stableBorrowRate = stableRateLastUpdated = 0; + + scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); + liquidityRate = reserve.currentLiquidityRate; + usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); + } + + /// @inheritdoc IPoolDataProvider + function getReserveTokensAddresses( + address asset + ) + external + view + override + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + // @notice all stable debt related parameters deprecated in v3.2.0 + return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); + } + + /// @inheritdoc IPoolDataProvider + function getInterestRateStrategyAddress( + address asset + ) external view override returns (address irStrategyAddress) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + return (reserve.interestRateStrategyAddress); + } + + /// @inheritdoc IPoolDataProvider + function getFlashLoanEnabled(address asset) external view override returns (bool) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + return configuration.getFlashLoanEnabled(); + } + + /// @inheritdoc IPoolDataProvider + function getIsVirtualAccActive(address asset) external view override returns (bool) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + return configuration.getIsVirtualAccActive(); + } + + /// @inheritdoc IPoolDataProvider + function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); + } +} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..01e1bcaf --- /dev/null +++ b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol @@ -0,0 +1,833 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol new file mode 100644 index 00000000..a9df8903 --- /dev/null +++ b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol @@ -0,0 +1,250 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPoolDataProvider + * @author Aave + * @notice Defines the basic interface of a PoolDataProvider + */ +interface IPoolDataProvider { + struct TokenData { + string symbol; + address tokenAddress; + } + + /** + * @notice Returns the address for the PoolAddressesProvider contract. + * @return The address for the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the list of the existing reserves in the pool. + * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. + * @return The list of reserves, pairs of symbols and addresses + */ + function getAllReservesTokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the list of the existing ATokens in the pool. + * @return The list of ATokens, pairs of symbols and addresses + */ + function getAllATokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the configuration data of the reserve + * @dev Not returning borrow and supply caps for compatibility, nor pause flag + * @param asset The address of the underlying asset of the reserve + * @return decimals The number of decimals of the reserve + * @return ltv The ltv of the reserve + * @return liquidationThreshold The liquidationThreshold of the reserve + * @return liquidationBonus The liquidationBonus of the reserve + * @return reserveFactor The reserveFactor of the reserve + * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise + * @return borrowingEnabled True if borrowing is enabled, false otherwise + * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise + * @return isActive True if it is active, false otherwise + * @return isFrozen True if it is frozen, false otherwise + */ + function getReserveConfigurationData( + address asset + ) + external + view + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ); + + /** + * @notice Returns the caps parameters of the reserve + * @param asset The address of the underlying asset of the reserve + * @return borrowCap The borrow cap of the reserve + * @return supplyCap The supply cap of the reserve + */ + function getReserveCaps( + address asset + ) external view returns (uint256 borrowCap, uint256 supplyCap); + + /** + * @notice Returns if the pool is paused + * @param asset The address of the underlying asset of the reserve + * @return isPaused True if the pool is paused, false otherwise + */ + function getPaused(address asset) external view returns (bool isPaused); + + /** + * @notice Returns the siloed borrowing flag + * @param asset The address of the underlying asset of the reserve + * @return True if the asset is siloed for borrowing + */ + function getSiloedBorrowing(address asset) external view returns (bool); + + /** + * @notice Returns the protocol fee on the liquidation bonus + * @param asset The address of the underlying asset of the reserve + * @return The protocol fee on liquidation + */ + function getLiquidationProtocolFee(address asset) external view returns (uint256); + + /** + * @notice Returns the unbacked mint cap of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The unbacked mint cap of the reserve + */ + function getUnbackedMintCap(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The debt ceiling of the reserve + */ + function getDebtCeiling(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling decimals + * @return The debt ceiling decimals + */ + function getDebtCeilingDecimals() external pure returns (uint256); + + /** + * @notice Returns the reserve data + * @param asset The address of the underlying asset of the reserve + * @return unbacked The amount of unbacked tokens + * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted + * @return totalAToken The total supply of the aToken + * @return totalStableDebt The total stable debt of the reserve + * @return totalVariableDebt The total variable debt of the reserve + * @return liquidityRate The liquidity rate of the reserve + * @return variableBorrowRate The variable borrow rate of the reserve + * @return stableBorrowRate The stable borrow rate of the reserve + * @return averageStableBorrowRate The average stable borrow rate of the reserve + * @return liquidityIndex The liquidity index of the reserve + * @return variableBorrowIndex The variable borrow index of the reserve + * @return lastUpdateTimestamp The timestamp of the last update of the reserve + */ + function getReserveData( + address asset + ) + external + view + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ); + + /** + * @notice Returns the total supply of aTokens for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total supply of the aToken + */ + function getATokenTotalSupply(address asset) external view returns (uint256); + + /** + * @notice Returns the total debt for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total debt for asset + */ + function getTotalDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the user data in a reserve + * @param asset The address of the underlying asset of the reserve + * @param user The address of the user + * @return currentATokenBalance The current AToken balance of the user + * @return currentStableDebt The current stable debt of the user + * @return currentVariableDebt The current variable debt of the user + * @return principalStableDebt The principal stable debt of the user + * @return scaledVariableDebt The scaled variable debt of the user + * @return stableBorrowRate The stable borrow rate of the user + * @return liquidityRate The liquidity rate of the reserve + * @return stableRateLastUpdated The timestamp of the last update of the user stable rate + * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false + * otherwise + */ + function getUserReserveData( + address asset, + address user + ) + external + view + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ); + + /** + * @notice Returns the token addresses of the reserve + * @param asset The address of the underlying asset of the reserve + * @return aTokenAddress The AToken address of the reserve + * @return stableDebtTokenAddress DEPRECATED in v3.2.0 + * @return variableDebtTokenAddress The VariableDebtToken address of the reserve + */ + function getReserveTokensAddresses( + address asset + ) + external + view + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ); + + /** + * @notice Returns the address of the Interest Rate strategy + * @param asset The address of the underlying asset of the reserve + * @return irStrategyAddress The address of the Interest Rate strategy + */ + function getInterestRateStrategyAddress( + address asset + ) external view returns (address irStrategyAddress); + + /** + * @notice Returns whether the reserve has FlashLoans enabled or disabled + * @param asset The address of the underlying asset of the reserve + * @return True if FlashLoans are enabled, false otherwise + */ + function getFlashLoanEnabled(address asset) external view returns (bool); + + /** + * @notice Returns whether virtual accounting is enabled/not for a reserve + * @param asset The address of the underlying asset of the reserve + * @return True if active, false otherwise + */ + function getIsVirtualAccActive(address asset) external view returns (bool); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..43987f47 --- /dev/null +++ b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,583 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/ACL_MANAGER.sol b/downloads/ARBITRUM/ACL_MANAGER.sol new file mode 100644 index 00000000..9ff4476a --- /dev/null +++ b/downloads/ARBITRUM/ACL_MANAGER.sol @@ -0,0 +1,1066 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity =0.8.10; + +// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol + +/** + * @dev Interface of the ERC165 standard, as defined in the + * https://eips.ethereum.org/EIPS/eip-165[EIP]. + * + * Implementers can declare support of contract interfaces, which can then be + * queried by others ({ERC165Checker}). + * + * For an implementation, see {ERC165}. + */ +interface IERC165 { + /** + * @dev Returns true if this contract implements the interface defined by + * `interfaceId`. See the corresponding + * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] + * to learn more about how these ids are created. + * + * This function call must use less than 30 000 gas. + */ + function supportsInterface(bytes4 interfaceId) external view returns (bool); +} + +// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol + +/** + * @dev String operations. + */ +library Strings { + bytes16 private constant _HEX_SYMBOLS = '0123456789abcdef'; + + /** + * @dev Converts a `uint256` to its ASCII `string` decimal representation. + */ + function toString(uint256 value) internal pure returns (string memory) { + // Inspired by OraclizeAPI's implementation - MIT licence + // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol + + if (value == 0) { + return '0'; + } + uint256 temp = value; + uint256 digits; + while (temp != 0) { + digits++; + temp /= 10; + } + bytes memory buffer = new bytes(digits); + while (value != 0) { + digits -= 1; + buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); + value /= 10; + } + return string(buffer); + } + + /** + * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. + */ + function toHexString(uint256 value) internal pure returns (string memory) { + if (value == 0) { + return '0x00'; + } + uint256 temp = value; + uint256 length = 0; + while (temp != 0) { + length++; + temp >>= 8; + } + return toHexString(value, length); + } + + /** + * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. + */ + function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { + bytes memory buffer = new bytes(2 * length + 2); + buffer[0] = '0'; + buffer[1] = 'x'; + for (uint256 i = 2 * length + 1; i > 1; --i) { + buffer[i] = _HEX_SYMBOLS[value & 0xf]; + value >>= 4; + } + require(value == 0, 'Strings: hex length insufficient'); + return string(buffer); + } +} + +// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + **/ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + **/ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + **/ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + **/ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + **/ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + **/ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + **/ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + **/ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + **/ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' + string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 +} + +// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol + +/** + * @dev Implementation of the {IERC165} interface. + * + * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check + * for the additional interface id that will be supported. For example: + * + * ```solidity + * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); + * } + * ``` + * + * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. + */ +abstract contract ERC165 is IERC165 { + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IERC165).interfaceId; + } +} + +// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + **/ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an admin as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol + +/** + * @dev Contract module that allows children to implement role-based access + * control mechanisms. This is a lightweight version that doesn't allow enumerating role + * members except through off-chain means by accessing the contract event logs. Some + * applications may benefit from on-chain enumerability, for those cases see + * {AccessControlEnumerable}. + * + * Roles are referred to by their `bytes32` identifier. These should be exposed + * in the external API and be unique. The best way to achieve this is by + * using `public constant` hash digests: + * + * ``` + * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); + * ``` + * + * Roles can be used to represent a set of permissions. To restrict access to a + * function call, use {hasRole}: + * + * ``` + * function foo() public { + * require(hasRole(MY_ROLE, msg.sender)); + * ... + * } + * ``` + * + * Roles can be granted and revoked dynamically via the {grantRole} and + * {revokeRole} functions. Each role has an associated admin role, and only + * accounts that have a role's admin role can call {grantRole} and {revokeRole}. + * + * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means + * that only accounts with this role will be able to grant or revoke other + * roles. More complex role relationships can be created by using + * {_setRoleAdmin}. + * + * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to + * grant and revoke this role. Extra precautions should be taken to secure + * accounts that have been granted it. + */ +abstract contract AccessControl is Context, IAccessControl, ERC165 { + struct RoleData { + mapping(address => bool) members; + bytes32 adminRole; + } + + mapping(bytes32 => RoleData) private _roles; + + bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; + + /** + * @dev Modifier that checks that an account has a specific role. Reverts + * with a standardized message including the required role. + * + * The format of the revert reason is given by the following regular expression: + * + * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ + * + * _Available since v4.1._ + */ + modifier onlyRole(bytes32 role) { + _checkRole(role, _msgSender()); + _; + } + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); + } + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) public view override returns (bool) { + return _roles[role].members[account]; + } + + /** + * @dev Revert with a standard message if `account` is missing `role`. + * + * The format of the revert reason is given by the following regular expression: + * + * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ + */ + function _checkRole(bytes32 role, address account) internal view { + if (!hasRole(role, account)) { + revert( + string( + abi.encodePacked( + 'AccessControl: account ', + Strings.toHexString(uint160(account), 20), + ' is missing role ', + Strings.toHexString(uint256(role), 32) + ) + ) + ); + } + } + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) public view override returns (bytes32) { + return _roles[role].adminRole; + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole( + bytes32 role, + address account + ) public virtual override onlyRole(getRoleAdmin(role)) { + _grantRole(role, account); + } + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole( + bytes32 role, + address account + ) public virtual override onlyRole(getRoleAdmin(role)) { + _revokeRole(role, account); + } + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) public virtual override { + require(account == _msgSender(), 'AccessControl: can only renounce roles for self'); + + _revokeRole(role, account); + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. Note that unlike {grantRole}, this function doesn't perform any + * checks on the calling account. + * + * [WARNING] + * ==== + * This function should only be called from the constructor when setting + * up the initial roles for the system. + * + * Using this function in any other way is effectively circumventing the admin + * system imposed by {AccessControl}. + * ==== + */ + function _setupRole(bytes32 role, address account) internal virtual { + _grantRole(role, account); + } + + /** + * @dev Sets `adminRole` as ``role``'s admin role. + * + * Emits a {RoleAdminChanged} event. + */ + function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { + bytes32 previousAdminRole = getRoleAdmin(role); + _roles[role].adminRole = adminRole; + emit RoleAdminChanged(role, previousAdminRole, adminRole); + } + + function _grantRole(bytes32 role, address account) private { + if (!hasRole(role, account)) { + _roles[role].members[account] = true; + emit RoleGranted(role, account, _msgSender()); + } + } + + function _revokeRole(bytes32 role, address account) private { + if (hasRole(role, account)) { + _roles[role].members[account] = false; + emit RoleRevoked(role, account, _msgSender()); + } + } +} + +// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol + +/** + * @title ACLManager + * @author Aave + * @notice Access Control List Manager. Main registry of system roles and permissions. + */ +contract ACLManager is AccessControl, IACLManager { + bytes32 public constant override POOL_ADMIN_ROLE = keccak256('POOL_ADMIN'); + bytes32 public constant override EMERGENCY_ADMIN_ROLE = keccak256('EMERGENCY_ADMIN'); + bytes32 public constant override RISK_ADMIN_ROLE = keccak256('RISK_ADMIN'); + bytes32 public constant override FLASH_BORROWER_ROLE = keccak256('FLASH_BORROWER'); + bytes32 public constant override BRIDGE_ROLE = keccak256('BRIDGE'); + bytes32 public constant override ASSET_LISTING_ADMIN_ROLE = keccak256('ASSET_LISTING_ADMIN'); + + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @dev Constructor + * @dev The ACL admin should be initialized at the addressesProvider beforehand + * @param provider The address of the PoolAddressesProvider + */ + constructor(IPoolAddressesProvider provider) { + ADDRESSES_PROVIDER = provider; + address aclAdmin = provider.getACLAdmin(); + require(aclAdmin != address(0), Errors.ACL_ADMIN_CANNOT_BE_ZERO); + _setupRole(DEFAULT_ADMIN_ROLE, aclAdmin); + } + + /// @inheritdoc IACLManager + function setRoleAdmin( + bytes32 role, + bytes32 adminRole + ) external override onlyRole(DEFAULT_ADMIN_ROLE) { + _setRoleAdmin(role, adminRole); + } + + /// @inheritdoc IACLManager + function addPoolAdmin(address admin) external override { + grantRole(POOL_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removePoolAdmin(address admin) external override { + revokeRole(POOL_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isPoolAdmin(address admin) external view override returns (bool) { + return hasRole(POOL_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function addEmergencyAdmin(address admin) external override { + grantRole(EMERGENCY_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removeEmergencyAdmin(address admin) external override { + revokeRole(EMERGENCY_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isEmergencyAdmin(address admin) external view override returns (bool) { + return hasRole(EMERGENCY_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function addRiskAdmin(address admin) external override { + grantRole(RISK_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removeRiskAdmin(address admin) external override { + revokeRole(RISK_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isRiskAdmin(address admin) external view override returns (bool) { + return hasRole(RISK_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function addFlashBorrower(address borrower) external override { + grantRole(FLASH_BORROWER_ROLE, borrower); + } + + /// @inheritdoc IACLManager + function removeFlashBorrower(address borrower) external override { + revokeRole(FLASH_BORROWER_ROLE, borrower); + } + + /// @inheritdoc IACLManager + function isFlashBorrower(address borrower) external view override returns (bool) { + return hasRole(FLASH_BORROWER_ROLE, borrower); + } + + /// @inheritdoc IACLManager + function addBridge(address bridge) external override { + grantRole(BRIDGE_ROLE, bridge); + } + + /// @inheritdoc IACLManager + function removeBridge(address bridge) external override { + revokeRole(BRIDGE_ROLE, bridge); + } + + /// @inheritdoc IACLManager + function isBridge(address bridge) external view override returns (bool) { + return hasRole(BRIDGE_ROLE, bridge); + } + + /// @inheritdoc IACLManager + function addAssetListingAdmin(address admin) external override { + grantRole(ASSET_LISTING_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removeAssetListingAdmin(address admin) external override { + revokeRole(ASSET_LISTING_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isAssetListingAdmin(address admin) external view override returns (bool) { + return hasRole(ASSET_LISTING_ADMIN_ROLE, admin); + } +} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol new file mode 100644 index 00000000..d7834c71 --- /dev/null +++ b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.10; + +import './IAccessControl.sol'; +import './Context.sol'; +import './Strings.sol'; +import './ERC165.sol'; + +/** + * @dev Contract module that allows children to implement role-based access + * control mechanisms. This is a lightweight version that doesn't allow enumerating role + * members except through off-chain means by accessing the contract event logs. Some + * applications may benefit from on-chain enumerability, for those cases see + * {AccessControlEnumerable}. + * + * Roles are referred to by their `bytes32` identifier. These should be exposed + * in the external API and be unique. The best way to achieve this is by + * using `public constant` hash digests: + * + * ``` + * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); + * ``` + * + * Roles can be used to represent a set of permissions. To restrict access to a + * function call, use {hasRole}: + * + * ``` + * function foo() public { + * require(hasRole(MY_ROLE, msg.sender)); + * ... + * } + * ``` + * + * Roles can be granted and revoked dynamically via the {grantRole} and + * {revokeRole} functions. Each role has an associated admin role, and only + * accounts that have a role's admin role can call {grantRole} and {revokeRole}. + * + * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means + * that only accounts with this role will be able to grant or revoke other + * roles. More complex role relationships can be created by using + * {_setRoleAdmin}. + * + * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to + * grant and revoke this role. Extra precautions should be taken to secure + * accounts that have been granted it. + */ +abstract contract AccessControl is Context, IAccessControl, ERC165 { + struct RoleData { + mapping(address => bool) members; + bytes32 adminRole; + } + + mapping(bytes32 => RoleData) private _roles; + + bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; + + /** + * @dev Modifier that checks that an account has a specific role. Reverts + * with a standardized message including the required role. + * + * The format of the revert reason is given by the following regular expression: + * + * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ + * + * _Available since v4.1._ + */ + modifier onlyRole(bytes32 role) { + _checkRole(role, _msgSender()); + _; + } + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); + } + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) public view override returns (bool) { + return _roles[role].members[account]; + } + + /** + * @dev Revert with a standard message if `account` is missing `role`. + * + * The format of the revert reason is given by the following regular expression: + * + * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ + */ + function _checkRole(bytes32 role, address account) internal view { + if (!hasRole(role, account)) { + revert( + string( + abi.encodePacked( + 'AccessControl: account ', + Strings.toHexString(uint160(account), 20), + ' is missing role ', + Strings.toHexString(uint256(role), 32) + ) + ) + ); + } + } + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) public view override returns (bytes32) { + return _roles[role].adminRole; + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) + public + virtual + override + onlyRole(getRoleAdmin(role)) + { + _grantRole(role, account); + } + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) + public + virtual + override + onlyRole(getRoleAdmin(role)) + { + _revokeRole(role, account); + } + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) public virtual override { + require(account == _msgSender(), 'AccessControl: can only renounce roles for self'); + + _revokeRole(role, account); + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. Note that unlike {grantRole}, this function doesn't perform any + * checks on the calling account. + * + * [WARNING] + * ==== + * This function should only be called from the constructor when setting + * up the initial roles for the system. + * + * Using this function in any other way is effectively circumventing the admin + * system imposed by {AccessControl}. + * ==== + */ + function _setupRole(bytes32 role, address account) internal virtual { + _grantRole(role, account); + } + + /** + * @dev Sets `adminRole` as ``role``'s admin role. + * + * Emits a {RoleAdminChanged} event. + */ + function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { + bytes32 previousAdminRole = getRoleAdmin(role); + _roles[role].adminRole = adminRole; + emit RoleAdminChanged(role, previousAdminRole, adminRole); + } + + function _grantRole(bytes32 role, address account) private { + if (!hasRole(role, account)) { + _roles[role].members[account] = true; + emit RoleGranted(role, account, _msgSender()); + } + } + + function _revokeRole(bytes32 role, address account) private { + if (hasRole(role, account)) { + _roles[role].members[account] = false; + emit RoleRevoked(role, account, _msgSender()); + } + } +} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..445ee640 --- /dev/null +++ b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol new file mode 100644 index 00000000..15336e7e --- /dev/null +++ b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.10; + +import './IERC165.sol'; + +/** + * @dev Implementation of the {IERC165} interface. + * + * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check + * for the additional interface id that will be supported. For example: + * + * ```solidity + * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); + * } + * ``` + * + * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. + */ +abstract contract ERC165 is IERC165 { + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IERC165).interfaceId; + } +} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..c6f35263 --- /dev/null +++ b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol new file mode 100644 index 00000000..ce3c290e --- /dev/null +++ b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.10; + +/** + * @dev Interface of the ERC165 standard, as defined in the + * https://eips.ethereum.org/EIPS/eip-165[EIP]. + * + * Implementers can declare support of contract interfaces, which can then be + * queried by others ({ERC165Checker}). + * + * For an implementation, see {ERC165}. + */ +interface IERC165 { + /** + * @dev Returns true if this contract implements the interface defined by + * `interfaceId`. See the corresponding + * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] + * to learn more about how these ids are created. + * + * This function call must use less than 30 000 gas. + */ + function supportsInterface(bytes4 interfaceId) external view returns (bool); +} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol new file mode 100644 index 00000000..bcb1ee6a --- /dev/null +++ b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.10; + +/** + * @dev String operations. + */ +library Strings { + bytes16 private constant _HEX_SYMBOLS = '0123456789abcdef'; + + /** + * @dev Converts a `uint256` to its ASCII `string` decimal representation. + */ + function toString(uint256 value) internal pure returns (string memory) { + // Inspired by OraclizeAPI's implementation - MIT licence + // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol + + if (value == 0) { + return '0'; + } + uint256 temp = value; + uint256 digits; + while (temp != 0) { + digits++; + temp /= 10; + } + bytes memory buffer = new bytes(digits); + while (value != 0) { + digits -= 1; + buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); + value /= 10; + } + return string(buffer); + } + + /** + * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. + */ + function toHexString(uint256 value) internal pure returns (string memory) { + if (value == 0) { + return '0x00'; + } + uint256 temp = value; + uint256 length = 0; + while (temp != 0) { + length++; + temp >>= 8; + } + return toHexString(value, length); + } + + /** + * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. + */ + function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { + bytes memory buffer = new bytes(2 * length + 2); + buffer[0] = '0'; + buffer[1] = 'x'; + for (uint256 i = 2 * length + 1; i > 1; --i) { + buffer[i] = _HEX_SYMBOLS[value & 0xf]; + value >>= 4; + } + require(value == 0, 'Strings: hex length insufficient'); + return string(buffer); + } +} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..4bb6e645 --- /dev/null +++ b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + **/ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an admin as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..01a126bd --- /dev/null +++ b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + **/ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + **/ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + **/ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + **/ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + **/ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + **/ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + **/ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + **/ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + **/ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol new file mode 100644 index 00000000..7b03541d --- /dev/null +++ b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {AccessControl} from '../../dependencies/openzeppelin/contracts/AccessControl.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {IACLManager} from '../../interfaces/IACLManager.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; + +/** + * @title ACLManager + * @author Aave + * @notice Access Control List Manager. Main registry of system roles and permissions. + */ +contract ACLManager is AccessControl, IACLManager { + bytes32 public constant override POOL_ADMIN_ROLE = keccak256('POOL_ADMIN'); + bytes32 public constant override EMERGENCY_ADMIN_ROLE = keccak256('EMERGENCY_ADMIN'); + bytes32 public constant override RISK_ADMIN_ROLE = keccak256('RISK_ADMIN'); + bytes32 public constant override FLASH_BORROWER_ROLE = keccak256('FLASH_BORROWER'); + bytes32 public constant override BRIDGE_ROLE = keccak256('BRIDGE'); + bytes32 public constant override ASSET_LISTING_ADMIN_ROLE = keccak256('ASSET_LISTING_ADMIN'); + + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @dev Constructor + * @dev The ACL admin should be initialized at the addressesProvider beforehand + * @param provider The address of the PoolAddressesProvider + */ + constructor(IPoolAddressesProvider provider) { + ADDRESSES_PROVIDER = provider; + address aclAdmin = provider.getACLAdmin(); + require(aclAdmin != address(0), Errors.ACL_ADMIN_CANNOT_BE_ZERO); + _setupRole(DEFAULT_ADMIN_ROLE, aclAdmin); + } + + /// @inheritdoc IACLManager + function setRoleAdmin(bytes32 role, bytes32 adminRole) + external + override + onlyRole(DEFAULT_ADMIN_ROLE) + { + _setRoleAdmin(role, adminRole); + } + + /// @inheritdoc IACLManager + function addPoolAdmin(address admin) external override { + grantRole(POOL_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removePoolAdmin(address admin) external override { + revokeRole(POOL_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isPoolAdmin(address admin) external view override returns (bool) { + return hasRole(POOL_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function addEmergencyAdmin(address admin) external override { + grantRole(EMERGENCY_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removeEmergencyAdmin(address admin) external override { + revokeRole(EMERGENCY_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isEmergencyAdmin(address admin) external view override returns (bool) { + return hasRole(EMERGENCY_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function addRiskAdmin(address admin) external override { + grantRole(RISK_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removeRiskAdmin(address admin) external override { + revokeRole(RISK_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isRiskAdmin(address admin) external view override returns (bool) { + return hasRole(RISK_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function addFlashBorrower(address borrower) external override { + grantRole(FLASH_BORROWER_ROLE, borrower); + } + + /// @inheritdoc IACLManager + function removeFlashBorrower(address borrower) external override { + revokeRole(FLASH_BORROWER_ROLE, borrower); + } + + /// @inheritdoc IACLManager + function isFlashBorrower(address borrower) external view override returns (bool) { + return hasRole(FLASH_BORROWER_ROLE, borrower); + } + + /// @inheritdoc IACLManager + function addBridge(address bridge) external override { + grantRole(BRIDGE_ROLE, bridge); + } + + /// @inheritdoc IACLManager + function removeBridge(address bridge) external override { + revokeRole(BRIDGE_ROLE, bridge); + } + + /// @inheritdoc IACLManager + function isBridge(address bridge) external view override returns (bool) { + return hasRole(BRIDGE_ROLE, bridge); + } + + /// @inheritdoc IACLManager + function addAssetListingAdmin(address admin) external override { + grantRole(ASSET_LISTING_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removeAssetListingAdmin(address admin) external override { + revokeRole(ASSET_LISTING_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isAssetListingAdmin(address admin) external view override returns (bool) { + return hasRole(ASSET_LISTING_ADMIN_ROLE, admin); + } +} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..640e4632 --- /dev/null +++ b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' + string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC.sol b/downloads/ARBITRUM/BORROW_LOGIC.sol new file mode 100644 index 00000000..58a89291 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC.sol @@ -0,0 +1,5815 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} + +// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol + +/** + * @title BorrowLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to borrowing + */ +library BorrowLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the + * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the + * isolated debt. + * @dev Emits the `Borrow()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the borrow function + */ + function executeBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteBorrowParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ( + bool isolationModeActive, + address isolationModeCollateralAddress, + uint256 isolationModeDebtCeiling + ) = userConfig.getIsolationModeState(reservesData, reservesList); + + ValidationLogic.validateBorrow( + reservesData, + reservesList, + eModeCategories, + DataTypes.ValidateBorrowParams({ + reserveCache: reserveCache, + userConfig: userConfig, + asset: params.asset, + userAddress: params.onBehalfOf, + amount: params.amount, + interestRateMode: params.interestRateMode, + reservesCount: params.reservesCount, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory, + priceOracleSentinel: params.priceOracleSentinel, + isolationModeActive: isolationModeActive, + isolationModeCollateralAddress: isolationModeCollateralAddress, + isolationModeDebtCeiling: isolationModeDebtCeiling + }) + ); + + bool isFirstBorrowing = false; + + (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); + + if (isFirstBorrowing) { + userConfig.setBorrowing(reserve.id, true); + } + + if (isolationModeActive) { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt += (params.amount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + 0, + params.releaseUnderlying ? params.amount : 0 + ); + + if (params.releaseUnderlying) { + IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); + } + + emit Borrow( + params.asset, + params.user, + params.onBehalfOf, + params.amount, + DataTypes.InterestRateMode.VARIABLE, + reserve.currentVariableBorrowRate, + params.referralCode + ); + } + + /** + * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the + * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also + * reduces the isolated debt. + * @dev Emits the `Repay()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the repay function + * @return The actual amount being repaid + */ + function executeRepay( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteRepayParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + + uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( + params.onBehalfOf + ); + + ValidationLogic.validateRepay( + reserveCache, + params.amount, + params.interestRateMode, + params.onBehalfOf, + variableDebt + ); + + uint256 paybackAmount = variableDebt; + + // Allows a user to repay with aTokens without leaving dust from interest. + if (params.useATokens && params.amount == type(uint256).max) { + params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); + } + + if (params.amount < paybackAmount) { + paybackAmount = params.amount; + } + + reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) + .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + params.useATokens ? 0 : paybackAmount, + 0 + ); + + if (variableDebt - paybackAmount == 0) { + userConfig.setBorrowing(reserve.id, false); + } + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + reserveCache, + paybackAmount + ); + + if (params.useATokens) { + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + reserveCache.aTokenAddress, + paybackAmount, + reserveCache.nextLiquidityIndex + ); + // in case of aToken repayment the msg.sender must always repay on behalf of itself + if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + } else { + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); + IAToken(reserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.onBehalfOf, + paybackAmount + ); + } + + emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); + + return paybackAmount; + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..01e1bcaf --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol @@ -0,0 +1,833 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..e7ba8f7a --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..43987f47 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,583 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol new file mode 100644 index 00000000..c4ed26ed --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {IsolationModeLogic} from './IsolationModeLogic.sol'; + +/** + * @title BorrowLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to borrowing + */ +library BorrowLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the + * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the + * isolated debt. + * @dev Emits the `Borrow()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the borrow function + */ + function executeBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteBorrowParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ( + bool isolationModeActive, + address isolationModeCollateralAddress, + uint256 isolationModeDebtCeiling + ) = userConfig.getIsolationModeState(reservesData, reservesList); + + ValidationLogic.validateBorrow( + reservesData, + reservesList, + eModeCategories, + DataTypes.ValidateBorrowParams({ + reserveCache: reserveCache, + userConfig: userConfig, + asset: params.asset, + userAddress: params.onBehalfOf, + amount: params.amount, + interestRateMode: params.interestRateMode, + reservesCount: params.reservesCount, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory, + priceOracleSentinel: params.priceOracleSentinel, + isolationModeActive: isolationModeActive, + isolationModeCollateralAddress: isolationModeCollateralAddress, + isolationModeDebtCeiling: isolationModeDebtCeiling + }) + ); + + bool isFirstBorrowing = false; + + (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); + + if (isFirstBorrowing) { + userConfig.setBorrowing(reserve.id, true); + } + + if (isolationModeActive) { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt += (params.amount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + 0, + params.releaseUnderlying ? params.amount : 0 + ); + + if (params.releaseUnderlying) { + IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); + } + + emit Borrow( + params.asset, + params.user, + params.onBehalfOf, + params.amount, + DataTypes.InterestRateMode.VARIABLE, + reserve.currentVariableBorrowRate, + params.referralCode + ); + } + + /** + * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the + * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also + * reduces the isolated debt. + * @dev Emits the `Repay()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the repay function + * @return The actual amount being repaid + */ + function executeRepay( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteRepayParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + + uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( + params.onBehalfOf + ); + + ValidationLogic.validateRepay( + reserveCache, + params.amount, + params.interestRateMode, + params.onBehalfOf, + variableDebt + ); + + uint256 paybackAmount = variableDebt; + + // Allows a user to repay with aTokens without leaving dust from interest. + if (params.useATokens && params.amount == type(uint256).max) { + params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); + } + + if (params.amount < paybackAmount) { + paybackAmount = params.amount; + } + + reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) + .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + params.useATokens ? 0 : paybackAmount, + 0 + ); + + if (variableDebt - paybackAmount == 0) { + userConfig.setBorrowing(reserve.id, false); + } + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + reserveCache, + paybackAmount + ); + + if (params.useATokens) { + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + reserveCache.aTokenAddress, + paybackAmount, + reserveCache.nextLiquidityIndex + ); + // in case of aToken repayment the msg.sender must always repay on behalf of itself + if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + } else { + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); + IAToken(reserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.onBehalfOf, + paybackAmount + ); + } + + emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); + + return paybackAmount; + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..647fc7e7 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..cd5b83c6 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol new file mode 100644 index 00000000..473840ea --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..dd5c637d --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..e08a30e8 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,642 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..9adca939 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC.sol b/downloads/ARBITRUM/BRIDGE_LOGIC.sol new file mode 100644 index 00000000..9220f632 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC.sol @@ -0,0 +1,5671 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} + +// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol + +library BridgeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. + * @dev Essentially a supply without transferring the underlying. + * @dev Emits the `MintUnbacked` event + * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param asset The address of the underlying asset to mint aTokens of + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function executeMintUnbacked( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, reserve, amount, onBehalfOf); + + uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); + uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); + + uint256 unbacked = reserve.unbacked += amount.toUint128(); + + require( + unbacked <= unbackedMintCap * (10 ** reserveDecimals), + Errors.UNBACKED_MINT_CAP_EXCEEDED + ); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, 0, 0); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + onBehalfOf, + amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration, + reserveCache.aTokenAddress + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); + } + } + + emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); + } + + /** + * @notice Back the current unbacked with `amount` and pay `fee`. + * @dev It is not possible to back more than the existing unbacked amount of the reserve + * @dev Emits the `BackUnbacked` event + * @param reserve The reserve to back unbacked for + * @param asset The address of the underlying asset to repay + * @param amount The amount to back + * @param fee The amount paid in fees + * @param protocolFeeBps The fraction of fees in basis points paid to the protocol + * @return The backed amount + */ + function executeBackUnbacked( + DataTypes.ReserveData storage reserve, + address asset, + uint256 amount, + uint256 fee, + uint256 protocolFeeBps + ) external returns (uint256) { + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; + + uint256 feeToProtocol = fee.percentMul(protocolFeeBps); + uint256 feeToLP = fee - feeToProtocol; + uint256 added = backingAmount + fee; + + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply() + + uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), + feeToLP + ); + + reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + + reserve.unbacked -= backingAmount.toUint128(); + reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, added, 0); + + IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); + + emit BackUnbacked(asset, msg.sender, backingAmount, fee); + + return backingAmount; + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..01e1bcaf --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol @@ -0,0 +1,833 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..e7ba8f7a --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..43987f47 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,583 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol new file mode 100644 index 00000000..3b4d469b --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +library BridgeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. + * @dev Essentially a supply without transferring the underlying. + * @dev Emits the `MintUnbacked` event + * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param asset The address of the underlying asset to mint aTokens of + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function executeMintUnbacked( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, reserve, amount, onBehalfOf); + + uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); + uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); + + uint256 unbacked = reserve.unbacked += amount.toUint128(); + + require( + unbacked <= unbackedMintCap * (10 ** reserveDecimals), + Errors.UNBACKED_MINT_CAP_EXCEEDED + ); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, 0, 0); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + onBehalfOf, + amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration, + reserveCache.aTokenAddress + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); + } + } + + emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); + } + + /** + * @notice Back the current unbacked with `amount` and pay `fee`. + * @dev It is not possible to back more than the existing unbacked amount of the reserve + * @dev Emits the `BackUnbacked` event + * @param reserve The reserve to back unbacked for + * @param asset The address of the underlying asset to repay + * @param amount The amount to back + * @param fee The amount paid in fees + * @param protocolFeeBps The fraction of fees in basis points paid to the protocol + * @return The backed amount + */ + function executeBackUnbacked( + DataTypes.ReserveData storage reserve, + address asset, + uint256 amount, + uint256 fee, + uint256 protocolFeeBps + ) external returns (uint256) { + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; + + uint256 feeToProtocol = fee.percentMul(protocolFeeBps); + uint256 feeToLP = fee - feeToProtocol; + uint256 added = backingAmount + fee; + + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply() + + uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), + feeToLP + ); + + reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + + reserve.unbacked -= backingAmount.toUint128(); + reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, added, 0); + + IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); + + emit BackUnbacked(asset, msg.sender, backingAmount, fee); + + return backingAmount; + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..647fc7e7 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..cd5b83c6 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..dd5c637d --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..e08a30e8 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,642 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..9adca939 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL.sol b/downloads/ARBITRUM/COLLECTOR_IMPL.sol new file mode 100644 index 00000000..752e048f --- /dev/null +++ b/downloads/ARBITRUM/COLLECTOR_IMPL.sol @@ -0,0 +1,1161 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0 ^0.8.0 ^0.8.1; + +// downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/ReentrancyGuard.sol + +// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) + +/** + * @dev Contract module that helps prevent reentrant calls to a function. + * + * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier + * available, which can be applied to functions to make sure there are no nested + * (reentrant) calls to them. + * + * Note that because there is a single `nonReentrant` guard, functions marked as + * `nonReentrant` may not call one another. This can be worked around by making + * those functions `private`, and then adding `external` `nonReentrant` entry + * points to them. + * + * TIP: If you would like to learn more about reentrancy and alternative ways + * to protect against it, check out our blog post + * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. + */ +abstract contract ReentrancyGuard { + // Booleans are more expensive than uint256 or any type that takes up a full + // word because each write operation emits an extra SLOAD to first read the + // slot's contents, replace the bits taken up by the boolean, and then write + // back. This is the compiler's defense against contract upgrades and + // pointer aliasing, and it cannot be disabled. + + // The values being non-zero value makes deployment a bit more expensive, + // but in exchange the refund on every call to nonReentrant will be lower in + // amount. Since refunds are capped to a percentage of the total + // transaction's gas, it is best to keep them low in cases like this one, to + // increase the likelihood of the full refund coming into effect. + uint256 private constant _NOT_ENTERED = 1; + uint256 private constant _ENTERED = 2; + + uint256 private _status; + + constructor() { + _status = _NOT_ENTERED; + } + + /** + * @dev Prevents a contract from calling itself, directly or indirectly. + * Calling a `nonReentrant` function from another `nonReentrant` + * function is not supported. It is possible to prevent this from happening + * by making the `nonReentrant` function external, and making it call a + * `private` function that does the actual work. + */ + modifier nonReentrant() { + // On the first call to nonReentrant, _notEntered will be true + require(_status != _ENTERED, 'ReentrancyGuard: reentrant call'); + + // Any calls to nonReentrant after this point will fail + _status = _ENTERED; + + _; + + // By storing the original value once again, a refund is triggered (see + // https://eips.ethereum.org/EIPS/eip-2200) + _status = _NOT_ENTERED; + } + + /** + * @dev As we use the guard with the proxy we need to init it with the empty value + */ + function _initGuard() internal { + _status = _NOT_ENTERED; + } +} + +// downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/VersionedInitializable.sol + +/** + * @title VersionedInitializable + * + * @dev Helper contract to support initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + * + * @author Aave, inspired by the OpenZeppelin Initializable contract + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 internal lastInitializedRevision = 0; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require(revision > lastInitializedRevision, 'Contract instance has already been initialized'); + + lastInitializedRevision = revision; + + _; + } + + /// @dev returns the revision number of the contract. + /// Needs to be defined in the inherited class as a constant. + function getRevision() internal pure virtual returns (uint256); + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} + +// lib/solidity-utils/src/contracts/oz-common/Address.sol + +// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) +// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/8b778fa20d6d76340c5fac1ed66c80273f05b95a + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + * + * [IMPORTANT] + * ==== + * You shouldn't rely on `isContract` to protect against flash loan attacks! + * + * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets + * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract + * constructor. + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize/address.code.length, which returns 0 + // for contracts in construction, since the code is only stored at the end + // of the constructor execution. + + return account.code.length > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResultFromTarget(target, success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResultFromTarget(target, success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResultFromTarget(target, success, returndata, errorMessage); + } + + /** + * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling + * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. + * + * _Available since v4.8._ + */ + function verifyCallResultFromTarget( + address target, + bool success, + bytes memory returndata, + string memory errorMessage + ) internal view returns (bytes memory) { + if (success) { + if (returndata.length == 0) { + // only check isContract if the call was successful and the return data is empty + // otherwise we already know that it was a contract + require(isContract(target), 'Address: call to non-contract'); + } + return returndata; + } else { + _revert(returndata, errorMessage); + } + } + + /** + * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason or using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + _revert(returndata, errorMessage); + } + } + + function _revert(bytes memory returndata, string memory errorMessage) private pure { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + /// @solidity memory-safe-assembly + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } +} + +// lib/solidity-utils/src/contracts/oz-common/interfaces/IERC20.sol + +// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) +// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/a035b235b4f2c9af4ba88edc4447f02e37f8d124 + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); + + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `to`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address to, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `from` to `to` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address from, address to, uint256 amount) external returns (bool); +} + +// lib/solidity-utils/src/contracts/oz-common/interfaces/IERC20Permit.sol + +// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) +// Modified from https://github.com/OpenZeppelin/openzeppelin-contracts/commit/00cbf5a236564c3b7aacdad1f378cae22d890ca6 + +/** + * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in + * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. + * + * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by + * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't + * need to send a transaction, and thus is not required to hold Ether at all. + */ +interface IERC20Permit { + /** + * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, + * given ``owner``'s signed approval. + * + * IMPORTANT: The same issues {IERC20-approve} has related to transaction + * ordering also apply here. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `spender` cannot be the zero address. + * - `deadline` must be a timestamp in the future. + * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` + * over the EIP712-formatted function arguments. + * - the signature must use ``owner``'s current nonce (see {nonces}). + * + * For more information on the signature format, see the + * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP + * section]. + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @dev Returns the current nonce for `owner`. This value must be + * included whenever a signature is generated for {permit}. + * + * Every successful call to {permit} increases ``owner``'s nonce by one. This + * prevents a signature from being used multiple times. + */ + function nonces(address owner) external view returns (uint256); + + /** + * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. + */ + // solhint-disable-next-line func-name-mixedcase + function DOMAIN_SEPARATOR() external view returns (bytes32); +} + +// downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/interfaces/ICollector.sol + +interface ICollector { + struct Stream { + uint256 deposit; + uint256 ratePerSecond; + uint256 remainingBalance; + uint256 startTime; + uint256 stopTime; + address recipient; + address sender; + address tokenAddress; + bool isEntity; + } + + /** @notice Emitted when the funds admin changes + * @param fundsAdmin The new funds admin. + **/ + event NewFundsAdmin(address indexed fundsAdmin); + + /** @notice Emitted when the new stream is created + * @param streamId The identifier of the stream. + * @param sender The address of the collector. + * @param recipient The address towards which the money is streamed. + * @param deposit The amount of money to be streamed. + * @param tokenAddress The ERC20 token to use as streaming currency. + * @param startTime The unix timestamp for when the stream starts. + * @param stopTime The unix timestamp for when the stream stops. + **/ + event CreateStream( + uint256 indexed streamId, + address indexed sender, + address indexed recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime + ); + + /** + * @notice Emmitted when withdraw happens from the contract to the recipient's account. + * @param streamId The id of the stream to withdraw tokens from. + * @param recipient The address towards which the money is streamed. + * @param amount The amount of tokens to withdraw. + */ + event WithdrawFromStream(uint256 indexed streamId, address indexed recipient, uint256 amount); + + /** + * @notice Emmitted when the stream is canceled. + * @param streamId The id of the stream to withdraw tokens from. + * @param sender The address of the collector. + * @param recipient The address towards which the money is streamed. + * @param senderBalance The sender's balance at the moment of cancelling. + * @param recipientBalance The recipient's balance at the moment of cancelling. + */ + event CancelStream( + uint256 indexed streamId, + address indexed sender, + address indexed recipient, + uint256 senderBalance, + uint256 recipientBalance + ); + + /** @notice Returns the mock ETH reference address + * @return address The address + **/ + function ETH_MOCK_ADDRESS() external pure returns (address); + + /** @notice Initializes the contracts + * @param fundsAdmin Funds admin address + * @param nextStreamId StreamId to set, applied if greater than 0 + **/ + function initialize(address fundsAdmin, uint256 nextStreamId) external; + + /** + * @notice Return the funds admin, only entity to be able to interact with this contract (controller of reserve) + * @return address The address of the funds admin + **/ + function getFundsAdmin() external view returns (address); + + /** + * @notice Returns the available funds for the given stream id and address. + * @param streamId The id of the stream for which to query the balance. + * @param who The address for which to query the balance. + * @notice Returns the total funds allocated to `who` as uint256. + */ + function balanceOf(uint256 streamId, address who) external view returns (uint256 balance); + + /** + * @dev Function for the funds admin to give ERC20 allowance to other parties + * @param token The address of the token to give allowance from + * @param recipient Allowance's recipient + * @param amount Allowance to approve + **/ + function approve(IERC20 token, address recipient, uint256 amount) external; + + /** + * @notice Function for the funds admin to transfer ERC20 tokens to other parties + * @param token The address of the token to transfer + * @param recipient Transfer's recipient + * @param amount Amount to transfer + **/ + function transfer(IERC20 token, address recipient, uint256 amount) external; + + /** + * @dev Transfer the ownership of the funds administrator role. + This function should only be callable by the current funds administrator. + * @param admin The address of the new funds administrator + */ + function setFundsAdmin(address admin) external; + + /** + * @notice Creates a new stream funded by this contracts itself and paid towards `recipient`. + * @param recipient The address towards which the money is streamed. + * @param deposit The amount of money to be streamed. + * @param tokenAddress The ERC20 token to use as streaming currency. + * @param startTime The unix timestamp for when the stream starts. + * @param stopTime The unix timestamp for when the stream stops. + * @return streamId the uint256 id of the newly created stream. + */ + function createStream( + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime + ) external returns (uint256 streamId); + + /** + * @notice Returns the stream with all its properties. + * @dev Throws if the id does not point to a valid stream. + * @param streamId The id of the stream to query. + * @notice Returns the stream object. + */ + function getStream( + uint256 streamId + ) + external + view + returns ( + address sender, + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime, + uint256 remainingBalance, + uint256 ratePerSecond + ); + + /** + * @notice Withdraws from the contract to the recipient's account. + * @param streamId The id of the stream to withdraw tokens from. + * @param amount The amount of tokens to withdraw. + * @return bool Returns true if successful. + */ + function withdrawFromStream(uint256 streamId, uint256 amount) external returns (bool); + + /** + * @notice Cancels the stream and transfers the tokens back on a pro rata basis. + * @param streamId The id of the stream to cancel. + * @return bool Returns true if successful. + */ + function cancelStream(uint256 streamId) external returns (bool); + + /** + * @notice Returns the next available stream id + * @return nextStreamId Returns the stream id. + */ + function getNextStreamId() external view returns (uint256); +} + +// lib/solidity-utils/src/contracts/oz-common/SafeERC20.sol + +// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol) +// Modified From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/00cbf5a236564c3b7aacdad1f378cae22d890ca6 + +/** + * @title SafeERC20 + * @dev Wrappers around ERC20 operations that throw on failure (when the token + * contract returns false). Tokens that return no value (and instead revert or + * throw on failure) are also supported, non-reverting calls are assumed to be + * successful. + * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, + * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. + */ +library SafeERC20 { + using Address for address; + + /** + * @dev An operation with an ERC20 token failed. + */ + error SafeERC20FailedOperation(address token); + + /** + * @dev Indicates a failed `decreaseAllowance` request. + */ + error SafeERC20FailedDecreaseAllowance( + address spender, + uint256 currentAllowance, + uint256 requestedDecrease + ); + + /** + * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, + * non-reverting calls are assumed to be successful. + */ + function safeTransfer(IERC20 token, address to, uint256 value) internal { + _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); + } + + /** + * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the + * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. + */ + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); + } + + /** + * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, + * non-reverting calls are assumed to be successful. + */ + function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { + uint256 oldAllowance = token.allowance(address(this), spender); + forceApprove(token, spender, oldAllowance + value); + } + + /** + * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no value, + * non-reverting calls are assumed to be successful. + */ + function safeDecreaseAllowance( + IERC20 token, + address spender, + uint256 requestedDecrease + ) internal { + unchecked { + uint256 currentAllowance = token.allowance(address(this), spender); + if (currentAllowance < requestedDecrease) { + revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); + } + forceApprove(token, spender, currentAllowance - requestedDecrease); + } + } + + /** + * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, + * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval + * to be set to zero before setting it to a non-zero value, such as USDT. + */ + function forceApprove(IERC20 token, address spender, uint256 value) internal { + bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); + + if (!_callOptionalReturnBool(token, approvalCall)) { + _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); + _callOptionalReturn(token, approvalCall); + } + } + + /** + * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. + * Revert on invalid signature. + */ + function safePermit( + IERC20Permit token, + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) internal { + uint256 nonceBefore = token.nonces(owner); + token.permit(owner, spender, value, deadline, v, r, s); + uint256 nonceAfter = token.nonces(owner); + if (nonceAfter != nonceBefore + 1) { + revert SafeERC20FailedOperation(address(token)); + } + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + */ + function _callOptionalReturn(IERC20 token, bytes memory data) private { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that + // the target address contains contract code and also asserts for success in the low-level call. + + bytes memory returndata = address(token).functionCall(data); + if (returndata.length != 0 && !abi.decode(returndata, (bool))) { + revert SafeERC20FailedOperation(address(token)); + } + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + * + * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. + */ + function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false + // and not revert is the subcall reverts. + + (bool success, bytes memory returndata) = address(token).call(data); + return + success && + (returndata.length == 0 || abi.decode(returndata, (bool))) && + address(token).code.length > 0; + } +} + +// downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/contracts/Collector.sol + +/** + * @title Collector + * @notice Stores ERC20 tokens of an ecosystem reserve and allows to dispose of them via approval + * or transfer dynamics or streaming capabilities. + * Modification of Sablier https://github.com/sablierhq/sablier/blob/develop/packages/protocol/contracts/Sablier.sol + * Original can be found also deployed on https://etherscan.io/address/0xCD18eAa163733Da39c232722cBC4E8940b1D8888 + * Modifications: + * - Sablier "pulls" the funds from the creator of the stream at creation. In the Aave case, we already have the funds. + * - Anybody can create streams on Sablier. Here, only the funds admin (Aave governance via controller) can + * - Adapted codebase to Solidity 0.8.11, mainly removing SafeMath and CarefulMath to use native safe math + * - Same as with creation, on Sablier the `sender` and `recipient` can cancel a stream. Here, only fund admin and recipient + * @author BGD Labs + **/ +contract Collector is VersionedInitializable, ICollector, ReentrancyGuard { + using SafeERC20 for IERC20; + using Address for address payable; + + /*** Storage Properties ***/ + + /** + * @notice Address of the current funds admin. + */ + address internal _fundsAdmin; + + /** + * @notice Current revision of the contract. + */ + uint256 public constant REVISION = 5; + + /** + * @notice Counter for new stream ids. + */ + uint256 private _nextStreamId; + + /** + * @notice The stream objects identifiable by their unsigned integer ids. + */ + mapping(uint256 => Stream) private _streams; + + /// @inheritdoc ICollector + address public constant ETH_MOCK_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /*** Modifiers ***/ + + /** + * @dev Throws if the caller is not the funds admin. + */ + modifier onlyFundsAdmin() { + require(msg.sender == _fundsAdmin, 'ONLY_BY_FUNDS_ADMIN'); + _; + } + + /** + * @dev Throws if the caller is not the funds admin of the recipient of the stream. + * @param streamId The id of the stream to query. + */ + modifier onlyAdminOrRecipient(uint256 streamId) { + require( + msg.sender == _fundsAdmin || msg.sender == _streams[streamId].recipient, + 'caller is not the funds admin or the recipient of the stream' + ); + _; + } + + /** + * @dev Throws if the provided id does not point to a valid stream. + */ + modifier streamExists(uint256 streamId) { + require(_streams[streamId].isEntity, 'stream does not exist'); + _; + } + + /*** Contract Logic Starts Here */ + + /// @inheritdoc ICollector + function initialize(address fundsAdmin, uint256 nextStreamId) external initializer { + if (nextStreamId != 0) { + _nextStreamId = nextStreamId; + } + + // can be removed after first deployment + _initGuard(); + _setFundsAdmin(fundsAdmin); + } + + /*** View Functions ***/ + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure override returns (uint256) { + return REVISION; + } + + /// @inheritdoc ICollector + function getFundsAdmin() external view returns (address) { + return _fundsAdmin; + } + + /// @inheritdoc ICollector + function getNextStreamId() external view returns (uint256) { + return _nextStreamId; + } + + /// @inheritdoc ICollector + function getStream( + uint256 streamId + ) + external + view + streamExists(streamId) + returns ( + address sender, + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime, + uint256 remainingBalance, + uint256 ratePerSecond + ) + { + sender = _streams[streamId].sender; + recipient = _streams[streamId].recipient; + deposit = _streams[streamId].deposit; + tokenAddress = _streams[streamId].tokenAddress; + startTime = _streams[streamId].startTime; + stopTime = _streams[streamId].stopTime; + remainingBalance = _streams[streamId].remainingBalance; + ratePerSecond = _streams[streamId].ratePerSecond; + } + + /** + * @notice Returns either the delta in seconds between `block.timestamp` and `startTime` or + * between `stopTime` and `startTime, whichever is smaller. If `block.timestamp` is before + * `startTime`, it returns 0. + * @dev Throws if the id does not point to a valid stream. + * @param streamId The id of the stream for which to query the delta. + * @notice Returns the time delta in seconds. + */ + function deltaOf(uint256 streamId) public view streamExists(streamId) returns (uint256 delta) { + Stream memory stream = _streams[streamId]; + if (block.timestamp <= stream.startTime) return 0; + if (block.timestamp < stream.stopTime) return block.timestamp - stream.startTime; + return stream.stopTime - stream.startTime; + } + + struct BalanceOfLocalVars { + uint256 recipientBalance; + uint256 withdrawalAmount; + uint256 senderBalance; + } + + /// @inheritdoc ICollector + function balanceOf( + uint256 streamId, + address who + ) public view streamExists(streamId) returns (uint256 balance) { + Stream memory stream = _streams[streamId]; + BalanceOfLocalVars memory vars; + + uint256 delta = deltaOf(streamId); + vars.recipientBalance = delta * stream.ratePerSecond; + + /* + * If the stream `balance` does not equal `deposit`, it means there have been withdrawals. + * We have to subtract the total amount withdrawn from the amount of money that has been + * streamed until now. + */ + if (stream.deposit > stream.remainingBalance) { + vars.withdrawalAmount = stream.deposit - stream.remainingBalance; + vars.recipientBalance = vars.recipientBalance - vars.withdrawalAmount; + } + + if (who == stream.recipient) return vars.recipientBalance; + if (who == stream.sender) { + vars.senderBalance = stream.remainingBalance - vars.recipientBalance; + return vars.senderBalance; + } + return 0; + } + + /*** Public Effects & Interactions Functions ***/ + + /// @inheritdoc ICollector + function approve(IERC20 token, address recipient, uint256 amount) external onlyFundsAdmin { + token.safeApprove(recipient, amount); + } + + /// @inheritdoc ICollector + function transfer(IERC20 token, address recipient, uint256 amount) external onlyFundsAdmin { + require(recipient != address(0), 'INVALID_0X_RECIPIENT'); + + if (address(token) == ETH_MOCK_ADDRESS) { + payable(recipient).sendValue(amount); + } else { + token.safeTransfer(recipient, amount); + } + } + + /// @dev needed in order to receive ETH from the Aave v1 ecosystem reserve + receive() external payable {} + + /// @inheritdoc ICollector + function setFundsAdmin(address admin) external onlyFundsAdmin { + _setFundsAdmin(admin); + } + + /** + * @dev Transfer the ownership of the funds administrator role. + * @param admin The address of the new funds administrator + */ + function _setFundsAdmin(address admin) internal { + _fundsAdmin = admin; + emit NewFundsAdmin(admin); + } + + struct CreateStreamLocalVars { + uint256 duration; + uint256 ratePerSecond; + } + + /// @inheritdoc ICollector + /** + * @dev Throws if the recipient is the zero address, the contract itself or the caller. + * Throws if the deposit is 0. + * Throws if the start time is before `block.timestamp`. + * Throws if the stop time is before the start time. + * Throws if the duration calculation has a math error. + * Throws if the deposit is smaller than the duration. + * Throws if the deposit is not a multiple of the duration. + * Throws if the rate calculation has a math error. + * Throws if the next stream id calculation has a math error. + * Throws if the contract is not allowed to transfer enough tokens. + * Throws if there is a token transfer failure. + */ + function createStream( + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime + ) external onlyFundsAdmin returns (uint256) { + require(recipient != address(0), 'stream to the zero address'); + require(recipient != address(this), 'stream to the contract itself'); + require(recipient != msg.sender, 'stream to the caller'); + require(deposit > 0, 'deposit is zero'); + require(startTime >= block.timestamp, 'start time before block.timestamp'); + require(stopTime > startTime, 'stop time before the start time'); + + CreateStreamLocalVars memory vars; + vars.duration = stopTime - startTime; + + /* Without this, the rate per second would be zero. */ + require(deposit >= vars.duration, 'deposit smaller than time delta'); + + /* This condition avoids dealing with remainders */ + require(deposit % vars.duration == 0, 'deposit not multiple of time delta'); + + vars.ratePerSecond = deposit / vars.duration; + + /* Create and store the stream object. */ + uint256 streamId = _nextStreamId; + _streams[streamId] = Stream({ + remainingBalance: deposit, + deposit: deposit, + isEntity: true, + ratePerSecond: vars.ratePerSecond, + recipient: recipient, + sender: address(this), + startTime: startTime, + stopTime: stopTime, + tokenAddress: tokenAddress + }); + + /* Increment the next stream id. */ + _nextStreamId++; + + emit CreateStream( + streamId, + address(this), + recipient, + deposit, + tokenAddress, + startTime, + stopTime + ); + return streamId; + } + + /// @inheritdoc ICollector + /** + * @dev Throws if the id does not point to a valid stream. + * Throws if the caller is not the funds admin or the recipient of the stream. + * Throws if the amount exceeds the available balance. + * Throws if there is a token transfer failure. + */ + function withdrawFromStream( + uint256 streamId, + uint256 amount + ) external nonReentrant streamExists(streamId) onlyAdminOrRecipient(streamId) returns (bool) { + require(amount > 0, 'amount is zero'); + Stream memory stream = _streams[streamId]; + + uint256 balance = balanceOf(streamId, stream.recipient); + require(balance >= amount, 'amount exceeds the available balance'); + + _streams[streamId].remainingBalance = stream.remainingBalance - amount; + + if (_streams[streamId].remainingBalance == 0) delete _streams[streamId]; + + IERC20(stream.tokenAddress).safeTransfer(stream.recipient, amount); + emit WithdrawFromStream(streamId, stream.recipient, amount); + return true; + } + + /// @inheritdoc ICollector + /** + * @dev Throws if the id does not point to a valid stream. + * Throws if the caller is not the funds admin or the recipient of the stream. + * Throws if there is a token transfer failure. + */ + function cancelStream( + uint256 streamId + ) external nonReentrant streamExists(streamId) onlyAdminOrRecipient(streamId) returns (bool) { + Stream memory stream = _streams[streamId]; + uint256 senderBalance = balanceOf(streamId, stream.sender); + uint256 recipientBalance = balanceOf(streamId, stream.recipient); + + delete _streams[streamId]; + + IERC20 token = IERC20(stream.tokenAddress); + if (recipientBalance > 0) token.safeTransfer(stream.recipient, recipientBalance); + + emit CancelStream(streamId, stream.sender, stream.recipient, senderBalance, recipientBalance); + return true; + } +} diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/Address.sol b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/Address.sol new file mode 100644 index 00000000..2460f0ea --- /dev/null +++ b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/Address.sol @@ -0,0 +1,249 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) +// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/8b778fa20d6d76340c5fac1ed66c80273f05b95a + +pragma solidity ^0.8.1; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + * + * [IMPORTANT] + * ==== + * You shouldn't rely on `isContract` to protect against flash loan attacks! + * + * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets + * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract + * constructor. + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize/address.code.length, which returns 0 + // for contracts in construction, since the code is only stored at the end + // of the constructor execution. + + return account.code.length > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResultFromTarget(target, success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall(address target, bytes memory data) + internal + view + returns (bytes memory) + { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResultFromTarget(target, success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResultFromTarget(target, success, returndata, errorMessage); + } + + /** + * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling + * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. + * + * _Available since v4.8._ + */ + function verifyCallResultFromTarget( + address target, + bool success, + bytes memory returndata, + string memory errorMessage + ) internal view returns (bytes memory) { + if (success) { + if (returndata.length == 0) { + // only check isContract if the call was successful and the return data is empty + // otherwise we already know that it was a contract + require(isContract(target), 'Address: call to non-contract'); + } + return returndata; + } else { + _revert(returndata, errorMessage); + } + } + + /** + * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason or using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + _revert(returndata, errorMessage); + } + } + + function _revert(bytes memory returndata, string memory errorMessage) private pure { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + /// @solidity memory-safe-assembly + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } +} diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/SafeERC20.sol b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/SafeERC20.sol new file mode 100644 index 00000000..78ad44ec --- /dev/null +++ b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/SafeERC20.sol @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) +// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/3dac7bbed7b4c0dbf504180c33e8ed8e350b93eb + +pragma solidity ^0.8.0; + +import "./interfaces/IERC20.sol"; +import "./interfaces/draft-IERC20Permit.sol"; +import "./Address.sol"; + +/** + * @title SafeERC20 + * @dev Wrappers around ERC20 operations that throw on failure (when the token + * contract returns false). Tokens that return no value (and instead revert or + * throw on failure) are also supported, non-reverting calls are assumed to be + * successful. + * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, + * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. + */ +library SafeERC20 { + using Address for address; + + function safeTransfer( + IERC20 token, + address to, + uint256 value + ) internal { + _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); + } + + function safeTransferFrom( + IERC20 token, + address from, + address to, + uint256 value + ) internal { + _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); + } + + /** + * @dev Deprecated. This function has issues similar to the ones found in + * {IERC20-approve}, and its usage is discouraged. + * + * Whenever possible, use {safeIncreaseAllowance} and + * {safeDecreaseAllowance} instead. + */ + function safeApprove( + IERC20 token, + address spender, + uint256 value + ) internal { + // safeApprove should only be called when setting an initial allowance, + // or when resetting it to zero. To increase and decrease it, use + // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' + require( + (value == 0) || (token.allowance(address(this), spender) == 0), + "SafeERC20: approve from non-zero to non-zero allowance" + ); + _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); + } + + function safeIncreaseAllowance( + IERC20 token, + address spender, + uint256 value + ) internal { + uint256 newAllowance = token.allowance(address(this), spender) + value; + _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); + } + + function safeDecreaseAllowance( + IERC20 token, + address spender, + uint256 value + ) internal { + unchecked { + uint256 oldAllowance = token.allowance(address(this), spender); + require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); + uint256 newAllowance = oldAllowance - value; + _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); + } + } + + function safePermit( + IERC20Permit token, + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) internal { + uint256 nonceBefore = token.nonces(owner); + token.permit(owner, spender, value, deadline, v, r, s); + uint256 nonceAfter = token.nonces(owner); + require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + */ + function _callOptionalReturn(IERC20 token, bytes memory data) private { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that + // the target address contains contract code and also asserts for success in the low-level call. + + bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); + if (returndata.length > 0) { + // Return data is optional + require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); + } + } +} \ No newline at end of file diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/interfaces/IERC20.sol b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/interfaces/IERC20.sol new file mode 100644 index 00000000..053588c2 --- /dev/null +++ b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/interfaces/IERC20.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) +// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/a035b235b4f2c9af4ba88edc4447f02e37f8d124 + +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); + + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `to`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address to, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `from` to `to` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom( + address from, + address to, + uint256 amount + ) external returns (bool); +} \ No newline at end of file diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/interfaces/draft-IERC20Permit.sol b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/interfaces/draft-IERC20Permit.sol new file mode 100644 index 00000000..298fd2aa --- /dev/null +++ b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/interfaces/draft-IERC20Permit.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) +// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/6bd6b76d1156e20e45d1016f355d154141c7e5b9 + +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in + * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. + * + * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by + * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't + * need to send a transaction, and thus is not required to hold Ether at all. + */ +interface IERC20Permit { + /** + * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, + * given ``owner``'s signed approval. + * + * IMPORTANT: The same issues {IERC20-approve} has related to transaction + * ordering also apply here. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `spender` cannot be the zero address. + * - `deadline` must be a timestamp in the future. + * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` + * over the EIP712-formatted function arguments. + * - the signature must use ``owner``'s current nonce (see {nonces}). + * + * For more information on the signature format, see the + * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP + * section]. + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @dev Returns the current nonce for `owner`. This value must be + * included whenever a signature is generated for {permit}. + * + * Every successful call to {permit} increases ``owner``'s nonce by one. This + * prevents a signature from being used multiple times. + */ + function nonces(address owner) external view returns (uint256); + + /** + * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. + */ + // solhint-disable-next-line func-name-mixedcase + function DOMAIN_SEPARATOR() external view returns (bytes32); +} \ No newline at end of file diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/contracts/Collector.sol b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/contracts/Collector.sol new file mode 100644 index 00000000..eee55aee --- /dev/null +++ b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/contracts/Collector.sol @@ -0,0 +1,346 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {Address} from 'solidity-utils/contracts/oz-common/Address.sol'; +import {ICollector} from '../interfaces/ICollector.sol'; +import {VersionedInitializable} from '../libs/VersionedInitializable.sol'; +import {ReentrancyGuard} from '../libs/ReentrancyGuard.sol'; + +/** + * @title Collector + * @notice Stores ERC20 tokens of an ecosystem reserve and allows to dispose of them via approval + * or transfer dynamics or streaming capabilities. + * Modification of Sablier https://github.com/sablierhq/sablier/blob/develop/packages/protocol/contracts/Sablier.sol + * Original can be found also deployed on https://etherscan.io/address/0xCD18eAa163733Da39c232722cBC4E8940b1D8888 + * Modifications: + * - Sablier "pulls" the funds from the creator of the stream at creation. In the Aave case, we already have the funds. + * - Anybody can create streams on Sablier. Here, only the funds admin (Aave governance via controller) can + * - Adapted codebase to Solidity 0.8.11, mainly removing SafeMath and CarefulMath to use native safe math + * - Same as with creation, on Sablier the `sender` and `recipient` can cancel a stream. Here, only fund admin and recipient + * @author BGD Labs + **/ +contract Collector is VersionedInitializable, ICollector, ReentrancyGuard { + using SafeERC20 for IERC20; + using Address for address payable; + + /*** Storage Properties ***/ + + /** + * @notice Address of the current funds admin. + */ + address internal _fundsAdmin; + + /** + * @notice Current revision of the contract. + */ + uint256 public constant REVISION = 5; + + /** + * @notice Counter for new stream ids. + */ + uint256 private _nextStreamId; + + /** + * @notice The stream objects identifiable by their unsigned integer ids. + */ + mapping(uint256 => Stream) private _streams; + + /// @inheritdoc ICollector + address public constant ETH_MOCK_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /*** Modifiers ***/ + + /** + * @dev Throws if the caller is not the funds admin. + */ + modifier onlyFundsAdmin() { + require(msg.sender == _fundsAdmin, 'ONLY_BY_FUNDS_ADMIN'); + _; + } + + /** + * @dev Throws if the caller is not the funds admin of the recipient of the stream. + * @param streamId The id of the stream to query. + */ + modifier onlyAdminOrRecipient(uint256 streamId) { + require( + msg.sender == _fundsAdmin || msg.sender == _streams[streamId].recipient, + 'caller is not the funds admin or the recipient of the stream' + ); + _; + } + + /** + * @dev Throws if the provided id does not point to a valid stream. + */ + modifier streamExists(uint256 streamId) { + require(_streams[streamId].isEntity, 'stream does not exist'); + _; + } + + /*** Contract Logic Starts Here */ + + /// @inheritdoc ICollector + function initialize(address fundsAdmin, uint256 nextStreamId) external initializer { + if (nextStreamId != 0) { + _nextStreamId = nextStreamId; + } + + // can be removed after first deployment + _initGuard(); + _setFundsAdmin(fundsAdmin); + } + + /*** View Functions ***/ + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure override returns (uint256) { + return REVISION; + } + + /// @inheritdoc ICollector + function getFundsAdmin() external view returns (address) { + return _fundsAdmin; + } + + /// @inheritdoc ICollector + function getNextStreamId() external view returns (uint256) { + return _nextStreamId; + } + + /// @inheritdoc ICollector + function getStream( + uint256 streamId + ) + external + view + streamExists(streamId) + returns ( + address sender, + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime, + uint256 remainingBalance, + uint256 ratePerSecond + ) + { + sender = _streams[streamId].sender; + recipient = _streams[streamId].recipient; + deposit = _streams[streamId].deposit; + tokenAddress = _streams[streamId].tokenAddress; + startTime = _streams[streamId].startTime; + stopTime = _streams[streamId].stopTime; + remainingBalance = _streams[streamId].remainingBalance; + ratePerSecond = _streams[streamId].ratePerSecond; + } + + /** + * @notice Returns either the delta in seconds between `block.timestamp` and `startTime` or + * between `stopTime` and `startTime, whichever is smaller. If `block.timestamp` is before + * `startTime`, it returns 0. + * @dev Throws if the id does not point to a valid stream. + * @param streamId The id of the stream for which to query the delta. + * @notice Returns the time delta in seconds. + */ + function deltaOf(uint256 streamId) public view streamExists(streamId) returns (uint256 delta) { + Stream memory stream = _streams[streamId]; + if (block.timestamp <= stream.startTime) return 0; + if (block.timestamp < stream.stopTime) return block.timestamp - stream.startTime; + return stream.stopTime - stream.startTime; + } + + struct BalanceOfLocalVars { + uint256 recipientBalance; + uint256 withdrawalAmount; + uint256 senderBalance; + } + + /// @inheritdoc ICollector + function balanceOf( + uint256 streamId, + address who + ) public view streamExists(streamId) returns (uint256 balance) { + Stream memory stream = _streams[streamId]; + BalanceOfLocalVars memory vars; + + uint256 delta = deltaOf(streamId); + vars.recipientBalance = delta * stream.ratePerSecond; + + /* + * If the stream `balance` does not equal `deposit`, it means there have been withdrawals. + * We have to subtract the total amount withdrawn from the amount of money that has been + * streamed until now. + */ + if (stream.deposit > stream.remainingBalance) { + vars.withdrawalAmount = stream.deposit - stream.remainingBalance; + vars.recipientBalance = vars.recipientBalance - vars.withdrawalAmount; + } + + if (who == stream.recipient) return vars.recipientBalance; + if (who == stream.sender) { + vars.senderBalance = stream.remainingBalance - vars.recipientBalance; + return vars.senderBalance; + } + return 0; + } + + /*** Public Effects & Interactions Functions ***/ + + /// @inheritdoc ICollector + function approve(IERC20 token, address recipient, uint256 amount) external onlyFundsAdmin { + token.safeApprove(recipient, amount); + } + + /// @inheritdoc ICollector + function transfer(IERC20 token, address recipient, uint256 amount) external onlyFundsAdmin { + require(recipient != address(0), 'INVALID_0X_RECIPIENT'); + + if (address(token) == ETH_MOCK_ADDRESS) { + payable(recipient).sendValue(amount); + } else { + token.safeTransfer(recipient, amount); + } + } + + /// @dev needed in order to receive ETH from the Aave v1 ecosystem reserve + receive() external payable {} + + /// @inheritdoc ICollector + function setFundsAdmin(address admin) external onlyFundsAdmin { + _setFundsAdmin(admin); + } + + /** + * @dev Transfer the ownership of the funds administrator role. + * @param admin The address of the new funds administrator + */ + function _setFundsAdmin(address admin) internal { + _fundsAdmin = admin; + emit NewFundsAdmin(admin); + } + + struct CreateStreamLocalVars { + uint256 duration; + uint256 ratePerSecond; + } + + /// @inheritdoc ICollector + /** + * @dev Throws if the recipient is the zero address, the contract itself or the caller. + * Throws if the deposit is 0. + * Throws if the start time is before `block.timestamp`. + * Throws if the stop time is before the start time. + * Throws if the duration calculation has a math error. + * Throws if the deposit is smaller than the duration. + * Throws if the deposit is not a multiple of the duration. + * Throws if the rate calculation has a math error. + * Throws if the next stream id calculation has a math error. + * Throws if the contract is not allowed to transfer enough tokens. + * Throws if there is a token transfer failure. + */ + function createStream( + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime + ) external onlyFundsAdmin returns (uint256) { + require(recipient != address(0), 'stream to the zero address'); + require(recipient != address(this), 'stream to the contract itself'); + require(recipient != msg.sender, 'stream to the caller'); + require(deposit > 0, 'deposit is zero'); + require(startTime >= block.timestamp, 'start time before block.timestamp'); + require(stopTime > startTime, 'stop time before the start time'); + + CreateStreamLocalVars memory vars; + vars.duration = stopTime - startTime; + + /* Without this, the rate per second would be zero. */ + require(deposit >= vars.duration, 'deposit smaller than time delta'); + + /* This condition avoids dealing with remainders */ + require(deposit % vars.duration == 0, 'deposit not multiple of time delta'); + + vars.ratePerSecond = deposit / vars.duration; + + /* Create and store the stream object. */ + uint256 streamId = _nextStreamId; + _streams[streamId] = Stream({ + remainingBalance: deposit, + deposit: deposit, + isEntity: true, + ratePerSecond: vars.ratePerSecond, + recipient: recipient, + sender: address(this), + startTime: startTime, + stopTime: stopTime, + tokenAddress: tokenAddress + }); + + /* Increment the next stream id. */ + _nextStreamId++; + + emit CreateStream( + streamId, + address(this), + recipient, + deposit, + tokenAddress, + startTime, + stopTime + ); + return streamId; + } + + /// @inheritdoc ICollector + /** + * @dev Throws if the id does not point to a valid stream. + * Throws if the caller is not the funds admin or the recipient of the stream. + * Throws if the amount exceeds the available balance. + * Throws if there is a token transfer failure. + */ + function withdrawFromStream( + uint256 streamId, + uint256 amount + ) external nonReentrant streamExists(streamId) onlyAdminOrRecipient(streamId) returns (bool) { + require(amount > 0, 'amount is zero'); + Stream memory stream = _streams[streamId]; + + uint256 balance = balanceOf(streamId, stream.recipient); + require(balance >= amount, 'amount exceeds the available balance'); + + _streams[streamId].remainingBalance = stream.remainingBalance - amount; + + if (_streams[streamId].remainingBalance == 0) delete _streams[streamId]; + + IERC20(stream.tokenAddress).safeTransfer(stream.recipient, amount); + emit WithdrawFromStream(streamId, stream.recipient, amount); + return true; + } + + /// @inheritdoc ICollector + /** + * @dev Throws if the id does not point to a valid stream. + * Throws if the caller is not the funds admin or the recipient of the stream. + * Throws if there is a token transfer failure. + */ + function cancelStream( + uint256 streamId + ) external nonReentrant streamExists(streamId) onlyAdminOrRecipient(streamId) returns (bool) { + Stream memory stream = _streams[streamId]; + uint256 senderBalance = balanceOf(streamId, stream.sender); + uint256 recipientBalance = balanceOf(streamId, stream.recipient); + + delete _streams[streamId]; + + IERC20 token = IERC20(stream.tokenAddress); + if (recipientBalance > 0) token.safeTransfer(stream.recipient, recipientBalance); + + emit CancelStream(streamId, stream.sender, stream.recipient, senderBalance, recipientBalance); + return true; + } +} diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/interfaces/ICollector.sol b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/interfaces/ICollector.sol new file mode 100644 index 00000000..b19516f7 --- /dev/null +++ b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/interfaces/ICollector.sol @@ -0,0 +1,174 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; + +interface ICollector { + struct Stream { + uint256 deposit; + uint256 ratePerSecond; + uint256 remainingBalance; + uint256 startTime; + uint256 stopTime; + address recipient; + address sender; + address tokenAddress; + bool isEntity; + } + + /** @notice Emitted when the funds admin changes + * @param fundsAdmin The new funds admin. + **/ + event NewFundsAdmin(address indexed fundsAdmin); + + /** @notice Emitted when the new stream is created + * @param streamId The identifier of the stream. + * @param sender The address of the collector. + * @param recipient The address towards which the money is streamed. + * @param deposit The amount of money to be streamed. + * @param tokenAddress The ERC20 token to use as streaming currency. + * @param startTime The unix timestamp for when the stream starts. + * @param stopTime The unix timestamp for when the stream stops. + **/ + event CreateStream( + uint256 indexed streamId, + address indexed sender, + address indexed recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime + ); + + /** + * @notice Emmitted when withdraw happens from the contract to the recipient's account. + * @param streamId The id of the stream to withdraw tokens from. + * @param recipient The address towards which the money is streamed. + * @param amount The amount of tokens to withdraw. + */ + event WithdrawFromStream(uint256 indexed streamId, address indexed recipient, uint256 amount); + + /** + * @notice Emmitted when the stream is canceled. + * @param streamId The id of the stream to withdraw tokens from. + * @param sender The address of the collector. + * @param recipient The address towards which the money is streamed. + * @param senderBalance The sender's balance at the moment of cancelling. + * @param recipientBalance The recipient's balance at the moment of cancelling. + */ + event CancelStream( + uint256 indexed streamId, + address indexed sender, + address indexed recipient, + uint256 senderBalance, + uint256 recipientBalance + ); + + /** @notice Returns the mock ETH reference address + * @return address The address + **/ + function ETH_MOCK_ADDRESS() external pure returns (address); + + /** @notice Initializes the contracts + * @param fundsAdmin Funds admin address + * @param nextStreamId StreamId to set, applied if greater than 0 + **/ + function initialize(address fundsAdmin, uint256 nextStreamId) external; + + /** + * @notice Return the funds admin, only entity to be able to interact with this contract (controller of reserve) + * @return address The address of the funds admin + **/ + function getFundsAdmin() external view returns (address); + + /** + * @notice Returns the available funds for the given stream id and address. + * @param streamId The id of the stream for which to query the balance. + * @param who The address for which to query the balance. + * @notice Returns the total funds allocated to `who` as uint256. + */ + function balanceOf(uint256 streamId, address who) external view returns (uint256 balance); + + /** + * @dev Function for the funds admin to give ERC20 allowance to other parties + * @param token The address of the token to give allowance from + * @param recipient Allowance's recipient + * @param amount Allowance to approve + **/ + function approve(IERC20 token, address recipient, uint256 amount) external; + + /** + * @notice Function for the funds admin to transfer ERC20 tokens to other parties + * @param token The address of the token to transfer + * @param recipient Transfer's recipient + * @param amount Amount to transfer + **/ + function transfer(IERC20 token, address recipient, uint256 amount) external; + + /** + * @dev Transfer the ownership of the funds administrator role. + This function should only be callable by the current funds administrator. + * @param admin The address of the new funds administrator + */ + function setFundsAdmin(address admin) external; + + /** + * @notice Creates a new stream funded by this contracts itself and paid towards `recipient`. + * @param recipient The address towards which the money is streamed. + * @param deposit The amount of money to be streamed. + * @param tokenAddress The ERC20 token to use as streaming currency. + * @param startTime The unix timestamp for when the stream starts. + * @param stopTime The unix timestamp for when the stream stops. + * @return streamId the uint256 id of the newly created stream. + */ + function createStream( + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime + ) external returns (uint256 streamId); + + /** + * @notice Returns the stream with all its properties. + * @dev Throws if the id does not point to a valid stream. + * @param streamId The id of the stream to query. + * @notice Returns the stream object. + */ + function getStream( + uint256 streamId + ) + external + view + returns ( + address sender, + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime, + uint256 remainingBalance, + uint256 ratePerSecond + ); + + /** + * @notice Withdraws from the contract to the recipient's account. + * @param streamId The id of the stream to withdraw tokens from. + * @param amount The amount of tokens to withdraw. + * @return bool Returns true if successful. + */ + function withdrawFromStream(uint256 streamId, uint256 amount) external returns (bool); + + /** + * @notice Cancels the stream and transfers the tokens back on a pro rata basis. + * @param streamId The id of the stream to cancel. + * @return bool Returns true if successful. + */ + function cancelStream(uint256 streamId) external returns (bool); + + /** + * @notice Returns the next available stream id + * @return nextStreamId Returns the stream id. + */ + function getNextStreamId() external view returns (uint256); +} diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/ReentrancyGuard.sol b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/ReentrancyGuard.sol new file mode 100644 index 00000000..d8b54911 --- /dev/null +++ b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/ReentrancyGuard.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Contract module that helps prevent reentrant calls to a function. + * + * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier + * available, which can be applied to functions to make sure there are no nested + * (reentrant) calls to them. + * + * Note that because there is a single `nonReentrant` guard, functions marked as + * `nonReentrant` may not call one another. This can be worked around by making + * those functions `private`, and then adding `external` `nonReentrant` entry + * points to them. + * + * TIP: If you would like to learn more about reentrancy and alternative ways + * to protect against it, check out our blog post + * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. + */ +abstract contract ReentrancyGuard { + // Booleans are more expensive than uint256 or any type that takes up a full + // word because each write operation emits an extra SLOAD to first read the + // slot's contents, replace the bits taken up by the boolean, and then write + // back. This is the compiler's defense against contract upgrades and + // pointer aliasing, and it cannot be disabled. + + // The values being non-zero value makes deployment a bit more expensive, + // but in exchange the refund on every call to nonReentrant will be lower in + // amount. Since refunds are capped to a percentage of the total + // transaction's gas, it is best to keep them low in cases like this one, to + // increase the likelihood of the full refund coming into effect. + uint256 private constant _NOT_ENTERED = 1; + uint256 private constant _ENTERED = 2; + + uint256 private _status; + + constructor() { + _status = _NOT_ENTERED; + } + + /** + * @dev Prevents a contract from calling itself, directly or indirectly. + * Calling a `nonReentrant` function from another `nonReentrant` + * function is not supported. It is possible to prevent this from happening + * by making the `nonReentrant` function external, and making it call a + * `private` function that does the actual work. + */ + modifier nonReentrant() { + // On the first call to nonReentrant, _notEntered will be true + require(_status != _ENTERED, 'ReentrancyGuard: reentrant call'); + + // Any calls to nonReentrant after this point will fail + _status = _ENTERED; + + _; + + // By storing the original value once again, a refund is triggered (see + // https://eips.ethereum.org/EIPS/eip-2200) + _status = _NOT_ENTERED; + } + + /** + * @dev As we use the guard with the proxy we need to init it with the empty value + */ + function _initGuard() internal { + _status = _NOT_ENTERED; + } +} diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/VersionedInitializable.sol b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/VersionedInitializable.sol new file mode 100644 index 00000000..ab67b10d --- /dev/null +++ b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/VersionedInitializable.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0; + +/** + * @title VersionedInitializable + * + * @dev Helper contract to support initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + * + * @author Aave, inspired by the OpenZeppelin Initializable contract + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 internal lastInitializedRevision = 0; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require(revision > lastInitializedRevision, 'Contract instance has already been initialized'); + + lastInitializedRevision = revision; + + _; + } + + /// @dev returns the revision number of the contract. + /// Needs to be defined in the inherited class as a constant. + function getRevision() internal pure virtual returns (uint256); + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC.sol new file mode 100644 index 00000000..b92a1a12 --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC.sol @@ -0,0 +1,3165 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol + +/** + * @title Proxy + * @dev Implements delegation of calls to other contracts, with proper + * forwarding of return values and bubbling of failures. + * It defines a fallback function that delegates all calls to the address + * returned by the abstract _implementation() internal function. + */ +abstract contract Proxy { + /** + * @dev Fallback function. + * Will run if no other function in the contract matches the call data. + * Implemented entirely in `_fallback`. + */ + fallback() external payable { + _fallback(); + } + + /** + * @dev Fallback function that will run if call data is empty. + * IMPORTANT. receive() on implementation contracts will be unreachable + */ + receive() external payable { + _fallback(); + } + + /** + * @return The Address of the implementation. + */ + function _implementation() internal view virtual returns (address); + + /** + * @dev Delegates execution to an implementation contract. + * This is a low level function that doesn't return to its internal call site. + * It will return to the external caller whatever the implementation returns. + * @param implementation Address to delegate. + */ + function _delegate(address implementation) internal { + //solium-disable-next-line + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + /** + * @dev Function that is run as the first thing in the fallback function. + * Can be redefined in derived contracts to add functionality. + * Redefinitions must call super._willFallback(). + */ + function _willFallback() internal virtual {} + + /** + * @dev fallback implementation. + * Extracted to enable manual triggering. + */ + function _fallback() internal { + _willFallback(); + _delegate(_implementation()); + } +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol + +library ConfiguratorInputTypes { + struct InitReserveInput { + address aTokenImpl; + address stableDebtTokenImpl; + address variableDebtTokenImpl; + bool useVirtualBalance; + address interestRateStrategyAddress; + address underlyingAsset; + address treasury; + address incentivesController; + string aTokenName; + string aTokenSymbol; + string variableDebtTokenName; + string variableDebtTokenSymbol; + string stableDebtTokenName; + string stableDebtTokenSymbol; + bytes params; + bytes interestRateData; + } + + struct UpdateATokenInput { + address asset; + address treasury; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } + + struct UpdateDebtTokenInput { + address asset; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + //the current stable borrow rate. Expressed in ray + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + //stableDebtToken address + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + //the current stable borrow rate. Expressed in ray + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + //stableDebtToken address + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // each eMode category may or may not have a custom oracle to override the individual assets price oracles + address priceSource; + string label; + } + + enum InterestRateMode { + NONE, + STABLE, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currPrincipalStableDebt; + uint256 currAvgStableBorrowRate; + uint256 currTotalStableDebt; + uint256 nextAvgStableBorrowRate; + uint256 nextTotalStableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address stableDebtTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + uint40 stableDebtLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 maxStableLoanPercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalStableDebt; + uint256 totalVariableDebt; + uint256 averageStableBorrowRate; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address stableDebtAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return stableBorrowRate The stable borrow rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256, uint256); +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol + +/** + * @title BaseUpgradeabilityProxy + * @dev This contract implements a proxy that allows to change the + * implementation address to which it will delegate. + * Such a change is called an implementation upgrade. + */ +contract BaseUpgradeabilityProxy is Proxy { + /** + * @dev Emitted when the implementation is upgraded. + * @param implementation Address of the new implementation. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Storage slot with the address of the current implementation. + * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is + * validated in the constructor. + */ + bytes32 internal constant IMPLEMENTATION_SLOT = + 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + /** + * @dev Returns the current implementation. + * @return impl Address of the current implementation + */ + function _implementation() internal view override returns (address impl) { + bytes32 slot = IMPLEMENTATION_SLOT; + //solium-disable-next-line + assembly { + impl := sload(slot) + } + } + + /** + * @dev Upgrades the proxy to a new implementation. + * @param newImplementation Address of the new implementation. + */ + function _upgradeTo(address newImplementation) internal { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + } + + /** + * @dev Sets the implementation address of the proxy. + * @param newImplementation Address of the new implementation. + */ + function _setImplementation(address newImplementation) internal { + require( + Address.isContract(newImplementation), + 'Cannot set a proxy implementation to a non-contract address' + ); + + bytes32 slot = IMPLEMENTATION_SLOT; + + //solium-disable-next-line + assembly { + sstore(slot, newImplementation) + } + } +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on swapBorrowRateMode() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user swapping his rate mode + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + */ + event SwapBorrowRateMode( + address indexed reserve, + address indexed user, + DataTypes.InterestRateMode interestRateMode + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on rebalanceStableBorrowRate() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user for which the rebalance has been executed + */ + event RebalanceStableBorrowRate(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the + * corresponding debt token (StableDebtToken or VariableDebtToken) + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 stable/variable debt tokens, depending on the `interestRateMode` + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa + * @param asset The address of the underlying asset borrowed + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + */ + function swapBorrowRateMode(address asset, uint256 interestRateMode) external; + + /** + * @notice Permissionless method which allows anyone to swap a users stable debt to variable debt + * @dev Introduced in favor of stable rate deprecation + * @param asset The address of the underlying asset borrowed + * @param user The address of the user whose debt will be swapped from stable to variable + */ + function swapToVariable(address asset, address user) external; + + /** + * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. + * - Users can be rebalanced if the following conditions are satisfied: + * 1. Usage ratio is above 95% + * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too + * much has been borrowed at a stable rate and suppliers are not earning enough + * @param asset The address of the underlying asset borrowed + * @param user The address of the user to be rebalanced + */ + function rebalanceStableBorrowRate(address asset, address user) external; + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address stableDebtAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new category for the eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; + + /** + * @notice Returns the data of an eMode category + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate + * @return The percentage of available liquidity to borrow, expressed in bps + */ + function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external returns (address); +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant STABLE_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant EMODE_CATEGORY_MASK = 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant STABLE_BORROWING_ENABLED_START_BIT_POSITION = 59; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + uint256 internal constant EMODE_CATEGORY_START_BIT_POSITION = 168; + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_EMODE_CATEGORY = 255; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables stable rate borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the stable rate borrowing needs to be enabled, false otherwise + */ + function setStableRateBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & STABLE_BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << STABLE_BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the stable rate borrowing state of the reserve + * @param self The reserve configuration + * @return The stable rate borrowing state + */ + function getStableRateBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~STABLE_BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the eMode asset category + * @param self The reserve configuration + * @param category The asset category when the user selects the eMode + */ + function setEModeCategory( + DataTypes.ReserveConfigurationMap memory self, + uint256 category + ) internal pure { + require(category <= MAX_VALID_EMODE_CATEGORY, Errors.INVALID_EMODE_CATEGORY); + + self.data = (self.data & EMODE_CATEGORY_MASK) | (category << EMODE_CATEGORY_START_BIT_POSITION); + } + + /** + * @dev Gets the eMode asset category + * @param self The reserve configuration + * @return The eMode category for the asset + */ + function getEModeCategory( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing stableRateBorrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~STABLE_BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + * @return The state param representing eMode category + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION, + (dataLocal & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol + +/** + * @title InitializableUpgradeabilityProxy + * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing + * implementation and init data. + */ +contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { + /** + * @dev Contract initializer. + * @param _logic Address of the initial implementation. + * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. + */ + function initialize(address _logic, bytes memory _data) public payable { + require(_implementation() == address(0)); + assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); + _setImplementation(_logic); + if (_data.length > 0) { + (bool success, ) = _logic.delegatecall(_data); + require(success); + } + } +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol + +/** + * @title BaseImmutableAdminUpgradeabilityProxy + * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern + * @notice This contract combines an upgradeability proxy with an authorization + * mechanism for administrative tasks. + * @dev The admin role is stored in an immutable, which helps saving transactions costs + * All external functions in this contract must be guarded by the + * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity + * feature proposal that would enable this to be done automatically. + */ +contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + address internal immutable _admin; + + /** + * @dev Constructor. + * @param admin_ The address of the admin + */ + constructor(address admin_) { + _admin = admin_; + } + + modifier ifAdmin() { + if (msg.sender == _admin) { + _; + } else { + _fallback(); + } + } + + /** + * @notice Return the admin address + * @return The address of the proxy admin. + */ + function admin() external ifAdmin returns (address) { + return _admin; + } + + /** + * @notice Return the implementation address + * @return The address of the implementation. + */ + function implementation() external ifAdmin returns (address) { + return _implementation(); + } + + /** + * @notice Upgrade the backing implementation of the proxy. + * @dev Only the admin can call this function. + * @param newImplementation The address of the new implementation. + */ + function upgradeTo(address newImplementation) external ifAdmin { + _upgradeTo(newImplementation); + } + + /** + * @notice Upgrade the backing implementation of the proxy and call a function + * on the new implementation. + * @dev This is useful to initialize the proxied contract. + * @param newImplementation The address of the new implementation. + * @param data Data to send as msg.data in the low level call. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + */ + function upgradeToAndCall( + address newImplementation, + bytes calldata data + ) external payable ifAdmin { + _upgradeTo(newImplementation); + (bool success, ) = newImplementation.delegatecall(data); + require(success); + } + + /** + * @notice Only fall back when the sender is not the admin. + */ + function _willFallback() internal virtual override { + require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); + super._willFallback(); + } +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol + +/** + * @title InitializableAdminUpgradeabilityProxy + * @author Aave + * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function + */ +contract InitializableImmutableAdminUpgradeabilityProxy is + BaseImmutableAdminUpgradeabilityProxy, + InitializableUpgradeabilityProxy +{ + /** + * @dev Constructor. + * @param admin The address of the admin + */ + constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { + // Intentionally left blank + } + + /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy + function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { + BaseImmutableAdminUpgradeabilityProxy._willFallback(); + } +} + +// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/logic/ConfiguratorLogic.sol + +/** + * @title ConfiguratorLogic library + * @author Aave + * @notice Implements the functions to initialize reserves and update aTokens and debtTokens + */ +library ConfiguratorLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPoolConfigurator` for descriptions + event ReserveInitialized( + address indexed asset, + address indexed aToken, + address stableDebtToken, + address variableDebtToken, + address interestRateStrategyAddress + ); + event ATokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + event StableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + event VariableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @notice Initialize a reserve by creating and initializing aToken, stable debt token and variable debt token + * @dev Emits the `ReserveInitialized` event + * @param pool The Pool in which the reserve will be initialized + * @param input The needed parameters for the initialization + */ + function executeInitReserve( + IPool pool, + ConfiguratorInputTypes.InitReserveInput calldata input + ) external { + // It is an assumption that the asset listed is non-malicious, and the external call doesn't create re-entrancies + uint8 underlyingAssetDecimals = IERC20Detailed(input.underlyingAsset).decimals(); + require(underlyingAssetDecimals > 5, Errors.INVALID_DECIMALS); + + address aTokenProxyAddress = _initTokenWithProxy( + input.aTokenImpl, + abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + pool, + input.treasury, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.aTokenName, + input.aTokenSymbol, + input.params + ) + ); + + address stableDebtTokenProxyAddress = _initTokenWithProxy( + input.stableDebtTokenImpl, + abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + pool, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.stableDebtTokenName, + input.stableDebtTokenSymbol, + input.params + ) + ); + + address variableDebtTokenProxyAddress = _initTokenWithProxy( + input.variableDebtTokenImpl, + abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + pool, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.variableDebtTokenName, + input.variableDebtTokenSymbol, + input.params + ) + ); + + pool.initReserve( + input.underlyingAsset, + aTokenProxyAddress, + stableDebtTokenProxyAddress, + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + + DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); + + currentConfig.setDecimals(underlyingAssetDecimals); + + currentConfig.setActive(true); + currentConfig.setPaused(false); + currentConfig.setFrozen(false); + currentConfig.setVirtualAccActive(input.useVirtualBalance); + + pool.setConfiguration(input.underlyingAsset, currentConfig); + + IReserveInterestRateStrategy(input.interestRateStrategyAddress).setInterestRateParams( + input.underlyingAsset, + input.interestRateData + ); + + emit ReserveInitialized( + input.underlyingAsset, + aTokenProxyAddress, + stableDebtTokenProxyAddress, + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + } + + /** + * @notice Updates the aToken implementation and initializes it + * @dev Emits the `ATokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the aToken + * @param input The parameters needed for the initialize call + */ + function executeUpdateAToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateATokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + cachedPool, + input.treasury, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); + + emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); + } + + /** + * @notice Updates the stable debt token implementation and initializes it + * @dev Emits the `StableDebtTokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the stable debt token + * @param input The parameters needed for the initialize call + */ + function executeUpdateStableDebtToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + cachedPool, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation( + reserveData.stableDebtTokenAddress, + input.implementation, + encodedCall + ); + + emit StableDebtTokenUpgraded( + input.asset, + reserveData.stableDebtTokenAddress, + input.implementation + ); + } + + /** + * @notice Updates the variable debt token implementation and initializes it + * @dev Emits the `VariableDebtTokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the variable debt token + * @param input The parameters needed for the initialize call + */ + function executeUpdateVariableDebtToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + cachedPool, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation( + reserveData.variableDebtTokenAddress, + input.implementation, + encodedCall + ); + + emit VariableDebtTokenUpgraded( + input.asset, + reserveData.variableDebtTokenAddress, + input.implementation + ); + } + + /** + * @notice Creates a new proxy and initializes the implementation + * @param implementation The address of the implementation + * @param initParams The parameters that is passed to the implementation to initialize + * @return The address of initialized proxy + */ + function _initTokenWithProxy( + address implementation, + bytes memory initParams + ) internal returns (address) { + InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( + address(this) + ); + + proxy.initialize(implementation, initParams); + + return address(proxy); + } + + /** + * @notice Upgrades the implementation and makes call to the proxy + * @dev The call is used to initialize the new implementation. + * @param proxyAddress The address of the proxy + * @param implementation The address of the new implementation + * @param initParams The parameters to the call after the upgrade + */ + function _upgradeTokenImplementation( + address proxyAddress, + address implementation, + bytes memory initParams + ) internal { + InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( + payable(proxyAddress) + ); + + proxy.upgradeToAndCall(implementation, initParams); + } +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol new file mode 100644 index 00000000..aec817cb --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import './Proxy.sol'; +import '../contracts/Address.sol'; + +/** + * @title BaseUpgradeabilityProxy + * @dev This contract implements a proxy that allows to change the + * implementation address to which it will delegate. + * Such a change is called an implementation upgrade. + */ +contract BaseUpgradeabilityProxy is Proxy { + /** + * @dev Emitted when the implementation is upgraded. + * @param implementation Address of the new implementation. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Storage slot with the address of the current implementation. + * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is + * validated in the constructor. + */ + bytes32 internal constant IMPLEMENTATION_SLOT = + 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + /** + * @dev Returns the current implementation. + * @return impl Address of the current implementation + */ + function _implementation() internal view override returns (address impl) { + bytes32 slot = IMPLEMENTATION_SLOT; + //solium-disable-next-line + assembly { + impl := sload(slot) + } + } + + /** + * @dev Upgrades the proxy to a new implementation. + * @param newImplementation Address of the new implementation. + */ + function _upgradeTo(address newImplementation) internal { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + } + + /** + * @dev Sets the implementation address of the proxy. + * @param newImplementation Address of the new implementation. + */ + function _setImplementation(address newImplementation) internal { + require( + Address.isContract(newImplementation), + 'Cannot set a proxy implementation to a non-contract address' + ); + + bytes32 slot = IMPLEMENTATION_SLOT; + + //solium-disable-next-line + assembly { + sstore(slot, newImplementation) + } + } +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol new file mode 100644 index 00000000..4b43fa6a --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import './BaseUpgradeabilityProxy.sol'; + +/** + * @title InitializableUpgradeabilityProxy + * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing + * implementation and init data. + */ +contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { + /** + * @dev Contract initializer. + * @param _logic Address of the initial implementation. + * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. + */ + function initialize(address _logic, bytes memory _data) public payable { + require(_implementation() == address(0)); + assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); + _setImplementation(_logic); + if (_data.length > 0) { + (bool success, ) = _logic.delegatecall(_data); + require(success); + } + } +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol new file mode 100644 index 00000000..53589441 --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title Proxy + * @dev Implements delegation of calls to other contracts, with proper + * forwarding of return values and bubbling of failures. + * It defines a fallback function that delegates all calls to the address + * returned by the abstract _implementation() internal function. + */ +abstract contract Proxy { + /** + * @dev Fallback function. + * Will run if no other function in the contract matches the call data. + * Implemented entirely in `_fallback`. + */ + fallback() external payable { + _fallback(); + } + + /** + * @dev Fallback function that will run if call data is empty. + * IMPORTANT. receive() on implementation contracts will be unreachable + */ + receive() external payable { + _fallback(); + } + + /** + * @return The Address of the implementation. + */ + function _implementation() internal view virtual returns (address); + + /** + * @dev Delegates execution to an implementation contract. + * This is a low level function that doesn't return to its internal call site. + * It will return to the external caller whatever the implementation returns. + * @param implementation Address to delegate. + */ + function _delegate(address implementation) internal { + //solium-disable-next-line + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + /** + * @dev Function that is run as the first thing in the fallback function. + * Can be redefined in derived contracts to add functionality. + * Redefinitions must call super._willFallback(). + */ + function _willFallback() internal virtual {} + + /** + * @dev fallback implementation. + * Extracted to enable manual triggering. + */ + function _fallback() internal { + _willFallback(); + _delegate(_implementation()); + } +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4e49aa40 --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPool.sol @@ -0,0 +1,835 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on swapBorrowRateMode() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user swapping his rate mode + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + */ + event SwapBorrowRateMode( + address indexed reserve, + address indexed user, + DataTypes.InterestRateMode interestRateMode + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on rebalanceStableBorrowRate() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user for which the rebalance has been executed + */ + event RebalanceStableBorrowRate(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the + * corresponding debt token (StableDebtToken or VariableDebtToken) + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 stable/variable debt tokens, depending on the `interestRateMode` + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa + * @param asset The address of the underlying asset borrowed + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + */ + function swapBorrowRateMode(address asset, uint256 interestRateMode) external; + + /** + * @notice Permissionless method which allows anyone to swap a users stable debt to variable debt + * @dev Introduced in favor of stable rate deprecation + * @param asset The address of the underlying asset borrowed + * @param user The address of the user whose debt will be swapped from stable to variable + */ + function swapToVariable(address asset, address user) external; + + /** + * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. + * - Users can be rebalanced if the following conditions are satisfied: + * 1. Usage ratio is above 95% + * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too + * much has been borrowed at a stable rate and suppliers are not earning enough + * @param asset The address of the underlying asset borrowed + * @param user The address of the user to be rebalanced + */ + function rebalanceStableBorrowRate(address asset, address user) external; + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address stableDebtAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new category for the eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; + + /** + * @notice Returns the data of an eMode category + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate + * @return The percentage of available liquidity to borrow, expressed in bps + */ + function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external returns (address); +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..cdd81565 --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return stableBorrowRate The stable borrow rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256, uint256); +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..06d2f827 --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {BaseUpgradeabilityProxy} from '../../../dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol'; + +/** + * @title BaseImmutableAdminUpgradeabilityProxy + * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern + * @notice This contract combines an upgradeability proxy with an authorization + * mechanism for administrative tasks. + * @dev The admin role is stored in an immutable, which helps saving transactions costs + * All external functions in this contract must be guarded by the + * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity + * feature proposal that would enable this to be done automatically. + */ +contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + address internal immutable _admin; + + /** + * @dev Constructor. + * @param admin_ The address of the admin + */ + constructor(address admin_) { + _admin = admin_; + } + + modifier ifAdmin() { + if (msg.sender == _admin) { + _; + } else { + _fallback(); + } + } + + /** + * @notice Return the admin address + * @return The address of the proxy admin. + */ + function admin() external ifAdmin returns (address) { + return _admin; + } + + /** + * @notice Return the implementation address + * @return The address of the implementation. + */ + function implementation() external ifAdmin returns (address) { + return _implementation(); + } + + /** + * @notice Upgrade the backing implementation of the proxy. + * @dev Only the admin can call this function. + * @param newImplementation The address of the new implementation. + */ + function upgradeTo(address newImplementation) external ifAdmin { + _upgradeTo(newImplementation); + } + + /** + * @notice Upgrade the backing implementation of the proxy and call a function + * on the new implementation. + * @dev This is useful to initialize the proxied contract. + * @param newImplementation The address of the new implementation. + * @param data Data to send as msg.data in the low level call. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + */ + function upgradeToAndCall( + address newImplementation, + bytes calldata data + ) external payable ifAdmin { + _upgradeTo(newImplementation); + (bool success, ) = newImplementation.delegatecall(data); + require(success); + } + + /** + * @notice Only fall back when the sender is not the admin. + */ + function _willFallback() internal virtual override { + require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); + super._willFallback(); + } +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..0deceb5b --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {InitializableUpgradeabilityProxy} from '../../../dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol'; +import {Proxy} from '../../../dependencies/openzeppelin/upgradeability/Proxy.sol'; +import {BaseImmutableAdminUpgradeabilityProxy} from './BaseImmutableAdminUpgradeabilityProxy.sol'; + +/** + * @title InitializableAdminUpgradeabilityProxy + * @author Aave + * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function + */ +contract InitializableImmutableAdminUpgradeabilityProxy is + BaseImmutableAdminUpgradeabilityProxy, + InitializableUpgradeabilityProxy +{ + /** + * @dev Constructor. + * @param admin The address of the admin + */ + constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { + // Intentionally left blank + } + + /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy + function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { + BaseImmutableAdminUpgradeabilityProxy._willFallback(); + } +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..0408f3ce --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,640 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant STABLE_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant EMODE_CATEGORY_MASK = 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant STABLE_BORROWING_ENABLED_START_BIT_POSITION = 59; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + uint256 internal constant EMODE_CATEGORY_START_BIT_POSITION = 168; + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_EMODE_CATEGORY = 255; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables stable rate borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the stable rate borrowing needs to be enabled, false otherwise + */ + function setStableRateBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & STABLE_BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << STABLE_BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the stable rate borrowing state of the reserve + * @param self The reserve configuration + * @return The stable rate borrowing state + */ + function getStableRateBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~STABLE_BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the eMode asset category + * @param self The reserve configuration + * @param category The asset category when the user selects the eMode + */ + function setEModeCategory( + DataTypes.ReserveConfigurationMap memory self, + uint256 category + ) internal pure { + require(category <= MAX_VALID_EMODE_CATEGORY, Errors.INVALID_EMODE_CATEGORY); + + self.data = (self.data & EMODE_CATEGORY_MASK) | (category << EMODE_CATEGORY_START_BIT_POSITION); + } + + /** + * @dev Gets the eMode asset category + * @param self The reserve configuration + * @return The eMode category for the asset + */ + function getEModeCategory( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing stableRateBorrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~STABLE_BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + * @return The state param representing eMode category + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION, + (dataLocal & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..36b75308 --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/logic/ConfiguratorLogic.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/logic/ConfiguratorLogic.sol new file mode 100644 index 00000000..01580d9e --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/logic/ConfiguratorLogic.sol @@ -0,0 +1,281 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IPool} from '../../../interfaces/IPool.sol'; +import {IInitializableAToken} from '../../../interfaces/IInitializableAToken.sol'; +import {IInitializableDebtToken} from '../../../interfaces/IInitializableDebtToken.sol'; +import {InitializableImmutableAdminUpgradeabilityProxy} from '../aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {ConfiguratorInputTypes} from '../types/ConfiguratorInputTypes.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; + +/** + * @title ConfiguratorLogic library + * @author Aave + * @notice Implements the functions to initialize reserves and update aTokens and debtTokens + */ +library ConfiguratorLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPoolConfigurator` for descriptions + event ReserveInitialized( + address indexed asset, + address indexed aToken, + address stableDebtToken, + address variableDebtToken, + address interestRateStrategyAddress + ); + event ATokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + event StableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + event VariableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @notice Initialize a reserve by creating and initializing aToken, stable debt token and variable debt token + * @dev Emits the `ReserveInitialized` event + * @param pool The Pool in which the reserve will be initialized + * @param input The needed parameters for the initialization + */ + function executeInitReserve( + IPool pool, + ConfiguratorInputTypes.InitReserveInput calldata input + ) external { + // It is an assumption that the asset listed is non-malicious, and the external call doesn't create re-entrancies + uint8 underlyingAssetDecimals = IERC20Detailed(input.underlyingAsset).decimals(); + require(underlyingAssetDecimals > 5, Errors.INVALID_DECIMALS); + + address aTokenProxyAddress = _initTokenWithProxy( + input.aTokenImpl, + abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + pool, + input.treasury, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.aTokenName, + input.aTokenSymbol, + input.params + ) + ); + + address stableDebtTokenProxyAddress = _initTokenWithProxy( + input.stableDebtTokenImpl, + abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + pool, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.stableDebtTokenName, + input.stableDebtTokenSymbol, + input.params + ) + ); + + address variableDebtTokenProxyAddress = _initTokenWithProxy( + input.variableDebtTokenImpl, + abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + pool, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.variableDebtTokenName, + input.variableDebtTokenSymbol, + input.params + ) + ); + + pool.initReserve( + input.underlyingAsset, + aTokenProxyAddress, + stableDebtTokenProxyAddress, + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + + DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); + + currentConfig.setDecimals(underlyingAssetDecimals); + + currentConfig.setActive(true); + currentConfig.setPaused(false); + currentConfig.setFrozen(false); + currentConfig.setVirtualAccActive(input.useVirtualBalance); + + pool.setConfiguration(input.underlyingAsset, currentConfig); + + IReserveInterestRateStrategy(input.interestRateStrategyAddress).setInterestRateParams( + input.underlyingAsset, + input.interestRateData + ); + + emit ReserveInitialized( + input.underlyingAsset, + aTokenProxyAddress, + stableDebtTokenProxyAddress, + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + } + + /** + * @notice Updates the aToken implementation and initializes it + * @dev Emits the `ATokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the aToken + * @param input The parameters needed for the initialize call + */ + function executeUpdateAToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateATokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + cachedPool, + input.treasury, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); + + emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); + } + + /** + * @notice Updates the stable debt token implementation and initializes it + * @dev Emits the `StableDebtTokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the stable debt token + * @param input The parameters needed for the initialize call + */ + function executeUpdateStableDebtToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + cachedPool, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation( + reserveData.stableDebtTokenAddress, + input.implementation, + encodedCall + ); + + emit StableDebtTokenUpgraded( + input.asset, + reserveData.stableDebtTokenAddress, + input.implementation + ); + } + + /** + * @notice Updates the variable debt token implementation and initializes it + * @dev Emits the `VariableDebtTokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the variable debt token + * @param input The parameters needed for the initialize call + */ + function executeUpdateVariableDebtToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + cachedPool, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation( + reserveData.variableDebtTokenAddress, + input.implementation, + encodedCall + ); + + emit VariableDebtTokenUpgraded( + input.asset, + reserveData.variableDebtTokenAddress, + input.implementation + ); + } + + /** + * @notice Creates a new proxy and initializes the implementation + * @param implementation The address of the implementation + * @param initParams The parameters that is passed to the implementation to initialize + * @return The address of initialized proxy + */ + function _initTokenWithProxy( + address implementation, + bytes memory initParams + ) internal returns (address) { + InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( + address(this) + ); + + proxy.initialize(implementation, initParams); + + return address(proxy); + } + + /** + * @notice Upgrades the implementation and makes call to the proxy + * @dev The call is used to initialize the new implementation. + * @param proxyAddress The address of the proxy + * @param implementation The address of the new implementation + * @param initParams The parameters to the call after the upgrade + */ + function _upgradeTokenImplementation( + address proxyAddress, + address implementation, + bytes memory initParams + ) internal { + InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( + payable(proxyAddress) + ); + + proxy.upgradeToAndCall(implementation, initParams); + } +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol new file mode 100644 index 00000000..7a80594e --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library ConfiguratorInputTypes { + struct InitReserveInput { + address aTokenImpl; + address stableDebtTokenImpl; + address variableDebtTokenImpl; + bool useVirtualBalance; + address interestRateStrategyAddress; + address underlyingAsset; + address treasury; + address incentivesController; + string aTokenName; + string aTokenSymbol; + string variableDebtTokenName; + string variableDebtTokenSymbol; + string stableDebtTokenName; + string stableDebtTokenSymbol; + bytes params; + bytes interestRateData; + } + + struct UpdateATokenInput { + address asset; + address treasury; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } + + struct UpdateDebtTokenInput { + address asset; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } +} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..64f3e891 --- /dev/null +++ b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + //the current stable borrow rate. Expressed in ray + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + //stableDebtToken address + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + //the current stable borrow rate. Expressed in ray + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + //stableDebtToken address + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // each eMode category may or may not have a custom oracle to override the individual assets price oracles + address priceSource; + string label; + } + + enum InterestRateMode { + NONE, + STABLE, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currPrincipalStableDebt; + uint256 currAvgStableBorrowRate; + uint256 currTotalStableDebt; + uint256 nextAvgStableBorrowRate; + uint256 nextTotalStableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address stableDebtTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + uint40 stableDebtLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 maxStableLoanPercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalStableDebt; + uint256 totalVariableDebt; + uint256 averageStableBorrowRate; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address stableDebtAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL.sol new file mode 100644 index 00000000..efb0fd4a --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL.sol @@ -0,0 +1,3210 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity =0.8.10 ^0.8.0; + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + //the current stable borrow rate. Expressed in ray + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + //stableDebtToken address + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62-63: reserved + //bit 64-79: reserve factor + //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167 liquidation protocol fee + //bit 168-175 eMode category + //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // each eMode category may or may not have a custom oracle to override the individual assets price oracles + address priceSource; + string label; + } + + enum InterestRateMode { + NONE, + STABLE, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currPrincipalStableDebt; + uint256 currAvgStableBorrowRate; + uint256 currTotalStableDebt; + uint256 nextAvgStableBorrowRate; + uint256 nextTotalStableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address stableDebtTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + uint40 stableDebtLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address addressesProvider; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 maxStableLoanPercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalStableDebt; + uint256 totalVariableDebt; + uint256 averageStableBorrowRate; + uint256 reserveFactor; + address reserve; + address aToken; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address stableDebtAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol + +/** + * @title EIP712Base + * @author Aave + * @notice Base contract implementation of EIP712. + */ +abstract contract EIP712Base { + bytes public constant EIP712_REVISION = bytes('1'); + bytes32 internal constant EIP712_DOMAIN = + keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); + + // Map of address nonces (address => nonce) + mapping(address => uint256) internal _nonces; + + bytes32 internal _domainSeparator; + uint256 internal immutable _chainId; + + /** + * @dev Constructor. + */ + constructor() { + _chainId = block.chainid; + } + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { + if (block.chainid == _chainId) { + return _domainSeparator; + } + return _calculateDomainSeparator(); + } + + /** + * @notice Returns the nonce value for address specified as parameter + * @param owner The address for which the nonce is being returned + * @return The nonce value for the input address` + */ + function nonces(address owner) public view virtual returns (uint256) { + return _nonces[owner]; + } + + /** + * @notice Compute the current domain separator + * @return The domain separator for the token + */ + function _calculateDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + EIP712_DOMAIN, + keccak256(bytes(_EIP712BaseId())), + keccak256(EIP712_REVISION), + block.chainid, + address(this) + ) + ); + } + + /** + * @notice Returns the user readable name of signing domain (e.g. token name) + * @return The name of the signing domain + */ + function _EIP712BaseId() internal view virtual returns (string memory); +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on swapBorrowRateMode() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user swapping his rate mode + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + */ + event SwapBorrowRateMode( + address indexed reserve, + address indexed user, + DataTypes.InterestRateMode interestRateMode + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on rebalanceStableBorrowRate() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user for which the rebalance has been executed + */ + event RebalanceStableBorrowRate(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the + * corresponding debt token (StableDebtToken or VariableDebtToken) + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 stable/variable debt tokens, depending on the `interestRateMode` + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa + * @param asset The address of the underlying asset borrowed + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + */ + function swapBorrowRateMode(address asset, uint256 interestRateMode) external; + + /** + * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. + * - Users can be rebalanced if the following conditions are satisfied: + * 1. Usage ratio is above 95% + * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too + * much has been borrowed at a stable rate and suppliers are not earning enough + * @param asset The address of the underlying asset borrowed + * @param user The address of the user to be rebalanced + */ + function rebalanceStableBorrowRate(address asset, address user) external; + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address stableDebtAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new category for the eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; + + /** + * @notice Returns the data of an eMode category + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate + * @return The percentage of available liquidity to borrow, expressed in bps + */ + function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. StableDebtTokens use + * this field to store the user's stable rate. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor(IPool pool, string memory name, string memory symbol, uint8 decimals) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name; + _symbol = symbol; + _decimals = decimals; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol + +/** + * @title MintableIncentivizedERC20 + * @author Aave + * @notice Implements mint and burn functions for IncentivizedERC20 + */ +abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) IncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /** + * @notice Mints tokens to an account and apply incentives if defined + * @param account The address receiving tokens + * @param amount The amount of tokens to mint + */ + function _mint(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply + amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } + + /** + * @notice Burns tokens from an account and apply incentives if defined + * @param account The account whose tokens are burnt + * @param amount The amount of tokens to burn + */ + function _burn(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply - amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance - amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol + +/** + * @title ScaledBalanceTokenBase + * @author Aave + * @notice Basic ERC20 implementation of scaled balance token + */ +abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) MintableIncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /// @inheritdoc IScaledBalanceToken + function scaledBalanceOf(address user) external view override returns (uint256) { + return super.balanceOf(user); + } + + /// @inheritdoc IScaledBalanceToken + function getScaledUserBalanceAndSupply( + address user + ) external view override returns (uint256, uint256) { + return (super.balanceOf(user), super.totalSupply()); + } + + /// @inheritdoc IScaledBalanceToken + function scaledTotalSupply() public view virtual override returns (uint256) { + return super.totalSupply(); + } + + /// @inheritdoc IScaledBalanceToken + function getPreviousIndex(address user) external view virtual override returns (uint256) { + return _userState[user].additionalData; + } + + /** + * @notice Implements the basic logic to mint a scaled balance token. + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the scaled tokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function _mintScaled( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) internal returns (bool) { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); + + uint256 scaledBalance = super.balanceOf(onBehalfOf); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[onBehalfOf].additionalData); + + _userState[onBehalfOf].additionalData = index.toUint128(); + + _mint(onBehalfOf, amountScaled.toUint128()); + + uint256 amountToMint = amount + balanceIncrease; + emit Transfer(address(0), onBehalfOf, amountToMint); + emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); + + return (scaledBalance == 0); + } + + /** + * @notice Implements the basic logic to burn a scaled balance token. + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param user The user which debt is burnt + * @param target The address that will receive the underlying, if any + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + */ + function _burnScaled(address user, address target, uint256 amount, uint256 index) internal { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); + + uint256 scaledBalance = super.balanceOf(user); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[user].additionalData); + + _userState[user].additionalData = index.toUint128(); + + _burn(user, amountScaled.toUint128()); + + if (balanceIncrease > amount) { + uint256 amountToMint = balanceIncrease - amount; + emit Transfer(address(0), user, amountToMint); + emit Mint(user, user, amountToMint, balanceIncrease, index); + } else { + uint256 amountToBurn = amount - balanceIncrease; + emit Transfer(user, address(0), amountToBurn); + emit Burn(user, target, amountToBurn, balanceIncrease, index); + } + } + + /** + * @notice Implements the basic logic to transfer scaled balance tokens between two users + * @dev It emits a mint event with the interest accrued per user + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + * @param index The next liquidity index of the reserve + */ + function _transfer(address sender, address recipient, uint256 amount, uint256 index) internal { + uint256 senderScaledBalance = super.balanceOf(sender); + uint256 senderBalanceIncrease = senderScaledBalance.rayMul(index) - + senderScaledBalance.rayMul(_userState[sender].additionalData); + + uint256 recipientScaledBalance = super.balanceOf(recipient); + uint256 recipientBalanceIncrease = recipientScaledBalance.rayMul(index) - + recipientScaledBalance.rayMul(_userState[recipient].additionalData); + + _userState[sender].additionalData = index.toUint128(); + _userState[recipient].additionalData = index.toUint128(); + + super._transfer(sender, recipient, amount.rayDiv(index).toUint128()); + + if (senderBalanceIncrease > 0) { + emit Transfer(address(0), sender, senderBalanceIncrease); + emit Mint(_msgSender(), sender, senderBalanceIncrease, senderBalanceIncrease, index); + } + + if (sender != recipient && recipientBalanceIncrease > 0) { + emit Transfer(address(0), recipient, recipientBalanceIncrease); + emit Mint(_msgSender(), recipient, recipientBalanceIncrease, recipientBalanceIncrease, index); + } + + emit Transfer(sender, recipient, amount); + } +} + +// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol + +/** + * @title Aave ERC20 AToken + * @author Aave + * @notice Implementation of the interest bearing token for the Aave protocol + */ +contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, IAToken { + using WadRayMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + + bytes32 public constant PERMIT_TYPEHASH = + keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); + + uint256 public constant ATOKEN_REVISION = 0x2; + + address internal _treasury; + address internal _underlyingAsset; + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure virtual override returns (uint256) { + return ATOKEN_REVISION; + } + + /** + * @dev Constructor. + * @param pool The address of the Pool contract + */ + constructor( + IPool pool + ) ScaledBalanceTokenBase(pool, 'ATOKEN_IMPL', 'ATOKEN_IMPL', 0) EIP712Base() { + // Intentionally left blank + } + + /// @inheritdoc IInitializableAToken + function initialize( + IPool initializingPool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) public virtual override initializer { + require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); + _setName(aTokenName); + _setSymbol(aTokenSymbol); + _setDecimals(aTokenDecimals); + + _treasury = treasury; + _underlyingAsset = underlyingAsset; + _incentivesController = incentivesController; + + _domainSeparator = _calculateDomainSeparator(); + + emit Initialized( + underlyingAsset, + address(POOL), + treasury, + address(incentivesController), + aTokenDecimals, + aTokenName, + aTokenSymbol, + params + ); + } + + /// @inheritdoc IAToken + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external virtual override onlyPool returns (bool) { + return _mintScaled(caller, onBehalfOf, amount, index); + } + + /// @inheritdoc IAToken + function burn( + address from, + address receiverOfUnderlying, + uint256 amount, + uint256 index + ) external virtual override onlyPool { + _burnScaled(from, receiverOfUnderlying, amount, index); + if (receiverOfUnderlying != address(this)) { + IERC20(_underlyingAsset).safeTransfer(receiverOfUnderlying, amount); + } + } + + /// @inheritdoc IAToken + function mintToTreasury(uint256 amount, uint256 index) external virtual override onlyPool { + if (amount == 0) { + return; + } + _mintScaled(address(POOL), _treasury, amount, index); + } + + /// @inheritdoc IAToken + function transferOnLiquidation( + address from, + address to, + uint256 value + ) external virtual override onlyPool { + // Being a normal transfer, the Transfer() and BalanceTransfer() are emitted + // so no need to emit a specific event here + _transfer(from, to, value, false); + } + + /// @inheritdoc IERC20 + function balanceOf( + address user + ) public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { + return super.balanceOf(user).rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { + uint256 currentSupplyScaled = super.totalSupply(); + + if (currentSupplyScaled == 0) { + return 0; + } + + return currentSupplyScaled.rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); + } + + /// @inheritdoc IAToken + function RESERVE_TREASURY_ADDRESS() external view override returns (address) { + return _treasury; + } + + /// @inheritdoc IAToken + function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { + return _underlyingAsset; + } + + /// @inheritdoc IAToken + function transferUnderlyingTo(address target, uint256 amount) external virtual override onlyPool { + IERC20(_underlyingAsset).safeTransfer(target, amount); + } + + /// @inheritdoc IAToken + function handleRepayment( + address user, + address onBehalfOf, + uint256 amount + ) external virtual override onlyPool { + // Intentionally left blank + } + + /// @inheritdoc IAToken + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external override { + require(owner != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + //solium-disable-next-line + require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); + uint256 currentValidNonce = _nonces[owner]; + bytes32 digest = keccak256( + abi.encodePacked( + '\x19\x01', + DOMAIN_SEPARATOR(), + keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentValidNonce, deadline)) + ) + ); + require(owner == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); + _nonces[owner] = currentValidNonce + 1; + _approve(owner, spender, value); + } + + /** + * @notice Transfers the aTokens between two users. Validates the transfer + * (ie checks for valid HF after the transfer) if required + * @param from The source address + * @param to The destination address + * @param amount The amount getting transferred + * @param validate True if the transfer needs to be validated, false otherwise + */ + function _transfer(address from, address to, uint256 amount, bool validate) internal virtual { + address underlyingAsset = _underlyingAsset; + + uint256 index = POOL.getReserveNormalizedIncome(underlyingAsset); + + uint256 fromBalanceBefore = super.balanceOf(from).rayMul(index); + uint256 toBalanceBefore = super.balanceOf(to).rayMul(index); + + super._transfer(from, to, amount, index); + + if (validate) { + POOL.finalizeTransfer(underlyingAsset, from, to, amount, fromBalanceBefore, toBalanceBefore); + } + + emit BalanceTransfer(from, to, amount.rayDiv(index), index); + } + + /** + * @notice Overrides the parent _transfer to force validated transfer() and transferFrom() + * @param from The source address + * @param to The destination address + * @param amount The amount getting transferred + */ + function _transfer(address from, address to, uint128 amount) internal virtual override { + _transfer(from, to, amount, true); + } + + /** + * @dev Overrides the base function to fully implement IAToken + * @dev see `EIP712Base.DOMAIN_SEPARATOR()` for more detailed documentation + */ + function DOMAIN_SEPARATOR() public view override(IAToken, EIP712Base) returns (bytes32) { + return super.DOMAIN_SEPARATOR(); + } + + /** + * @dev Overrides the base function to fully implement IAToken + * @dev see `EIP712Base.nonces()` for more detailed documentation + */ + function nonces(address owner) public view override(IAToken, EIP712Base) returns (uint256) { + return super.nonces(owner); + } + + /// @inheritdoc EIP712Base + function _EIP712BaseId() internal view override returns (string memory) { + return name(); + } + + /// @inheritdoc IAToken + function rescueTokens(address token, address to, uint256 amount) external override onlyPoolAdmin { + require(token != _underlyingAsset, Errors.UNDERLYING_CANNOT_BE_RESCUED); + IERC20(token).safeTransfer(to, amount); + } +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..c58fdb09 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity 0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..445ee640 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..1d470e01 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..6303454f --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..6d708093 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity 0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..d5d97ceb --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..1379dff6 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..c06c605a --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..0b16baa8 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..ef306e73 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPool.sol @@ -0,0 +1,737 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on swapBorrowRateMode() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user swapping his rate mode + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + */ + event SwapBorrowRateMode( + address indexed reserve, + address indexed user, + DataTypes.InterestRateMode interestRateMode + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on rebalanceStableBorrowRate() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user for which the rebalance has been executed + */ + event RebalanceStableBorrowRate(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the + * corresponding debt token (StableDebtToken or VariableDebtToken) + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 stable/variable debt tokens, depending on the `interestRateMode` + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa + * @param asset The address of the underlying asset borrowed + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + */ + function swapBorrowRateMode(address asset, uint256 interestRateMode) external; + + /** + * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. + * - Users can be rebalanced if the following conditions are satisfied: + * 1. Usage ratio is above 95% + * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too + * much has been borrowed at a stable rate and suppliers are not earning enough + * @param asset The address of the underlying asset borrowed + * @param user The address of the user to be rebalanced + */ + function rebalanceStableBorrowRate(address asset, address user) external; + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address stableDebtAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new category for the eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; + + /** + * @notice Returns the data of an eMode category + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate + * @return The percentage of available liquidity to borrow, expressed in bps + */ + function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..587a0d0b --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..fe311fbb --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol new file mode 100644 index 00000000..d24312bf --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..990069e0 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..8589dc0a --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,264 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +library DataTypes { + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + //the current stable borrow rate. Expressed in ray + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + //stableDebtToken address + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62-63: reserved + //bit 64-79: reserve factor + //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167 liquidation protocol fee + //bit 168-175 eMode category + //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // each eMode category may or may not have a custom oracle to override the individual assets price oracles + address priceSource; + string label; + } + + enum InterestRateMode {NONE, STABLE, VARIABLE} + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currPrincipalStableDebt; + uint256 currAvgStableBorrowRate; + uint256 currTotalStableDebt; + uint256 nextAvgStableBorrowRate; + uint256 nextTotalStableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address stableDebtTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + uint40 stableDebtLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address addressesProvider; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 maxStableLoanPercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalStableDebt; + uint256 totalVariableDebt; + uint256 averageStableBorrowRate; + uint256 reserveFactor; + address reserve; + address aToken; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address stableDebtAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol new file mode 100644 index 00000000..845b09fd --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {VersionedInitializable} from '../libraries/aave-upgradeability/VersionedInitializable.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; +import {WadRayMath} from '../libraries/math/WadRayMath.sol'; +import {IPool} from '../../interfaces/IPool.sol'; +import {IAToken} from '../../interfaces/IAToken.sol'; +import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; +import {IInitializableAToken} from '../../interfaces/IInitializableAToken.sol'; +import {ScaledBalanceTokenBase} from './base/ScaledBalanceTokenBase.sol'; +import {IncentivizedERC20} from './base/IncentivizedERC20.sol'; +import {EIP712Base} from './base/EIP712Base.sol'; + +/** + * @title Aave ERC20 AToken + * @author Aave + * @notice Implementation of the interest bearing token for the Aave protocol + */ +contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, IAToken { + using WadRayMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + + bytes32 public constant PERMIT_TYPEHASH = + keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); + + uint256 public constant ATOKEN_REVISION = 0x2; + + address internal _treasury; + address internal _underlyingAsset; + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure virtual override returns (uint256) { + return ATOKEN_REVISION; + } + + /** + * @dev Constructor. + * @param pool The address of the Pool contract + */ + constructor( + IPool pool + ) ScaledBalanceTokenBase(pool, 'ATOKEN_IMPL', 'ATOKEN_IMPL', 0) EIP712Base() { + // Intentionally left blank + } + + /// @inheritdoc IInitializableAToken + function initialize( + IPool initializingPool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) public virtual override initializer { + require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); + _setName(aTokenName); + _setSymbol(aTokenSymbol); + _setDecimals(aTokenDecimals); + + _treasury = treasury; + _underlyingAsset = underlyingAsset; + _incentivesController = incentivesController; + + _domainSeparator = _calculateDomainSeparator(); + + emit Initialized( + underlyingAsset, + address(POOL), + treasury, + address(incentivesController), + aTokenDecimals, + aTokenName, + aTokenSymbol, + params + ); + } + + /// @inheritdoc IAToken + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external virtual override onlyPool returns (bool) { + return _mintScaled(caller, onBehalfOf, amount, index); + } + + /// @inheritdoc IAToken + function burn( + address from, + address receiverOfUnderlying, + uint256 amount, + uint256 index + ) external virtual override onlyPool { + _burnScaled(from, receiverOfUnderlying, amount, index); + if (receiverOfUnderlying != address(this)) { + IERC20(_underlyingAsset).safeTransfer(receiverOfUnderlying, amount); + } + } + + /// @inheritdoc IAToken + function mintToTreasury(uint256 amount, uint256 index) external virtual override onlyPool { + if (amount == 0) { + return; + } + _mintScaled(address(POOL), _treasury, amount, index); + } + + /// @inheritdoc IAToken + function transferOnLiquidation( + address from, + address to, + uint256 value + ) external virtual override onlyPool { + // Being a normal transfer, the Transfer() and BalanceTransfer() are emitted + // so no need to emit a specific event here + _transfer(from, to, value, false); + } + + /// @inheritdoc IERC20 + function balanceOf( + address user + ) public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { + return super.balanceOf(user).rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { + uint256 currentSupplyScaled = super.totalSupply(); + + if (currentSupplyScaled == 0) { + return 0; + } + + return currentSupplyScaled.rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); + } + + /// @inheritdoc IAToken + function RESERVE_TREASURY_ADDRESS() external view override returns (address) { + return _treasury; + } + + /// @inheritdoc IAToken + function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { + return _underlyingAsset; + } + + /// @inheritdoc IAToken + function transferUnderlyingTo(address target, uint256 amount) external virtual override onlyPool { + IERC20(_underlyingAsset).safeTransfer(target, amount); + } + + /// @inheritdoc IAToken + function handleRepayment( + address user, + address onBehalfOf, + uint256 amount + ) external virtual override onlyPool { + // Intentionally left blank + } + + /// @inheritdoc IAToken + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external override { + require(owner != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + //solium-disable-next-line + require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); + uint256 currentValidNonce = _nonces[owner]; + bytes32 digest = keccak256( + abi.encodePacked( + '\x19\x01', + DOMAIN_SEPARATOR(), + keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentValidNonce, deadline)) + ) + ); + require(owner == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); + _nonces[owner] = currentValidNonce + 1; + _approve(owner, spender, value); + } + + /** + * @notice Transfers the aTokens between two users. Validates the transfer + * (ie checks for valid HF after the transfer) if required + * @param from The source address + * @param to The destination address + * @param amount The amount getting transferred + * @param validate True if the transfer needs to be validated, false otherwise + */ + function _transfer(address from, address to, uint256 amount, bool validate) internal virtual { + address underlyingAsset = _underlyingAsset; + + uint256 index = POOL.getReserveNormalizedIncome(underlyingAsset); + + uint256 fromBalanceBefore = super.balanceOf(from).rayMul(index); + uint256 toBalanceBefore = super.balanceOf(to).rayMul(index); + + super._transfer(from, to, amount, index); + + if (validate) { + POOL.finalizeTransfer(underlyingAsset, from, to, amount, fromBalanceBefore, toBalanceBefore); + } + + emit BalanceTransfer(from, to, amount.rayDiv(index), index); + } + + /** + * @notice Overrides the parent _transfer to force validated transfer() and transferFrom() + * @param from The source address + * @param to The destination address + * @param amount The amount getting transferred + */ + function _transfer(address from, address to, uint128 amount) internal virtual override { + _transfer(from, to, amount, true); + } + + /** + * @dev Overrides the base function to fully implement IAToken + * @dev see `EIP712Base.DOMAIN_SEPARATOR()` for more detailed documentation + */ + function DOMAIN_SEPARATOR() public view override(IAToken, EIP712Base) returns (bytes32) { + return super.DOMAIN_SEPARATOR(); + } + + /** + * @dev Overrides the base function to fully implement IAToken + * @dev see `EIP712Base.nonces()` for more detailed documentation + */ + function nonces(address owner) public view override(IAToken, EIP712Base) returns (uint256) { + return super.nonces(owner); + } + + /// @inheritdoc EIP712Base + function _EIP712BaseId() internal view override returns (string memory) { + return name(); + } + + /// @inheritdoc IAToken + function rescueTokens(address token, address to, uint256 amount) external override onlyPoolAdmin { + require(token != _underlyingAsset, Errors.UNDERLYING_CANNOT_BE_RESCUED); + IERC20(token).safeTransfer(to, amount); + } +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol new file mode 100644 index 00000000..afe9dd8b --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +/** + * @title EIP712Base + * @author Aave + * @notice Base contract implementation of EIP712. + */ +abstract contract EIP712Base { + bytes public constant EIP712_REVISION = bytes('1'); + bytes32 internal constant EIP712_DOMAIN = + keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); + + // Map of address nonces (address => nonce) + mapping(address => uint256) internal _nonces; + + bytes32 internal _domainSeparator; + uint256 internal immutable _chainId; + + /** + * @dev Constructor. + */ + constructor() { + _chainId = block.chainid; + } + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { + if (block.chainid == _chainId) { + return _domainSeparator; + } + return _calculateDomainSeparator(); + } + + /** + * @notice Returns the nonce value for address specified as parameter + * @param owner The address for which the nonce is being returned + * @return The nonce value for the input address` + */ + function nonces(address owner) public view virtual returns (uint256) { + return _nonces[owner]; + } + + /** + * @notice Compute the current domain separator + * @return The domain separator for the token + */ + function _calculateDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + EIP712_DOMAIN, + keccak256(bytes(_EIP712BaseId())), + keccak256(EIP712_REVISION), + block.chainid, + address(this) + ) + ); + } + + /** + * @notice Returns the user readable name of signing domain (e.g. token name) + * @return The name of the signing domain + */ + function _EIP712BaseId() internal view virtual returns (string memory); +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..08a219e0 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,235 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. StableDebtTokens use + * this field to store the user's stable rate. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor(IPool pool, string memory name, string memory symbol, uint8 decimals) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name; + _symbol = symbol; + _decimals = decimals; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol new file mode 100644 index 00000000..6d2120e3 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IncentivizedERC20} from './IncentivizedERC20.sol'; + +/** + * @title MintableIncentivizedERC20 + * @author Aave + * @notice Implements mint and burn functions for IncentivizedERC20 + */ +abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) IncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /** + * @notice Mints tokens to an account and apply incentives if defined + * @param account The address receiving tokens + * @param amount The amount of tokens to mint + */ + function _mint(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply + amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } + + /** + * @notice Burns tokens from an account and apply incentives if defined + * @param account The account whose tokens are burnt + * @param amount The amount of tokens to burn + */ + function _burn(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply - amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance - amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } +} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol new file mode 100644 index 00000000..d0010e5f --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {MintableIncentivizedERC20} from './MintableIncentivizedERC20.sol'; + +/** + * @title ScaledBalanceTokenBase + * @author Aave + * @notice Basic ERC20 implementation of scaled balance token + */ +abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) MintableIncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /// @inheritdoc IScaledBalanceToken + function scaledBalanceOf(address user) external view override returns (uint256) { + return super.balanceOf(user); + } + + /// @inheritdoc IScaledBalanceToken + function getScaledUserBalanceAndSupply( + address user + ) external view override returns (uint256, uint256) { + return (super.balanceOf(user), super.totalSupply()); + } + + /// @inheritdoc IScaledBalanceToken + function scaledTotalSupply() public view virtual override returns (uint256) { + return super.totalSupply(); + } + + /// @inheritdoc IScaledBalanceToken + function getPreviousIndex(address user) external view virtual override returns (uint256) { + return _userState[user].additionalData; + } + + /** + * @notice Implements the basic logic to mint a scaled balance token. + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the scaled tokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function _mintScaled( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) internal returns (bool) { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); + + uint256 scaledBalance = super.balanceOf(onBehalfOf); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[onBehalfOf].additionalData); + + _userState[onBehalfOf].additionalData = index.toUint128(); + + _mint(onBehalfOf, amountScaled.toUint128()); + + uint256 amountToMint = amount + balanceIncrease; + emit Transfer(address(0), onBehalfOf, amountToMint); + emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); + + return (scaledBalance == 0); + } + + /** + * @notice Implements the basic logic to burn a scaled balance token. + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param user The user which debt is burnt + * @param target The address that will receive the underlying, if any + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + */ + function _burnScaled(address user, address target, uint256 amount, uint256 index) internal { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); + + uint256 scaledBalance = super.balanceOf(user); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[user].additionalData); + + _userState[user].additionalData = index.toUint128(); + + _burn(user, amountScaled.toUint128()); + + if (balanceIncrease > amount) { + uint256 amountToMint = balanceIncrease - amount; + emit Transfer(address(0), user, amountToMint); + emit Mint(user, user, amountToMint, balanceIncrease, index); + } else { + uint256 amountToBurn = amount - balanceIncrease; + emit Transfer(user, address(0), amountToBurn); + emit Burn(user, target, amountToBurn, balanceIncrease, index); + } + } + + /** + * @notice Implements the basic logic to transfer scaled balance tokens between two users + * @dev It emits a mint event with the interest accrued per user + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + * @param index The next liquidity index of the reserve + */ + function _transfer(address sender, address recipient, uint256 amount, uint256 index) internal { + uint256 senderScaledBalance = super.balanceOf(sender); + uint256 senderBalanceIncrease = senderScaledBalance.rayMul(index) - + senderScaledBalance.rayMul(_userState[sender].additionalData); + + uint256 recipientScaledBalance = super.balanceOf(recipient); + uint256 recipientBalanceIncrease = recipientScaledBalance.rayMul(index) - + recipientScaledBalance.rayMul(_userState[recipient].additionalData); + + _userState[sender].additionalData = index.toUint128(); + _userState[recipient].additionalData = index.toUint128(); + + super._transfer(sender, recipient, amount.rayDiv(index).toUint128()); + + if (senderBalanceIncrease > 0) { + emit Transfer(address(0), sender, senderBalanceIncrease); + emit Mint(_msgSender(), sender, senderBalanceIncrease, senderBalanceIncrease, index); + } + + if (sender != recipient && recipientBalanceIncrease > 0) { + emit Transfer(address(0), recipient, recipientBalanceIncrease); + emit Mint(_msgSender(), recipient, recipientBalanceIncrease, recipientBalanceIncrease, index); + } + + emit Transfer(sender, recipient, amount); + } +} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol new file mode 100644 index 00000000..8c00995f --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol @@ -0,0 +1,1852 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity =0.8.10 ^0.8.0 ^0.8.10; + +// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaledbalance token. + **/ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted scaled balance tokens + * @param value The amount being minted (user entered amount + balance increase from interest) + * @param balanceIncrease The increase in balance since the last action of the user + * @param index The next liquidity index of the reserve + **/ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after scaled balance tokens are burned + * @param from The address from which the scaled tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in balance since the last action of the user + * @param index The next liquidity index of the reserve + **/ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + **/ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + **/ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + **/ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + **/ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + **/ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + **/ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} + +// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/misc/interfaces/IEACAggregatorProxy.sol + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} + +// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsDistributor.sol + +/** + * @title IRewardsDistributor + * @author Aave + * @notice Defines the basic interface for a Rewards Distributor. + */ +interface IRewardsDistributor { + /** + * @dev Emitted when the configuration of the rewards of an asset is updated. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param oldEmission The old emissions per second value of the reward distribution + * @param newEmission The new emissions per second value of the reward distribution + * @param oldDistributionEnd The old end timestamp of the reward distribution + * @param newDistributionEnd The new end timestamp of the reward distribution + * @param assetIndex The index of the asset distribution + */ + event AssetConfigUpdated( + address indexed asset, + address indexed reward, + uint256 oldEmission, + uint256 newEmission, + uint256 oldDistributionEnd, + uint256 newDistributionEnd, + uint256 assetIndex + ); + + /** + * @dev Emitted when rewards of an asset are accrued on behalf of a user. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param user The address of the user that rewards are accrued on behalf of + * @param assetIndex The index of the asset distribution + * @param userIndex The index of the asset distribution on behalf of the user + * @param rewardsAccrued The amount of rewards accrued + */ + event Accrued( + address indexed asset, + address indexed reward, + address indexed user, + uint256 assetIndex, + uint256 userIndex, + uint256 rewardsAccrued + ); + + /** + * @dev Sets the end date for the distribution + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Gets the end date for the distribution + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The timestamp with the end of the distribution, in unix time format + **/ + function getDistributionEnd(address asset, address reward) external view returns (uint256); + + /** + * @dev Returns the index of a user on a reward distribution + * @param user Address of the user + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The current user asset index, not including new distributions + **/ + function getUserAssetIndex( + address user, + address asset, + address reward + ) external view returns (uint256); + + /** + * @dev Returns the configuration of the distribution reward for a certain asset + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The index of the asset distribution + * @return The emission per second of the reward distribution + * @return The timestamp of the last update of the index + * @return The timestamp of the distribution end + **/ + function getRewardsData( + address asset, + address reward + ) external view returns (uint256, uint256, uint256, uint256); + + /** + * @dev Calculates the next value of an specific distribution index, with validations. + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The old index of the asset distribution + * @return The new index of the asset distribution + **/ + function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); + + /** + * @dev Returns the list of available reward token addresses of an incentivized asset + * @param asset The incentivized asset + * @return List of rewards addresses of the input asset + **/ + function getRewardsByAsset(address asset) external view returns (address[] memory); + + /** + * @dev Returns the list of available reward addresses + * @return List of rewards supported in this contract + **/ + function getRewardsList() external view returns (address[] memory); + + /** + * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. + * @param user The address of the user + * @param reward The address of the reward token + * @return Unclaimed rewards, not including new distributions + **/ + function getUserAccruedRewards(address user, address reward) external view returns (uint256); + + /** + * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @param reward The address of the reward token + * @return The rewards amount + **/ + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view returns (uint256); + + /** + * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @return The list of reward addresses + * @return The list of unclaimed amount of rewards + **/ + function getAllUserRewards( + address[] calldata assets, + address user + ) external view returns (address[] memory, uint256[] memory); + + /** + * @dev Returns the decimals of an asset to calculate the distribution delta + * @param asset The address to retrieve decimals + * @return The decimals of an underlying asset + */ + function getAssetDecimals(address asset) external view returns (uint8); + + /** + * @dev Returns the address of the emission manager + * @return The address of the EmissionManager + */ + function EMISSION_MANAGER() external view returns (address); + + /** + * @dev Returns the address of the emission manager. + * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. + * @return The address of the EmissionManager + */ + function getEmissionManager() external view returns (address); +} + +// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/ITransferStrategyBase.sol + +interface ITransferStrategyBase { + event EmergencyWithdrawal( + address indexed caller, + address indexed token, + address indexed to, + uint256 amount + ); + + /** + * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation + * @param to Account to transfer rewards + * @param reward Address of the reward token + * @param amount Amount to transfer to the "to" address parameter + * @return Returns true bool if transfer logic succeeds + */ + function performTransfer(address to, address reward, uint256 amount) external returns (bool); + + /** + * @return Returns the address of the Incentives Controller + */ + function getIncentivesController() external view returns (address); + + /** + * @return Returns the address of the Rewards admin + */ + function getRewardsAdmin() external view returns (address); + + /** + * @dev Perform an emergency token withdrawal only callable by the Rewards admin + * @param token Address of the token to withdraw funds from this contract + * @param to Address of the recipient of the withdrawal + * @param amount Amount of the withdrawal + */ + function emergencyWithdrawal(address token, address to, uint256 amount) external; +} + +// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/libraries/RewardsDataTypes.sol + +library RewardsDataTypes { + struct RewardsConfigInput { + uint88 emissionPerSecond; + uint256 totalSupply; + uint32 distributionEnd; + address asset; + address reward; + ITransferStrategyBase transferStrategy; + IEACAggregatorProxy rewardOracle; + } + + struct UserAssetBalance { + address asset; + uint256 userBalance; + uint256 totalSupply; + } + + struct UserData { + // Liquidity index of the reward distribution for the user + uint104 index; + // Amount of accrued rewards for the user since last user index update + uint128 accrued; + } + + struct RewardData { + // Liquidity index of the reward distribution + uint104 index; + // Amount of reward tokens distributed per second + uint88 emissionPerSecond; + // Timestamp of the last reward index update + uint32 lastUpdateTimestamp; + // The end of the distribution of rewards (in seconds) + uint32 distributionEnd; + // Map of user addresses and their rewards data (userAddress => userData) + mapping(address => UserData) usersData; + } + + struct AssetData { + // Map of reward token addresses and their data (rewardTokenAddress => rewardData) + mapping(address => RewardData) rewards; + // List of reward token addresses for the asset + mapping(uint128 => address) availableRewards; + // Count of reward tokens for the asset + uint128 availableRewardsCount; + // Number of decimals of the asset + uint8 decimals; + } +} + +// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsController.sol + +/** + * @title IRewardsController + * @author Aave + * @notice Defines the basic interface for a Rewards Controller. + */ +interface IRewardsController is IRewardsDistributor { + /** + * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user + * @param user The address of the user + * @param claimer The address of the claimer + */ + event ClaimerSet(address indexed user, address indexed claimer); + + /** + * @dev Emitted when rewards are claimed + * @param user The address of the user rewards has been claimed on behalf of + * @param reward The address of the token reward is claimed + * @param to The address of the receiver of the rewards + * @param claimer The address of the claimer + * @param amount The amount of rewards claimed + */ + event RewardsClaimed( + address indexed user, + address indexed reward, + address indexed to, + address claimer, + uint256 amount + ); + + /** + * @dev Emitted when a transfer strategy is installed for the reward distribution + * @param reward The address of the token reward + * @param transferStrategy The address of TransferStrategy contract + */ + event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); + + /** + * @dev Emitted when the reward oracle is updated + * @param reward The address of the token reward + * @param rewardOracle The address of oracle + */ + event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Get the price aggregator oracle address + * @param reward The address of the reward + * @return The price oracle of the reward + */ + function getRewardOracle(address reward) external view returns (address); + + /** + * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) + * @param user The address of the user + * @return The claimer address + */ + function getClaimer(address user) external view returns (address); + + /** + * @dev Returns the Transfer Strategy implementation contract address being used for a reward address + * @param reward The address of the reward + * @return The address of the TransferStrategy contract + */ + function getTransferStrategy(address reward) external view returns (address); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + **/ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + + /** + * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The + * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external returns (uint256); + + /** + * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" + **/ + function claimAllRewards( + address[] calldata assets, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must + * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsToSelf( + address[] calldata assets + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); +} + +// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsDistributor.sol + +/** + * @title RewardsDistributor + * @notice Accounting contract to manage multiple staking distributions with multiple rewards + * @author Aave + **/ +abstract contract RewardsDistributor is IRewardsDistributor { + using SafeCast for uint256; + + // Manager of incentives + address public immutable EMISSION_MANAGER; + // Deprecated: This storage slot is kept for backwards compatibility purposes. + address internal _emissionManager; + + // Map of rewarded asset addresses and their data (assetAddress => assetData) + mapping(address => RewardsDataTypes.AssetData) internal _assets; + + // Map of reward assets (rewardAddress => enabled) + mapping(address => bool) internal _isRewardEnabled; + + // Rewards list + address[] internal _rewardsList; + + // Assets list + address[] internal _assetsList; + + modifier onlyEmissionManager() { + require(msg.sender == EMISSION_MANAGER, 'ONLY_EMISSION_MANAGER'); + _; + } + + constructor(address emissionManager) { + EMISSION_MANAGER = emissionManager; + } + + /// @inheritdoc IRewardsDistributor + function getRewardsData( + address asset, + address reward + ) public view override returns (uint256, uint256, uint256, uint256) { + return ( + _assets[asset].rewards[reward].index, + _assets[asset].rewards[reward].emissionPerSecond, + _assets[asset].rewards[reward].lastUpdateTimestamp, + _assets[asset].rewards[reward].distributionEnd + ); + } + + /// @inheritdoc IRewardsDistributor + function getAssetIndex( + address asset, + address reward + ) external view override returns (uint256, uint256) { + RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; + return + _getAssetIndex( + rewardData, + IScaledBalanceToken(asset).scaledTotalSupply(), + 10 ** _assets[asset].decimals + ); + } + + /// @inheritdoc IRewardsDistributor + function getDistributionEnd( + address asset, + address reward + ) external view override returns (uint256) { + return _assets[asset].rewards[reward].distributionEnd; + } + + /// @inheritdoc IRewardsDistributor + function getRewardsByAsset(address asset) external view override returns (address[] memory) { + uint128 rewardsCount = _assets[asset].availableRewardsCount; + address[] memory availableRewards = new address[](rewardsCount); + + for (uint128 i = 0; i < rewardsCount; i++) { + availableRewards[i] = _assets[asset].availableRewards[i]; + } + return availableRewards; + } + + /// @inheritdoc IRewardsDistributor + function getRewardsList() external view override returns (address[] memory) { + return _rewardsList; + } + + /// @inheritdoc IRewardsDistributor + function getUserAssetIndex( + address user, + address asset, + address reward + ) public view override returns (uint256) { + return _assets[asset].rewards[reward].usersData[user].index; + } + + /// @inheritdoc IRewardsDistributor + function getUserAccruedRewards( + address user, + address reward + ) external view override returns (uint256) { + uint256 totalAccrued; + for (uint256 i = 0; i < _assetsList.length; i++) { + totalAccrued += _assets[_assetsList[i]].rewards[reward].usersData[user].accrued; + } + + return totalAccrued; + } + + /// @inheritdoc IRewardsDistributor + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view override returns (uint256) { + return _getUserReward(user, reward, _getUserAssetBalances(assets, user)); + } + + /// @inheritdoc IRewardsDistributor + function getAllUserRewards( + address[] calldata assets, + address user + ) + external + view + override + returns (address[] memory rewardsList, uint256[] memory unclaimedAmounts) + { + RewardsDataTypes.UserAssetBalance[] memory userAssetBalances = _getUserAssetBalances( + assets, + user + ); + rewardsList = new address[](_rewardsList.length); + unclaimedAmounts = new uint256[](rewardsList.length); + + // Add unrealized rewards from user to unclaimedRewards + for (uint256 i = 0; i < userAssetBalances.length; i++) { + for (uint256 r = 0; r < rewardsList.length; r++) { + rewardsList[r] = _rewardsList[r]; + unclaimedAmounts[r] += _assets[userAssetBalances[i].asset] + .rewards[rewardsList[r]] + .usersData[user] + .accrued; + + if (userAssetBalances[i].userBalance == 0) { + continue; + } + unclaimedAmounts[r] += _getPendingRewards(user, rewardsList[r], userAssetBalances[i]); + } + } + return (rewardsList, unclaimedAmounts); + } + + /// @inheritdoc IRewardsDistributor + function setDistributionEnd( + address asset, + address reward, + uint32 newDistributionEnd + ) external override onlyEmissionManager { + uint256 oldDistributionEnd = _assets[asset].rewards[reward].distributionEnd; + _assets[asset].rewards[reward].distributionEnd = newDistributionEnd; + + emit AssetConfigUpdated( + asset, + reward, + _assets[asset].rewards[reward].emissionPerSecond, + _assets[asset].rewards[reward].emissionPerSecond, + oldDistributionEnd, + newDistributionEnd, + _assets[asset].rewards[reward].index + ); + } + + /// @inheritdoc IRewardsDistributor + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external override onlyEmissionManager { + require(rewards.length == newEmissionsPerSecond.length, 'INVALID_INPUT'); + for (uint256 i = 0; i < rewards.length; i++) { + RewardsDataTypes.AssetData storage assetConfig = _assets[asset]; + RewardsDataTypes.RewardData storage rewardConfig = _assets[asset].rewards[rewards[i]]; + uint256 decimals = assetConfig.decimals; + require( + decimals != 0 && rewardConfig.lastUpdateTimestamp != 0, + 'DISTRIBUTION_DOES_NOT_EXIST' + ); + + (uint256 newIndex, ) = _updateRewardData( + rewardConfig, + IScaledBalanceToken(asset).scaledTotalSupply(), + 10 ** decimals + ); + + uint256 oldEmissionPerSecond = rewardConfig.emissionPerSecond; + rewardConfig.emissionPerSecond = newEmissionsPerSecond[i]; + + emit AssetConfigUpdated( + asset, + rewards[i], + oldEmissionPerSecond, + newEmissionsPerSecond[i], + rewardConfig.distributionEnd, + rewardConfig.distributionEnd, + newIndex + ); + } + } + + /** + * @dev Configure the _assets for a specific emission + * @param rewardsInput The array of each asset configuration + **/ + function _configureAssets(RewardsDataTypes.RewardsConfigInput[] memory rewardsInput) internal { + for (uint256 i = 0; i < rewardsInput.length; i++) { + if (_assets[rewardsInput[i].asset].decimals == 0) { + //never initialized before, adding to the list of assets + _assetsList.push(rewardsInput[i].asset); + } + + uint256 decimals = _assets[rewardsInput[i].asset].decimals = IERC20Detailed( + rewardsInput[i].asset + ).decimals(); + + RewardsDataTypes.RewardData storage rewardConfig = _assets[rewardsInput[i].asset].rewards[ + rewardsInput[i].reward + ]; + + // Add reward address to asset available rewards if latestUpdateTimestamp is zero + if (rewardConfig.lastUpdateTimestamp == 0) { + _assets[rewardsInput[i].asset].availableRewards[ + _assets[rewardsInput[i].asset].availableRewardsCount + ] = rewardsInput[i].reward; + _assets[rewardsInput[i].asset].availableRewardsCount++; + } + + // Add reward address to global rewards list if still not enabled + if (_isRewardEnabled[rewardsInput[i].reward] == false) { + _isRewardEnabled[rewardsInput[i].reward] = true; + _rewardsList.push(rewardsInput[i].reward); + } + + // Due emissions is still zero, updates only latestUpdateTimestamp + (uint256 newIndex, ) = _updateRewardData( + rewardConfig, + rewardsInput[i].totalSupply, + 10 ** decimals + ); + + // Configure emission and distribution end of the reward per asset + uint88 oldEmissionsPerSecond = rewardConfig.emissionPerSecond; + uint32 oldDistributionEnd = rewardConfig.distributionEnd; + rewardConfig.emissionPerSecond = rewardsInput[i].emissionPerSecond; + rewardConfig.distributionEnd = rewardsInput[i].distributionEnd; + + emit AssetConfigUpdated( + rewardsInput[i].asset, + rewardsInput[i].reward, + oldEmissionsPerSecond, + rewardsInput[i].emissionPerSecond, + oldDistributionEnd, + rewardsInput[i].distributionEnd, + newIndex + ); + } + } + + /** + * @dev Updates the state of the distribution for the specified reward + * @param rewardData Storage pointer to the distribution reward config + * @param totalSupply Current total of underlying assets for this distribution + * @param assetUnit One unit of asset (10**decimals) + * @return The new distribution index + * @return True if the index was updated, false otherwise + **/ + function _updateRewardData( + RewardsDataTypes.RewardData storage rewardData, + uint256 totalSupply, + uint256 assetUnit + ) internal returns (uint256, bool) { + (uint256 oldIndex, uint256 newIndex) = _getAssetIndex(rewardData, totalSupply, assetUnit); + bool indexUpdated; + if (newIndex != oldIndex) { + require(newIndex <= type(uint104).max, 'INDEX_OVERFLOW'); + indexUpdated = true; + + //optimization: storing one after another saves one SSTORE + rewardData.index = uint104(newIndex); + rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); + } else { + rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); + } + + return (newIndex, indexUpdated); + } + + /** + * @dev Updates the state of the distribution for the specific user + * @param rewardData Storage pointer to the distribution reward config + * @param user The address of the user + * @param userBalance The user balance of the asset + * @param newAssetIndex The new index of the asset distribution + * @param assetUnit One unit of asset (10**decimals) + * @return The rewards accrued since the last update + **/ + function _updateUserData( + RewardsDataTypes.RewardData storage rewardData, + address user, + uint256 userBalance, + uint256 newAssetIndex, + uint256 assetUnit + ) internal returns (uint256, bool) { + uint256 userIndex = rewardData.usersData[user].index; + uint256 rewardsAccrued; + bool dataUpdated; + if ((dataUpdated = userIndex != newAssetIndex)) { + // already checked for overflow in _updateRewardData + rewardData.usersData[user].index = uint104(newAssetIndex); + if (userBalance != 0) { + rewardsAccrued = _getRewards(userBalance, newAssetIndex, userIndex, assetUnit); + + rewardData.usersData[user].accrued += rewardsAccrued.toUint128(); + } + } + return (rewardsAccrued, dataUpdated); + } + + /** + * @dev Iterates and accrues all the rewards for asset of the specific user + * @param asset The address of the reference asset of the distribution + * @param user The user address + * @param userBalance The current user asset balance + * @param totalSupply Total supply of the asset + **/ + function _updateData( + address asset, + address user, + uint256 userBalance, + uint256 totalSupply + ) internal { + uint256 assetUnit; + uint256 numAvailableRewards = _assets[asset].availableRewardsCount; + unchecked { + assetUnit = 10 ** _assets[asset].decimals; + } + + if (numAvailableRewards == 0) { + return; + } + unchecked { + for (uint128 r = 0; r < numAvailableRewards; r++) { + address reward = _assets[asset].availableRewards[r]; + RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; + + (uint256 newAssetIndex, bool rewardDataUpdated) = _updateRewardData( + rewardData, + totalSupply, + assetUnit + ); + + (uint256 rewardsAccrued, bool userDataUpdated) = _updateUserData( + rewardData, + user, + userBalance, + newAssetIndex, + assetUnit + ); + + if (rewardDataUpdated || userDataUpdated) { + emit Accrued(asset, reward, user, newAssetIndex, newAssetIndex, rewardsAccrued); + } + } + } + } + + /** + * @dev Accrues all the rewards of the assets specified in the userAssetBalances list + * @param user The address of the user + * @param userAssetBalances List of structs with the user balance and total supply of a set of assets + **/ + function _updateDataMultiple( + address user, + RewardsDataTypes.UserAssetBalance[] memory userAssetBalances + ) internal { + for (uint256 i = 0; i < userAssetBalances.length; i++) { + _updateData( + userAssetBalances[i].asset, + user, + userAssetBalances[i].userBalance, + userAssetBalances[i].totalSupply + ); + } + } + + /** + * @dev Return the accrued unclaimed amount of a reward from a user over a list of distribution + * @param user The address of the user + * @param reward The address of the reward token + * @param userAssetBalances List of structs with the user balance and total supply of a set of assets + * @return unclaimedRewards The accrued rewards for the user until the moment + **/ + function _getUserReward( + address user, + address reward, + RewardsDataTypes.UserAssetBalance[] memory userAssetBalances + ) internal view returns (uint256 unclaimedRewards) { + // Add unrealized rewards + for (uint256 i = 0; i < userAssetBalances.length; i++) { + if (userAssetBalances[i].userBalance == 0) { + unclaimedRewards += _assets[userAssetBalances[i].asset] + .rewards[reward] + .usersData[user] + .accrued; + } else { + unclaimedRewards += + _getPendingRewards(user, reward, userAssetBalances[i]) + + _assets[userAssetBalances[i].asset].rewards[reward].usersData[user].accrued; + } + } + + return unclaimedRewards; + } + + /** + * @dev Calculates the pending (not yet accrued) rewards since the last user action + * @param user The address of the user + * @param reward The address of the reward token + * @param userAssetBalance struct with the user balance and total supply of the incentivized asset + * @return The pending rewards for the user since the last user action + **/ + function _getPendingRewards( + address user, + address reward, + RewardsDataTypes.UserAssetBalance memory userAssetBalance + ) internal view returns (uint256) { + RewardsDataTypes.RewardData storage rewardData = _assets[userAssetBalance.asset].rewards[ + reward + ]; + uint256 assetUnit = 10 ** _assets[userAssetBalance.asset].decimals; + (, uint256 nextIndex) = _getAssetIndex(rewardData, userAssetBalance.totalSupply, assetUnit); + + return + _getRewards( + userAssetBalance.userBalance, + nextIndex, + rewardData.usersData[user].index, + assetUnit + ); + } + + /** + * @dev Internal function for the calculation of user's rewards on a distribution + * @param userBalance Balance of the user asset on a distribution + * @param reserveIndex Current index of the distribution + * @param userIndex Index stored for the user, representation his staking moment + * @param assetUnit One unit of asset (10**decimals) + * @return The rewards + **/ + function _getRewards( + uint256 userBalance, + uint256 reserveIndex, + uint256 userIndex, + uint256 assetUnit + ) internal pure returns (uint256) { + uint256 result = userBalance * (reserveIndex - userIndex); + assembly { + result := div(result, assetUnit) + } + return result; + } + + /** + * @dev Calculates the next value of an specific distribution index, with validations + * @param rewardData Storage pointer to the distribution reward config + * @param totalSupply of the asset being rewarded + * @param assetUnit One unit of asset (10**decimals) + * @return The new index. + **/ + function _getAssetIndex( + RewardsDataTypes.RewardData storage rewardData, + uint256 totalSupply, + uint256 assetUnit + ) internal view returns (uint256, uint256) { + uint256 oldIndex = rewardData.index; + uint256 distributionEnd = rewardData.distributionEnd; + uint256 emissionPerSecond = rewardData.emissionPerSecond; + uint256 lastUpdateTimestamp = rewardData.lastUpdateTimestamp; + + if ( + emissionPerSecond == 0 || + totalSupply == 0 || + lastUpdateTimestamp == block.timestamp || + lastUpdateTimestamp >= distributionEnd + ) { + return (oldIndex, oldIndex); + } + + uint256 currentTimestamp = block.timestamp > distributionEnd + ? distributionEnd + : block.timestamp; + uint256 timeDelta = currentTimestamp - lastUpdateTimestamp; + uint256 firstTerm = emissionPerSecond * timeDelta * assetUnit; + assembly { + firstTerm := div(firstTerm, totalSupply) + } + return (oldIndex, (firstTerm + oldIndex)); + } + + /** + * @dev Get user balances and total supply of all the assets specified by the assets parameter + * @param assets List of assets to retrieve user balance and total supply + * @param user Address of the user + * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets + */ + function _getUserAssetBalances( + address[] calldata assets, + address user + ) internal view virtual returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances); + + /// @inheritdoc IRewardsDistributor + function getAssetDecimals(address asset) external view returns (uint8) { + return _assets[asset].decimals; + } + + /// @inheritdoc IRewardsDistributor + function getEmissionManager() external view returns (address) { + return EMISSION_MANAGER; + } +} + +// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsController.sol + +/** + * @title RewardsController + * @notice Abstract contract template to build Distributors contracts for ERC20 rewards to protocol participants + * @author Aave + **/ +contract RewardsController is RewardsDistributor, VersionedInitializable, IRewardsController { + using SafeCast for uint256; + + uint256 public constant REVISION = 2; + + // This mapping allows whitelisted addresses to claim on behalf of others + // useful for contracts that hold tokens to be rewarded but don't have any native logic to claim Liquidity Mining rewards + mapping(address => address) internal _authorizedClaimers; + + // reward => transfer strategy implementation contract + // The TransferStrategy contract abstracts the logic regarding + // the source of the reward and how to transfer it to the user. + mapping(address => ITransferStrategyBase) internal _transferStrategy; + + // This mapping contains the price oracle per reward. + // A price oracle is enforced for integrators to be able to show incentives at + // the current Aave UI without the need to setup an external price registry + // At the moment of reward configuration, the Incentives Controller performs + // a check to see if the provided reward oracle contains `latestAnswer`. + mapping(address => IEACAggregatorProxy) internal _rewardOracle; + + modifier onlyAuthorizedClaimers(address claimer, address user) { + require(_authorizedClaimers[user] == claimer, 'CLAIMER_UNAUTHORIZED'); + _; + } + + constructor(address emissionManager) RewardsDistributor(emissionManager) {} + + /** + * @dev Initialize for RewardsController + * @dev It expects an address as argument since its initialized via PoolAddressesProvider._updateImpl() + **/ + function initialize(address) external initializer {} + + /// @inheritdoc IRewardsController + function getClaimer(address user) external view override returns (address) { + return _authorizedClaimers[user]; + } + + /** + * @dev Returns the revision of the implementation contract + * @return uint256, current revision version + */ + function getRevision() internal pure override returns (uint256) { + return REVISION; + } + + /// @inheritdoc IRewardsController + function getRewardOracle(address reward) external view override returns (address) { + return address(_rewardOracle[reward]); + } + + /// @inheritdoc IRewardsController + function getTransferStrategy(address reward) external view override returns (address) { + return address(_transferStrategy[reward]); + } + + /// @inheritdoc IRewardsController + function configureAssets( + RewardsDataTypes.RewardsConfigInput[] memory config + ) external override onlyEmissionManager { + for (uint256 i = 0; i < config.length; i++) { + // Get the current Scaled Total Supply of AToken or Debt token + config[i].totalSupply = IScaledBalanceToken(config[i].asset).scaledTotalSupply(); + + // Install TransferStrategy logic at IncentivesController + _installTransferStrategy(config[i].reward, config[i].transferStrategy); + + // Set reward oracle, enforces input oracle to have latestPrice function + _setRewardOracle(config[i].reward, config[i].rewardOracle); + } + _configureAssets(config); + } + + /// @inheritdoc IRewardsController + function setTransferStrategy( + address reward, + ITransferStrategyBase transferStrategy + ) external onlyEmissionManager { + _installTransferStrategy(reward, transferStrategy); + } + + /// @inheritdoc IRewardsController + function setRewardOracle( + address reward, + IEACAggregatorProxy rewardOracle + ) external onlyEmissionManager { + _setRewardOracle(reward, rewardOracle); + } + + /// @inheritdoc IRewardsController + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external override { + _updateData(msg.sender, user, userBalance, totalSupply); + } + + /// @inheritdoc IRewardsController + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external override returns (uint256) { + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimRewards(assets, amount, msg.sender, msg.sender, to, reward); + } + + /// @inheritdoc IRewardsController + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external override onlyAuthorizedClaimers(msg.sender, user) returns (uint256) { + require(user != address(0), 'INVALID_USER_ADDRESS'); + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimRewards(assets, amount, msg.sender, user, to, reward); + } + + /// @inheritdoc IRewardsController + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external override returns (uint256) { + return _claimRewards(assets, amount, msg.sender, msg.sender, msg.sender, reward); + } + + /// @inheritdoc IRewardsController + function claimAllRewards( + address[] calldata assets, + address to + ) external override returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimAllRewards(assets, msg.sender, msg.sender, to); + } + + /// @inheritdoc IRewardsController + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) + external + override + onlyAuthorizedClaimers(msg.sender, user) + returns (address[] memory rewardsList, uint256[] memory claimedAmounts) + { + require(user != address(0), 'INVALID_USER_ADDRESS'); + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimAllRewards(assets, msg.sender, user, to); + } + + /// @inheritdoc IRewardsController + function claimAllRewardsToSelf( + address[] calldata assets + ) external override returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { + return _claimAllRewards(assets, msg.sender, msg.sender, msg.sender); + } + + /// @inheritdoc IRewardsController + function setClaimer(address user, address caller) external override onlyEmissionManager { + _authorizedClaimers[user] = caller; + emit ClaimerSet(user, caller); + } + + /** + * @dev Get user balances and total supply of all the assets specified by the assets parameter + * @param assets List of assets to retrieve user balance and total supply + * @param user Address of the user + * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets + */ + function _getUserAssetBalances( + address[] calldata assets, + address user + ) internal view override returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances) { + userAssetBalances = new RewardsDataTypes.UserAssetBalance[](assets.length); + for (uint256 i = 0; i < assets.length; i++) { + userAssetBalances[i].asset = assets[i]; + (userAssetBalances[i].userBalance, userAssetBalances[i].totalSupply) = IScaledBalanceToken( + assets[i] + ).getScaledUserBalanceAndSupply(user); + } + return userAssetBalances; + } + + /** + * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount Amount of rewards to claim + * @param claimer Address of the claimer who claims rewards on behalf of user + * @param user Address to check and claim rewards + * @param to Address that will be receiving the rewards + * @param reward Address of the reward token + * @return Rewards claimed + **/ + function _claimRewards( + address[] calldata assets, + uint256 amount, + address claimer, + address user, + address to, + address reward + ) internal returns (uint256) { + if (amount == 0) { + return 0; + } + uint256 totalRewards; + + _updateDataMultiple(user, _getUserAssetBalances(assets, user)); + for (uint256 i = 0; i < assets.length; i++) { + address asset = assets[i]; + totalRewards += _assets[asset].rewards[reward].usersData[user].accrued; + + if (totalRewards <= amount) { + _assets[asset].rewards[reward].usersData[user].accrued = 0; + } else { + uint256 difference = totalRewards - amount; + totalRewards -= difference; + _assets[asset].rewards[reward].usersData[user].accrued = difference.toUint128(); + break; + } + } + + if (totalRewards == 0) { + return 0; + } + + _transferRewards(to, reward, totalRewards); + emit RewardsClaimed(user, reward, to, claimer, totalRewards); + + return totalRewards; + } + + /** + * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. + * @param assets List of assets to check eligible distributions before claiming rewards + * @param claimer Address of the claimer on behalf of user + * @param user Address to check and claim rewards + * @param to Address that will be receiving the rewards + * @return + * rewardsList List of reward addresses + * claimedAmount List of claimed amounts, follows "rewardsList" items order + **/ + function _claimAllRewards( + address[] calldata assets, + address claimer, + address user, + address to + ) internal returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { + uint256 rewardsListLength = _rewardsList.length; + rewardsList = new address[](rewardsListLength); + claimedAmounts = new uint256[](rewardsListLength); + + _updateDataMultiple(user, _getUserAssetBalances(assets, user)); + + for (uint256 i = 0; i < assets.length; i++) { + address asset = assets[i]; + for (uint256 j = 0; j < rewardsListLength; j++) { + if (rewardsList[j] == address(0)) { + rewardsList[j] = _rewardsList[j]; + } + uint256 rewardAmount = _assets[asset].rewards[rewardsList[j]].usersData[user].accrued; + if (rewardAmount != 0) { + claimedAmounts[j] += rewardAmount; + _assets[asset].rewards[rewardsList[j]].usersData[user].accrued = 0; + } + } + } + for (uint256 i = 0; i < rewardsListLength; i++) { + _transferRewards(to, rewardsList[i], claimedAmounts[i]); + emit RewardsClaimed(user, rewardsList[i], to, claimer, claimedAmounts[i]); + } + return (rewardsList, claimedAmounts); + } + + /** + * @dev Function to transfer rewards to the desired account using delegatecall and + * @param to Account address to send the rewards + * @param reward Address of the reward token + * @param amount Amount of rewards to transfer + */ + function _transferRewards(address to, address reward, uint256 amount) internal { + ITransferStrategyBase transferStrategy = _transferStrategy[reward]; + + bool success = transferStrategy.performTransfer(to, reward, amount); + + require(success == true, 'TRANSFER_ERROR'); + } + + /** + * @dev Returns true if `account` is a contract. + * @param account The address of the account + * @return bool, true if contract, false otherwise + */ + function _isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + // solhint-disable-next-line no-inline-assembly + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Internal function to call the optional install hook at the TransferStrategy + * @param reward The address of the reward token + * @param transferStrategy The address of the reward TransferStrategy + */ + function _installTransferStrategy( + address reward, + ITransferStrategyBase transferStrategy + ) internal { + require(address(transferStrategy) != address(0), 'STRATEGY_CAN_NOT_BE_ZERO'); + require(_isContract(address(transferStrategy)) == true, 'STRATEGY_MUST_BE_CONTRACT'); + + _transferStrategy[reward] = transferStrategy; + + emit TransferStrategyInstalled(reward, address(transferStrategy)); + } + + /** + * @dev Update the Price Oracle of a reward token. The Price Oracle must follow Chainlink IEACAggregatorProxy interface. + * @notice The Price Oracle of a reward is used for displaying correct data about the incentives at the UI frontend. + * @param reward The address of the reward token + * @param rewardOracle The address of the price oracle + */ + + function _setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) internal { + require(rewardOracle.latestAnswer() > 0, 'ORACLE_MUST_RETURN_PRICE'); + _rewardOracle[reward] = rewardOracle; + emit RewardOracleUpdated(reward, address(rewardOracle)); + } +} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..7dc55938 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..02693059 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..6d708093 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity 0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..89ccddfd --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaledbalance token. + **/ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted scaled balance tokens + * @param value The amount being minted (user entered amount + balance increase from interest) + * @param balanceIncrease The increase in balance since the last action of the user + * @param index The next liquidity index of the reserve + **/ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after scaled balance tokens are burned + * @param from The address from which the scaled tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in balance since the last action of the user + * @param index The next liquidity index of the reserve + **/ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + **/ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + **/ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + **/ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + **/ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol new file mode 100644 index 00000000..570c319e --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + **/ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + **/ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/misc/interfaces/IEACAggregatorProxy.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/misc/interfaces/IEACAggregatorProxy.sol new file mode 100644 index 00000000..13fd0819 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/misc/interfaces/IEACAggregatorProxy.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.10; + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsController.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsController.sol new file mode 100644 index 00000000..7e5aa1d3 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsController.sol @@ -0,0 +1,369 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {VersionedInitializable} from '../../../aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; +import {SafeCast} from '../../../aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IScaledBalanceToken} from '../../../aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol'; +import {RewardsDistributor} from './RewardsDistributor.sol'; +import {IRewardsController} from './interfaces/IRewardsController.sol'; +import {ITransferStrategyBase} from './interfaces/ITransferStrategyBase.sol'; +import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol'; +import {IEACAggregatorProxy} from '../misc/interfaces/IEACAggregatorProxy.sol'; + +/** + * @title RewardsController + * @notice Abstract contract template to build Distributors contracts for ERC20 rewards to protocol participants + * @author Aave + **/ +contract RewardsController is RewardsDistributor, VersionedInitializable, IRewardsController { + using SafeCast for uint256; + + uint256 public constant REVISION = 2; + + // This mapping allows whitelisted addresses to claim on behalf of others + // useful for contracts that hold tokens to be rewarded but don't have any native logic to claim Liquidity Mining rewards + mapping(address => address) internal _authorizedClaimers; + + // reward => transfer strategy implementation contract + // The TransferStrategy contract abstracts the logic regarding + // the source of the reward and how to transfer it to the user. + mapping(address => ITransferStrategyBase) internal _transferStrategy; + + // This mapping contains the price oracle per reward. + // A price oracle is enforced for integrators to be able to show incentives at + // the current Aave UI without the need to setup an external price registry + // At the moment of reward configuration, the Incentives Controller performs + // a check to see if the provided reward oracle contains `latestAnswer`. + mapping(address => IEACAggregatorProxy) internal _rewardOracle; + + modifier onlyAuthorizedClaimers(address claimer, address user) { + require(_authorizedClaimers[user] == claimer, 'CLAIMER_UNAUTHORIZED'); + _; + } + + constructor(address emissionManager) RewardsDistributor(emissionManager) {} + + /** + * @dev Initialize for RewardsController + * @dev It expects an address as argument since its initialized via PoolAddressesProvider._updateImpl() + **/ + function initialize(address) external initializer {} + + /// @inheritdoc IRewardsController + function getClaimer(address user) external view override returns (address) { + return _authorizedClaimers[user]; + } + + /** + * @dev Returns the revision of the implementation contract + * @return uint256, current revision version + */ + function getRevision() internal pure override returns (uint256) { + return REVISION; + } + + /// @inheritdoc IRewardsController + function getRewardOracle(address reward) external view override returns (address) { + return address(_rewardOracle[reward]); + } + + /// @inheritdoc IRewardsController + function getTransferStrategy(address reward) external view override returns (address) { + return address(_transferStrategy[reward]); + } + + /// @inheritdoc IRewardsController + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) + external + override + onlyEmissionManager + { + for (uint256 i = 0; i < config.length; i++) { + // Get the current Scaled Total Supply of AToken or Debt token + config[i].totalSupply = IScaledBalanceToken(config[i].asset).scaledTotalSupply(); + + // Install TransferStrategy logic at IncentivesController + _installTransferStrategy(config[i].reward, config[i].transferStrategy); + + // Set reward oracle, enforces input oracle to have latestPrice function + _setRewardOracle(config[i].reward, config[i].rewardOracle); + } + _configureAssets(config); + } + + /// @inheritdoc IRewardsController + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) + external + onlyEmissionManager + { + _installTransferStrategy(reward, transferStrategy); + } + + /// @inheritdoc IRewardsController + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) + external + onlyEmissionManager + { + _setRewardOracle(reward, rewardOracle); + } + + /// @inheritdoc IRewardsController + function handleAction( + address user, + uint256 totalSupply, + uint256 userBalance + ) external override { + _updateData(msg.sender, user, userBalance, totalSupply); + } + + /// @inheritdoc IRewardsController + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external override returns (uint256) { + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimRewards(assets, amount, msg.sender, msg.sender, to, reward); + } + + /// @inheritdoc IRewardsController + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external override onlyAuthorizedClaimers(msg.sender, user) returns (uint256) { + require(user != address(0), 'INVALID_USER_ADDRESS'); + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimRewards(assets, amount, msg.sender, user, to, reward); + } + + /// @inheritdoc IRewardsController + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external override returns (uint256) { + return _claimRewards(assets, amount, msg.sender, msg.sender, msg.sender, reward); + } + + /// @inheritdoc IRewardsController + function claimAllRewards(address[] calldata assets, address to) + external + override + returns (address[] memory rewardsList, uint256[] memory claimedAmounts) + { + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimAllRewards(assets, msg.sender, msg.sender, to); + } + + /// @inheritdoc IRewardsController + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) + external + override + onlyAuthorizedClaimers(msg.sender, user) + returns (address[] memory rewardsList, uint256[] memory claimedAmounts) + { + require(user != address(0), 'INVALID_USER_ADDRESS'); + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimAllRewards(assets, msg.sender, user, to); + } + + /// @inheritdoc IRewardsController + function claimAllRewardsToSelf(address[] calldata assets) + external + override + returns (address[] memory rewardsList, uint256[] memory claimedAmounts) + { + return _claimAllRewards(assets, msg.sender, msg.sender, msg.sender); + } + + /// @inheritdoc IRewardsController + function setClaimer(address user, address caller) external override onlyEmissionManager { + _authorizedClaimers[user] = caller; + emit ClaimerSet(user, caller); + } + + /** + * @dev Get user balances and total supply of all the assets specified by the assets parameter + * @param assets List of assets to retrieve user balance and total supply + * @param user Address of the user + * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets + */ + function _getUserAssetBalances(address[] calldata assets, address user) + internal + view + override + returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances) + { + userAssetBalances = new RewardsDataTypes.UserAssetBalance[](assets.length); + for (uint256 i = 0; i < assets.length; i++) { + userAssetBalances[i].asset = assets[i]; + (userAssetBalances[i].userBalance, userAssetBalances[i].totalSupply) = IScaledBalanceToken( + assets[i] + ).getScaledUserBalanceAndSupply(user); + } + return userAssetBalances; + } + + /** + * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount Amount of rewards to claim + * @param claimer Address of the claimer who claims rewards on behalf of user + * @param user Address to check and claim rewards + * @param to Address that will be receiving the rewards + * @param reward Address of the reward token + * @return Rewards claimed + **/ + function _claimRewards( + address[] calldata assets, + uint256 amount, + address claimer, + address user, + address to, + address reward + ) internal returns (uint256) { + if (amount == 0) { + return 0; + } + uint256 totalRewards; + + _updateDataMultiple(user, _getUserAssetBalances(assets, user)); + for (uint256 i = 0; i < assets.length; i++) { + address asset = assets[i]; + totalRewards += _assets[asset].rewards[reward].usersData[user].accrued; + + if (totalRewards <= amount) { + _assets[asset].rewards[reward].usersData[user].accrued = 0; + } else { + uint256 difference = totalRewards - amount; + totalRewards -= difference; + _assets[asset].rewards[reward].usersData[user].accrued = difference.toUint128(); + break; + } + } + + if (totalRewards == 0) { + return 0; + } + + _transferRewards(to, reward, totalRewards); + emit RewardsClaimed(user, reward, to, claimer, totalRewards); + + return totalRewards; + } + + /** + * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. + * @param assets List of assets to check eligible distributions before claiming rewards + * @param claimer Address of the claimer on behalf of user + * @param user Address to check and claim rewards + * @param to Address that will be receiving the rewards + * @return + * rewardsList List of reward addresses + * claimedAmount List of claimed amounts, follows "rewardsList" items order + **/ + function _claimAllRewards( + address[] calldata assets, + address claimer, + address user, + address to + ) internal returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { + uint256 rewardsListLength = _rewardsList.length; + rewardsList = new address[](rewardsListLength); + claimedAmounts = new uint256[](rewardsListLength); + + _updateDataMultiple(user, _getUserAssetBalances(assets, user)); + + for (uint256 i = 0; i < assets.length; i++) { + address asset = assets[i]; + for (uint256 j = 0; j < rewardsListLength; j++) { + if (rewardsList[j] == address(0)) { + rewardsList[j] = _rewardsList[j]; + } + uint256 rewardAmount = _assets[asset].rewards[rewardsList[j]].usersData[user].accrued; + if (rewardAmount != 0) { + claimedAmounts[j] += rewardAmount; + _assets[asset].rewards[rewardsList[j]].usersData[user].accrued = 0; + } + } + } + for (uint256 i = 0; i < rewardsListLength; i++) { + _transferRewards(to, rewardsList[i], claimedAmounts[i]); + emit RewardsClaimed(user, rewardsList[i], to, claimer, claimedAmounts[i]); + } + return (rewardsList, claimedAmounts); + } + + /** + * @dev Function to transfer rewards to the desired account using delegatecall and + * @param to Account address to send the rewards + * @param reward Address of the reward token + * @param amount Amount of rewards to transfer + */ + function _transferRewards( + address to, + address reward, + uint256 amount + ) internal { + ITransferStrategyBase transferStrategy = _transferStrategy[reward]; + + bool success = transferStrategy.performTransfer(to, reward, amount); + + require(success == true, 'TRANSFER_ERROR'); + } + + /** + * @dev Returns true if `account` is a contract. + * @param account The address of the account + * @return bool, true if contract, false otherwise + */ + function _isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + // solhint-disable-next-line no-inline-assembly + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Internal function to call the optional install hook at the TransferStrategy + * @param reward The address of the reward token + * @param transferStrategy The address of the reward TransferStrategy + */ + function _installTransferStrategy(address reward, ITransferStrategyBase transferStrategy) + internal + { + require(address(transferStrategy) != address(0), 'STRATEGY_CAN_NOT_BE_ZERO'); + require(_isContract(address(transferStrategy)) == true, 'STRATEGY_MUST_BE_CONTRACT'); + + _transferStrategy[reward] = transferStrategy; + + emit TransferStrategyInstalled(reward, address(transferStrategy)); + } + + /** + * @dev Update the Price Oracle of a reward token. The Price Oracle must follow Chainlink IEACAggregatorProxy interface. + * @notice The Price Oracle of a reward is used for displaying correct data about the incentives at the UI frontend. + * @param reward The address of the reward token + * @param rewardOracle The address of the price oracle + */ + + function _setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) internal { + require(rewardOracle.latestAnswer() > 0, 'ORACLE_MUST_RETURN_PRICE'); + _rewardOracle[reward] = rewardOracle; + emit RewardOracleUpdated(reward, address(rewardOracle)); + } +} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsDistributor.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsDistributor.sol new file mode 100644 index 00000000..639ebaa0 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsDistributor.sol @@ -0,0 +1,548 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IScaledBalanceToken} from '../../../aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol'; +import {IERC20Detailed} from '../../../aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IRewardsDistributor} from './interfaces/IRewardsDistributor.sol'; +import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol'; + +/** + * @title RewardsDistributor + * @notice Accounting contract to manage multiple staking distributions with multiple rewards + * @author Aave + **/ +abstract contract RewardsDistributor is IRewardsDistributor { + using SafeCast for uint256; + + // Manager of incentives + address public immutable EMISSION_MANAGER; + // Deprecated: This storage slot is kept for backwards compatibility purposes. + address internal _emissionManager; + + // Map of rewarded asset addresses and their data (assetAddress => assetData) + mapping(address => RewardsDataTypes.AssetData) internal _assets; + + // Map of reward assets (rewardAddress => enabled) + mapping(address => bool) internal _isRewardEnabled; + + // Rewards list + address[] internal _rewardsList; + + // Assets list + address[] internal _assetsList; + + modifier onlyEmissionManager() { + require(msg.sender == EMISSION_MANAGER, 'ONLY_EMISSION_MANAGER'); + _; + } + + constructor(address emissionManager) { + EMISSION_MANAGER = emissionManager; + } + + /// @inheritdoc IRewardsDistributor + function getRewardsData(address asset, address reward) + public + view + override + returns ( + uint256, + uint256, + uint256, + uint256 + ) + { + return ( + _assets[asset].rewards[reward].index, + _assets[asset].rewards[reward].emissionPerSecond, + _assets[asset].rewards[reward].lastUpdateTimestamp, + _assets[asset].rewards[reward].distributionEnd + ); + } + + /// @inheritdoc IRewardsDistributor + function getAssetIndex(address asset, address reward) + external + view + override + returns (uint256, uint256) + { + RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; + return + _getAssetIndex( + rewardData, + IScaledBalanceToken(asset).scaledTotalSupply(), + 10**_assets[asset].decimals + ); + } + + /// @inheritdoc IRewardsDistributor + function getDistributionEnd(address asset, address reward) + external + view + override + returns (uint256) + { + return _assets[asset].rewards[reward].distributionEnd; + } + + /// @inheritdoc IRewardsDistributor + function getRewardsByAsset(address asset) external view override returns (address[] memory) { + uint128 rewardsCount = _assets[asset].availableRewardsCount; + address[] memory availableRewards = new address[](rewardsCount); + + for (uint128 i = 0; i < rewardsCount; i++) { + availableRewards[i] = _assets[asset].availableRewards[i]; + } + return availableRewards; + } + + /// @inheritdoc IRewardsDistributor + function getRewardsList() external view override returns (address[] memory) { + return _rewardsList; + } + + /// @inheritdoc IRewardsDistributor + function getUserAssetIndex( + address user, + address asset, + address reward + ) public view override returns (uint256) { + return _assets[asset].rewards[reward].usersData[user].index; + } + + /// @inheritdoc IRewardsDistributor + function getUserAccruedRewards(address user, address reward) + external + view + override + returns (uint256) + { + uint256 totalAccrued; + for (uint256 i = 0; i < _assetsList.length; i++) { + totalAccrued += _assets[_assetsList[i]].rewards[reward].usersData[user].accrued; + } + + return totalAccrued; + } + + /// @inheritdoc IRewardsDistributor + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view override returns (uint256) { + return _getUserReward(user, reward, _getUserAssetBalances(assets, user)); + } + + /// @inheritdoc IRewardsDistributor + function getAllUserRewards(address[] calldata assets, address user) + external + view + override + returns (address[] memory rewardsList, uint256[] memory unclaimedAmounts) + { + RewardsDataTypes.UserAssetBalance[] memory userAssetBalances = _getUserAssetBalances( + assets, + user + ); + rewardsList = new address[](_rewardsList.length); + unclaimedAmounts = new uint256[](rewardsList.length); + + // Add unrealized rewards from user to unclaimedRewards + for (uint256 i = 0; i < userAssetBalances.length; i++) { + for (uint256 r = 0; r < rewardsList.length; r++) { + rewardsList[r] = _rewardsList[r]; + unclaimedAmounts[r] += _assets[userAssetBalances[i].asset] + .rewards[rewardsList[r]] + .usersData[user] + .accrued; + + if (userAssetBalances[i].userBalance == 0) { + continue; + } + unclaimedAmounts[r] += _getPendingRewards(user, rewardsList[r], userAssetBalances[i]); + } + } + return (rewardsList, unclaimedAmounts); + } + + /// @inheritdoc IRewardsDistributor + function setDistributionEnd( + address asset, + address reward, + uint32 newDistributionEnd + ) external override onlyEmissionManager { + uint256 oldDistributionEnd = _assets[asset].rewards[reward].distributionEnd; + _assets[asset].rewards[reward].distributionEnd = newDistributionEnd; + + emit AssetConfigUpdated( + asset, + reward, + _assets[asset].rewards[reward].emissionPerSecond, + _assets[asset].rewards[reward].emissionPerSecond, + oldDistributionEnd, + newDistributionEnd, + _assets[asset].rewards[reward].index + ); + } + + /// @inheritdoc IRewardsDistributor + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external override onlyEmissionManager { + require(rewards.length == newEmissionsPerSecond.length, 'INVALID_INPUT'); + for (uint256 i = 0; i < rewards.length; i++) { + RewardsDataTypes.AssetData storage assetConfig = _assets[asset]; + RewardsDataTypes.RewardData storage rewardConfig = _assets[asset].rewards[rewards[i]]; + uint256 decimals = assetConfig.decimals; + require( + decimals != 0 && rewardConfig.lastUpdateTimestamp != 0, + 'DISTRIBUTION_DOES_NOT_EXIST' + ); + + (uint256 newIndex, ) = _updateRewardData( + rewardConfig, + IScaledBalanceToken(asset).scaledTotalSupply(), + 10**decimals + ); + + uint256 oldEmissionPerSecond = rewardConfig.emissionPerSecond; + rewardConfig.emissionPerSecond = newEmissionsPerSecond[i]; + + emit AssetConfigUpdated( + asset, + rewards[i], + oldEmissionPerSecond, + newEmissionsPerSecond[i], + rewardConfig.distributionEnd, + rewardConfig.distributionEnd, + newIndex + ); + } + } + + /** + * @dev Configure the _assets for a specific emission + * @param rewardsInput The array of each asset configuration + **/ + function _configureAssets(RewardsDataTypes.RewardsConfigInput[] memory rewardsInput) internal { + for (uint256 i = 0; i < rewardsInput.length; i++) { + if (_assets[rewardsInput[i].asset].decimals == 0) { + //never initialized before, adding to the list of assets + _assetsList.push(rewardsInput[i].asset); + } + + uint256 decimals = _assets[rewardsInput[i].asset].decimals = IERC20Detailed( + rewardsInput[i].asset + ).decimals(); + + RewardsDataTypes.RewardData storage rewardConfig = _assets[rewardsInput[i].asset].rewards[ + rewardsInput[i].reward + ]; + + // Add reward address to asset available rewards if latestUpdateTimestamp is zero + if (rewardConfig.lastUpdateTimestamp == 0) { + _assets[rewardsInput[i].asset].availableRewards[ + _assets[rewardsInput[i].asset].availableRewardsCount + ] = rewardsInput[i].reward; + _assets[rewardsInput[i].asset].availableRewardsCount++; + } + + // Add reward address to global rewards list if still not enabled + if (_isRewardEnabled[rewardsInput[i].reward] == false) { + _isRewardEnabled[rewardsInput[i].reward] = true; + _rewardsList.push(rewardsInput[i].reward); + } + + // Due emissions is still zero, updates only latestUpdateTimestamp + (uint256 newIndex, ) = _updateRewardData( + rewardConfig, + rewardsInput[i].totalSupply, + 10**decimals + ); + + // Configure emission and distribution end of the reward per asset + uint88 oldEmissionsPerSecond = rewardConfig.emissionPerSecond; + uint32 oldDistributionEnd = rewardConfig.distributionEnd; + rewardConfig.emissionPerSecond = rewardsInput[i].emissionPerSecond; + rewardConfig.distributionEnd = rewardsInput[i].distributionEnd; + + emit AssetConfigUpdated( + rewardsInput[i].asset, + rewardsInput[i].reward, + oldEmissionsPerSecond, + rewardsInput[i].emissionPerSecond, + oldDistributionEnd, + rewardsInput[i].distributionEnd, + newIndex + ); + } + } + + /** + * @dev Updates the state of the distribution for the specified reward + * @param rewardData Storage pointer to the distribution reward config + * @param totalSupply Current total of underlying assets for this distribution + * @param assetUnit One unit of asset (10**decimals) + * @return The new distribution index + * @return True if the index was updated, false otherwise + **/ + function _updateRewardData( + RewardsDataTypes.RewardData storage rewardData, + uint256 totalSupply, + uint256 assetUnit + ) internal returns (uint256, bool) { + (uint256 oldIndex, uint256 newIndex) = _getAssetIndex(rewardData, totalSupply, assetUnit); + bool indexUpdated; + if (newIndex != oldIndex) { + require(newIndex <= type(uint104).max, 'INDEX_OVERFLOW'); + indexUpdated = true; + + //optimization: storing one after another saves one SSTORE + rewardData.index = uint104(newIndex); + rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); + } else { + rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); + } + + return (newIndex, indexUpdated); + } + + /** + * @dev Updates the state of the distribution for the specific user + * @param rewardData Storage pointer to the distribution reward config + * @param user The address of the user + * @param userBalance The user balance of the asset + * @param newAssetIndex The new index of the asset distribution + * @param assetUnit One unit of asset (10**decimals) + * @return The rewards accrued since the last update + **/ + function _updateUserData( + RewardsDataTypes.RewardData storage rewardData, + address user, + uint256 userBalance, + uint256 newAssetIndex, + uint256 assetUnit + ) internal returns (uint256, bool) { + uint256 userIndex = rewardData.usersData[user].index; + uint256 rewardsAccrued; + bool dataUpdated; + if ((dataUpdated = userIndex != newAssetIndex)) { + // already checked for overflow in _updateRewardData + rewardData.usersData[user].index = uint104(newAssetIndex); + if (userBalance != 0) { + rewardsAccrued = _getRewards(userBalance, newAssetIndex, userIndex, assetUnit); + + rewardData.usersData[user].accrued += rewardsAccrued.toUint128(); + } + } + return (rewardsAccrued, dataUpdated); + } + + /** + * @dev Iterates and accrues all the rewards for asset of the specific user + * @param asset The address of the reference asset of the distribution + * @param user The user address + * @param userBalance The current user asset balance + * @param totalSupply Total supply of the asset + **/ + function _updateData( + address asset, + address user, + uint256 userBalance, + uint256 totalSupply + ) internal { + uint256 assetUnit; + uint256 numAvailableRewards = _assets[asset].availableRewardsCount; + unchecked { + assetUnit = 10**_assets[asset].decimals; + } + + if (numAvailableRewards == 0) { + return; + } + unchecked { + for (uint128 r = 0; r < numAvailableRewards; r++) { + address reward = _assets[asset].availableRewards[r]; + RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; + + (uint256 newAssetIndex, bool rewardDataUpdated) = _updateRewardData( + rewardData, + totalSupply, + assetUnit + ); + + (uint256 rewardsAccrued, bool userDataUpdated) = _updateUserData( + rewardData, + user, + userBalance, + newAssetIndex, + assetUnit + ); + + if (rewardDataUpdated || userDataUpdated) { + emit Accrued(asset, reward, user, newAssetIndex, newAssetIndex, rewardsAccrued); + } + } + } + } + + /** + * @dev Accrues all the rewards of the assets specified in the userAssetBalances list + * @param user The address of the user + * @param userAssetBalances List of structs with the user balance and total supply of a set of assets + **/ + function _updateDataMultiple( + address user, + RewardsDataTypes.UserAssetBalance[] memory userAssetBalances + ) internal { + for (uint256 i = 0; i < userAssetBalances.length; i++) { + _updateData( + userAssetBalances[i].asset, + user, + userAssetBalances[i].userBalance, + userAssetBalances[i].totalSupply + ); + } + } + + /** + * @dev Return the accrued unclaimed amount of a reward from a user over a list of distribution + * @param user The address of the user + * @param reward The address of the reward token + * @param userAssetBalances List of structs with the user balance and total supply of a set of assets + * @return unclaimedRewards The accrued rewards for the user until the moment + **/ + function _getUserReward( + address user, + address reward, + RewardsDataTypes.UserAssetBalance[] memory userAssetBalances + ) internal view returns (uint256 unclaimedRewards) { + // Add unrealized rewards + for (uint256 i = 0; i < userAssetBalances.length; i++) { + if (userAssetBalances[i].userBalance == 0) { + unclaimedRewards += _assets[userAssetBalances[i].asset] + .rewards[reward] + .usersData[user] + .accrued; + } else { + unclaimedRewards += + _getPendingRewards(user, reward, userAssetBalances[i]) + + _assets[userAssetBalances[i].asset].rewards[reward].usersData[user].accrued; + } + } + + return unclaimedRewards; + } + + /** + * @dev Calculates the pending (not yet accrued) rewards since the last user action + * @param user The address of the user + * @param reward The address of the reward token + * @param userAssetBalance struct with the user balance and total supply of the incentivized asset + * @return The pending rewards for the user since the last user action + **/ + function _getPendingRewards( + address user, + address reward, + RewardsDataTypes.UserAssetBalance memory userAssetBalance + ) internal view returns (uint256) { + RewardsDataTypes.RewardData storage rewardData = _assets[userAssetBalance.asset].rewards[ + reward + ]; + uint256 assetUnit = 10**_assets[userAssetBalance.asset].decimals; + (, uint256 nextIndex) = _getAssetIndex(rewardData, userAssetBalance.totalSupply, assetUnit); + + return + _getRewards( + userAssetBalance.userBalance, + nextIndex, + rewardData.usersData[user].index, + assetUnit + ); + } + + /** + * @dev Internal function for the calculation of user's rewards on a distribution + * @param userBalance Balance of the user asset on a distribution + * @param reserveIndex Current index of the distribution + * @param userIndex Index stored for the user, representation his staking moment + * @param assetUnit One unit of asset (10**decimals) + * @return The rewards + **/ + function _getRewards( + uint256 userBalance, + uint256 reserveIndex, + uint256 userIndex, + uint256 assetUnit + ) internal pure returns (uint256) { + uint256 result = userBalance * (reserveIndex - userIndex); + assembly { + result := div(result, assetUnit) + } + return result; + } + + /** + * @dev Calculates the next value of an specific distribution index, with validations + * @param rewardData Storage pointer to the distribution reward config + * @param totalSupply of the asset being rewarded + * @param assetUnit One unit of asset (10**decimals) + * @return The new index. + **/ + function _getAssetIndex( + RewardsDataTypes.RewardData storage rewardData, + uint256 totalSupply, + uint256 assetUnit + ) internal view returns (uint256, uint256) { + uint256 oldIndex = rewardData.index; + uint256 distributionEnd = rewardData.distributionEnd; + uint256 emissionPerSecond = rewardData.emissionPerSecond; + uint256 lastUpdateTimestamp = rewardData.lastUpdateTimestamp; + + if ( + emissionPerSecond == 0 || + totalSupply == 0 || + lastUpdateTimestamp == block.timestamp || + lastUpdateTimestamp >= distributionEnd + ) { + return (oldIndex, oldIndex); + } + + uint256 currentTimestamp = block.timestamp > distributionEnd + ? distributionEnd + : block.timestamp; + uint256 timeDelta = currentTimestamp - lastUpdateTimestamp; + uint256 firstTerm = emissionPerSecond * timeDelta * assetUnit; + assembly { + firstTerm := div(firstTerm, totalSupply) + } + return (oldIndex, (firstTerm + oldIndex)); + } + + /** + * @dev Get user balances and total supply of all the assets specified by the assets parameter + * @param assets List of assets to retrieve user balance and total supply + * @param user Address of the user + * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets + */ + function _getUserAssetBalances(address[] calldata assets, address user) + internal + view + virtual + returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances); + + /// @inheritdoc IRewardsDistributor + function getAssetDecimals(address asset) external view returns (uint8) { + return _assets[asset].decimals; + } + + /// @inheritdoc IRewardsDistributor + function getEmissionManager() external view returns (address) { + return EMISSION_MANAGER; + } +} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsController.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsController.sol new file mode 100644 index 00000000..506bf78a --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsController.sol @@ -0,0 +1,206 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.10; + +import {IRewardsDistributor} from './IRewardsDistributor.sol'; +import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; +import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol'; +import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; + +/** + * @title IRewardsController + * @author Aave + * @notice Defines the basic interface for a Rewards Controller. + */ +interface IRewardsController is IRewardsDistributor { + /** + * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user + * @param user The address of the user + * @param claimer The address of the claimer + */ + event ClaimerSet(address indexed user, address indexed claimer); + + /** + * @dev Emitted when rewards are claimed + * @param user The address of the user rewards has been claimed on behalf of + * @param reward The address of the token reward is claimed + * @param to The address of the receiver of the rewards + * @param claimer The address of the claimer + * @param amount The amount of rewards claimed + */ + event RewardsClaimed( + address indexed user, + address indexed reward, + address indexed to, + address claimer, + uint256 amount + ); + + /** + * @dev Emitted when a transfer strategy is installed for the reward distribution + * @param reward The address of the token reward + * @param transferStrategy The address of TransferStrategy contract + */ + event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); + + /** + * @dev Emitted when the reward oracle is updated + * @param reward The address of the token reward + * @param rewardOracle The address of oracle + */ + event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Get the price aggregator oracle address + * @param reward The address of the reward + * @return The price oracle of the reward + */ + function getRewardOracle(address reward) external view returns (address); + + /** + * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) + * @param user The address of the user + * @return The claimer address + */ + function getClaimer(address user) external view returns (address); + + /** + * @dev Returns the Transfer Strategy implementation contract address being used for a reward address + * @param reward The address of the reward + * @return The address of the TransferStrategy contract + */ + function getTransferStrategy(address reward) external view returns (address); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + **/ + function handleAction( + address user, + uint256 totalSupply, + uint256 userBalance + ) external; + + /** + * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The + * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external returns (uint256); + + /** + * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" + **/ + function claimAllRewards(address[] calldata assets, address to) + external + returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must + * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsToSelf(address[] calldata assets) + external + returns (address[] memory rewardsList, uint256[] memory claimedAmounts); +} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsDistributor.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsDistributor.sol new file mode 100644 index 00000000..c18de27a --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsDistributor.sol @@ -0,0 +1,186 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.10; + +/** + * @title IRewardsDistributor + * @author Aave + * @notice Defines the basic interface for a Rewards Distributor. + */ +interface IRewardsDistributor { + /** + * @dev Emitted when the configuration of the rewards of an asset is updated. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param oldEmission The old emissions per second value of the reward distribution + * @param newEmission The new emissions per second value of the reward distribution + * @param oldDistributionEnd The old end timestamp of the reward distribution + * @param newDistributionEnd The new end timestamp of the reward distribution + * @param assetIndex The index of the asset distribution + */ + event AssetConfigUpdated( + address indexed asset, + address indexed reward, + uint256 oldEmission, + uint256 newEmission, + uint256 oldDistributionEnd, + uint256 newDistributionEnd, + uint256 assetIndex + ); + + /** + * @dev Emitted when rewards of an asset are accrued on behalf of a user. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param user The address of the user that rewards are accrued on behalf of + * @param assetIndex The index of the asset distribution + * @param userIndex The index of the asset distribution on behalf of the user + * @param rewardsAccrued The amount of rewards accrued + */ + event Accrued( + address indexed asset, + address indexed reward, + address indexed user, + uint256 assetIndex, + uint256 userIndex, + uint256 rewardsAccrued + ); + + /** + * @dev Sets the end date for the distribution + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd( + address asset, + address reward, + uint32 newDistributionEnd + ) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Gets the end date for the distribution + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The timestamp with the end of the distribution, in unix time format + **/ + function getDistributionEnd(address asset, address reward) external view returns (uint256); + + /** + * @dev Returns the index of a user on a reward distribution + * @param user Address of the user + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The current user asset index, not including new distributions + **/ + function getUserAssetIndex( + address user, + address asset, + address reward + ) external view returns (uint256); + + /** + * @dev Returns the configuration of the distribution reward for a certain asset + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The index of the asset distribution + * @return The emission per second of the reward distribution + * @return The timestamp of the last update of the index + * @return The timestamp of the distribution end + **/ + function getRewardsData(address asset, address reward) + external + view + returns ( + uint256, + uint256, + uint256, + uint256 + ); + + /** + * @dev Calculates the next value of an specific distribution index, with validations. + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The old index of the asset distribution + * @return The new index of the asset distribution + **/ + function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); + + /** + * @dev Returns the list of available reward token addresses of an incentivized asset + * @param asset The incentivized asset + * @return List of rewards addresses of the input asset + **/ + function getRewardsByAsset(address asset) external view returns (address[] memory); + + /** + * @dev Returns the list of available reward addresses + * @return List of rewards supported in this contract + **/ + function getRewardsList() external view returns (address[] memory); + + /** + * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. + * @param user The address of the user + * @param reward The address of the reward token + * @return Unclaimed rewards, not including new distributions + **/ + function getUserAccruedRewards(address user, address reward) external view returns (uint256); + + /** + * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @param reward The address of the reward token + * @return The rewards amount + **/ + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view returns (uint256); + + /** + * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @return The list of reward addresses + * @return The list of unclaimed amount of rewards + **/ + function getAllUserRewards(address[] calldata assets, address user) + external + view + returns (address[] memory, uint256[] memory); + + /** + * @dev Returns the decimals of an asset to calculate the distribution delta + * @param asset The address to retrieve decimals + * @return The decimals of an underlying asset + */ + function getAssetDecimals(address asset) external view returns (uint8); + + /** + * @dev Returns the address of the emission manager + * @return The address of the EmissionManager + */ + function EMISSION_MANAGER() external view returns (address); + + /** + * @dev Returns the address of the emission manager. + * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. + * @return The address of the EmissionManager + */ + function getEmissionManager() external view returns (address); +} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/ITransferStrategyBase.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/ITransferStrategyBase.sol new file mode 100644 index 00000000..b1007a01 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/ITransferStrategyBase.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.10; + +interface ITransferStrategyBase { + event EmergencyWithdrawal( + address indexed caller, + address indexed token, + address indexed to, + uint256 amount + ); + + /** + * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation + * @param to Account to transfer rewards + * @param reward Address of the reward token + * @param amount Amount to transfer to the "to" address parameter + * @return Returns true bool if transfer logic succeeds + */ + function performTransfer( + address to, + address reward, + uint256 amount + ) external returns (bool); + + /** + * @return Returns the address of the Incentives Controller + */ + function getIncentivesController() external view returns (address); + + /** + * @return Returns the address of the Rewards admin + */ + function getRewardsAdmin() external view returns (address); + + /** + * @dev Perform an emergency token withdrawal only callable by the Rewards admin + * @param token Address of the token to withdraw funds from this contract + * @param to Address of the recipient of the withdrawal + * @param amount Amount of the withdrawal + */ + function emergencyWithdrawal( + address token, + address to, + uint256 amount + ) external; +} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/libraries/RewardsDataTypes.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/libraries/RewardsDataTypes.sol new file mode 100644 index 00000000..64e09578 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/libraries/RewardsDataTypes.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.10; + +import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; +import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol'; + +library RewardsDataTypes { + struct RewardsConfigInput { + uint88 emissionPerSecond; + uint256 totalSupply; + uint32 distributionEnd; + address asset; + address reward; + ITransferStrategyBase transferStrategy; + IEACAggregatorProxy rewardOracle; + } + + struct UserAssetBalance { + address asset; + uint256 userBalance; + uint256 totalSupply; + } + + struct UserData { + // Liquidity index of the reward distribution for the user + uint104 index; + // Amount of accrued rewards for the user since last user index update + uint128 accrued; + } + + struct RewardData { + // Liquidity index of the reward distribution + uint104 index; + // Amount of reward tokens distributed per second + uint88 emissionPerSecond; + // Timestamp of the last reward index update + uint32 lastUpdateTimestamp; + // The end of the distribution of rewards (in seconds) + uint32 distributionEnd; + // Map of user addresses and their rewards data (userAddress => userData) + mapping(address => UserData) usersData; + } + + struct AssetData { + // Map of reward token addresses and their data (rewardTokenAddress => rewardData) + mapping(address => RewardData) rewards; + // List of reward token addresses for the asset + mapping(uint128 => address) availableRewards; + // Count of reward tokens for the asset + uint128 availableRewardsCount; + // Number of decimals of the asset + uint8 decimals; + } +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol new file mode 100644 index 00000000..d6d70f17 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol @@ -0,0 +1,3058 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity =0.8.10 ^0.8.0; + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/ICreditDelegationToken.sol + +/** + * @title ICreditDelegationToken + * @author Aave + * @notice Defines the basic interface for a token supporting credit delegation. + */ +interface ICreditDelegationToken { + /** + * @dev Emitted on `approveDelegation` and `borrowAllowance + * @param fromUser The address of the delegator + * @param toUser The address of the delegatee + * @param asset The address of the delegated asset + * @param amount The amount being delegated + */ + event BorrowAllowanceDelegated( + address indexed fromUser, + address indexed toUser, + address indexed asset, + uint256 amount + ); + + /** + * @notice Delegates borrowing power to a user on the specific debt token. + * Delegation will still respect the liquidation constraints (even if delegated, a + * delegatee cannot force a delegator HF to go below 1) + * @param delegatee The address receiving the delegated borrowing power + * @param amount The maximum amount being delegated. + */ + function approveDelegation(address delegatee, uint256 amount) external; + + /** + * @notice Returns the borrow allowance of the user + * @param fromUser The user to giving allowance + * @param toUser The user to give allowance to + * @return The current allowance of `toUser` + */ + function borrowAllowance(address fromUser, address toUser) external view returns (uint256); + + /** + * @notice Delegates borrowing power to a user on the specific debt token via ERC712 signature + * @param delegator The delegator of the credit + * @param delegatee The delegatee that can use the credit + * @param value The amount to be delegated + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v The V signature param + * @param s The S signature param + * @param r The R signature param + */ + function delegationWithSig( + address delegator, + address delegatee, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + //the current stable borrow rate. Expressed in ray + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + //stableDebtToken address + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62-63: reserved + //bit 64-79: reserve factor + //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167 liquidation protocol fee + //bit 168-175 eMode category + //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // each eMode category may or may not have a custom oracle to override the individual assets price oracles + address priceSource; + string label; + } + + enum InterestRateMode { + NONE, + STABLE, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currPrincipalStableDebt; + uint256 currAvgStableBorrowRate; + uint256 currTotalStableDebt; + uint256 nextAvgStableBorrowRate; + uint256 nextTotalStableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address stableDebtTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + uint40 stableDebtLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address addressesProvider; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 maxStableLoanPercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalStableDebt; + uint256 totalVariableDebt; + uint256 averageStableBorrowRate; + uint256 reserveFactor; + address reserve; + address aToken; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address stableDebtAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol + +/** + * @title EIP712Base + * @author Aave + * @notice Base contract implementation of EIP712. + */ +abstract contract EIP712Base { + bytes public constant EIP712_REVISION = bytes('1'); + bytes32 internal constant EIP712_DOMAIN = + keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); + + // Map of address nonces (address => nonce) + mapping(address => uint256) internal _nonces; + + bytes32 internal _domainSeparator; + uint256 internal immutable _chainId; + + /** + * @dev Constructor. + */ + constructor() { + _chainId = block.chainid; + } + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { + if (block.chainid == _chainId) { + return _domainSeparator; + } + return _calculateDomainSeparator(); + } + + /** + * @notice Returns the nonce value for address specified as parameter + * @param owner The address for which the nonce is being returned + * @return The nonce value for the input address` + */ + function nonces(address owner) public view virtual returns (uint256) { + return _nonces[owner]; + } + + /** + * @notice Compute the current domain separator + * @return The domain separator for the token + */ + function _calculateDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + EIP712_DOMAIN, + keccak256(bytes(_EIP712BaseId())), + keccak256(EIP712_REVISION), + block.chainid, + address(this) + ) + ); + } + + /** + * @notice Returns the user readable name of signing domain (e.g. token name) + * @return The name of the signing domain + */ + function _EIP712BaseId() internal view virtual returns (string memory); +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on swapBorrowRateMode() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user swapping his rate mode + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + */ + event SwapBorrowRateMode( + address indexed reserve, + address indexed user, + DataTypes.InterestRateMode interestRateMode + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on rebalanceStableBorrowRate() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user for which the rebalance has been executed + */ + event RebalanceStableBorrowRate(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the + * corresponding debt token (StableDebtToken or VariableDebtToken) + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 stable/variable debt tokens, depending on the `interestRateMode` + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa + * @param asset The address of the underlying asset borrowed + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + */ + function swapBorrowRateMode(address asset, uint256 interestRateMode) external; + + /** + * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. + * - Users can be rebalanced if the following conditions are satisfied: + * 1. Usage ratio is above 95% + * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too + * much has been borrowed at a stable rate and suppliers are not earning enough + * @param asset The address of the underlying asset borrowed + * @param user The address of the user to be rebalanced + */ + function rebalanceStableBorrowRate(address asset, address user) external; + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address stableDebtAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new category for the eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; + + /** + * @notice Returns the data of an eMode category + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate + * @return The percentage of available liquidity to borrow, expressed in bps + */ + function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/DebtTokenBase.sol + +/** + * @title DebtTokenBase + * @author Aave + * @notice Base contract for different types of debt tokens, like StableDebtToken or VariableDebtToken + */ +abstract contract DebtTokenBase is + VersionedInitializable, + EIP712Base, + Context, + ICreditDelegationToken +{ + // Map of borrow allowances (delegator => delegatee => borrowAllowanceAmount) + mapping(address => mapping(address => uint256)) internal _borrowAllowances; + + // Credit Delegation Typehash + bytes32 public constant DELEGATION_WITH_SIG_TYPEHASH = + keccak256('DelegationWithSig(address delegatee,uint256 value,uint256 nonce,uint256 deadline)'); + + address internal _underlyingAsset; + + /** + * @dev Constructor. + */ + constructor() EIP712Base() { + // Intentionally left blank + } + + /// @inheritdoc ICreditDelegationToken + function approveDelegation(address delegatee, uint256 amount) external override { + _approveDelegation(_msgSender(), delegatee, amount); + } + + /// @inheritdoc ICreditDelegationToken + function delegationWithSig( + address delegator, + address delegatee, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external { + require(delegator != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + //solium-disable-next-line + require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); + uint256 currentValidNonce = _nonces[delegator]; + bytes32 digest = keccak256( + abi.encodePacked( + '\x19\x01', + DOMAIN_SEPARATOR(), + keccak256( + abi.encode(DELEGATION_WITH_SIG_TYPEHASH, delegatee, value, currentValidNonce, deadline) + ) + ) + ); + require(delegator == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); + _nonces[delegator] = currentValidNonce + 1; + _approveDelegation(delegator, delegatee, value); + } + + /// @inheritdoc ICreditDelegationToken + function borrowAllowance( + address fromUser, + address toUser + ) external view override returns (uint256) { + return _borrowAllowances[fromUser][toUser]; + } + + /** + * @notice Updates the borrow allowance of a user on the specific debt token. + * @param delegator The address delegating the borrowing power + * @param delegatee The address receiving the delegated borrowing power + * @param amount The allowance amount being delegated. + */ + function _approveDelegation(address delegator, address delegatee, uint256 amount) internal { + _borrowAllowances[delegator][delegatee] = amount; + emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, amount); + } + + /** + * @notice Decreases the borrow allowance of a user on the specific debt token. + * @param delegator The address delegating the borrowing power + * @param delegatee The address receiving the delegated borrowing power + * @param amount The amount to subtract from the current allowance + */ + function _decreaseBorrowAllowance(address delegator, address delegatee, uint256 amount) internal { + uint256 newAllowance = _borrowAllowances[delegator][delegatee] - amount; + + _borrowAllowances[delegator][delegatee] = newAllowance; + + emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, newAllowance); + } +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. StableDebtTokens use + * this field to store the user's stable rate. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor(IPool pool, string memory name, string memory symbol, uint8 decimals) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name; + _symbol = symbol; + _decimals = decimals; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol + +/** + * @title MintableIncentivizedERC20 + * @author Aave + * @notice Implements mint and burn functions for IncentivizedERC20 + */ +abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) IncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /** + * @notice Mints tokens to an account and apply incentives if defined + * @param account The address receiving tokens + * @param amount The amount of tokens to mint + */ + function _mint(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply + amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } + + /** + * @notice Burns tokens from an account and apply incentives if defined + * @param account The account whose tokens are burnt + * @param amount The amount of tokens to burn + */ + function _burn(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply - amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance - amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol + +/** + * @title ScaledBalanceTokenBase + * @author Aave + * @notice Basic ERC20 implementation of scaled balance token + */ +abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) MintableIncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /// @inheritdoc IScaledBalanceToken + function scaledBalanceOf(address user) external view override returns (uint256) { + return super.balanceOf(user); + } + + /// @inheritdoc IScaledBalanceToken + function getScaledUserBalanceAndSupply( + address user + ) external view override returns (uint256, uint256) { + return (super.balanceOf(user), super.totalSupply()); + } + + /// @inheritdoc IScaledBalanceToken + function scaledTotalSupply() public view virtual override returns (uint256) { + return super.totalSupply(); + } + + /// @inheritdoc IScaledBalanceToken + function getPreviousIndex(address user) external view virtual override returns (uint256) { + return _userState[user].additionalData; + } + + /** + * @notice Implements the basic logic to mint a scaled balance token. + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the scaled tokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function _mintScaled( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) internal returns (bool) { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); + + uint256 scaledBalance = super.balanceOf(onBehalfOf); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[onBehalfOf].additionalData); + + _userState[onBehalfOf].additionalData = index.toUint128(); + + _mint(onBehalfOf, amountScaled.toUint128()); + + uint256 amountToMint = amount + balanceIncrease; + emit Transfer(address(0), onBehalfOf, amountToMint); + emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); + + return (scaledBalance == 0); + } + + /** + * @notice Implements the basic logic to burn a scaled balance token. + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param user The user which debt is burnt + * @param target The address that will receive the underlying, if any + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + */ + function _burnScaled(address user, address target, uint256 amount, uint256 index) internal { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); + + uint256 scaledBalance = super.balanceOf(user); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[user].additionalData); + + _userState[user].additionalData = index.toUint128(); + + _burn(user, amountScaled.toUint128()); + + if (balanceIncrease > amount) { + uint256 amountToMint = balanceIncrease - amount; + emit Transfer(address(0), user, amountToMint); + emit Mint(user, user, amountToMint, balanceIncrease, index); + } else { + uint256 amountToBurn = amount - balanceIncrease; + emit Transfer(user, address(0), amountToBurn); + emit Burn(user, target, amountToBurn, balanceIncrease, index); + } + } + + /** + * @notice Implements the basic logic to transfer scaled balance tokens between two users + * @dev It emits a mint event with the interest accrued per user + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + * @param index The next liquidity index of the reserve + */ + function _transfer(address sender, address recipient, uint256 amount, uint256 index) internal { + uint256 senderScaledBalance = super.balanceOf(sender); + uint256 senderBalanceIncrease = senderScaledBalance.rayMul(index) - + senderScaledBalance.rayMul(_userState[sender].additionalData); + + uint256 recipientScaledBalance = super.balanceOf(recipient); + uint256 recipientBalanceIncrease = recipientScaledBalance.rayMul(index) - + recipientScaledBalance.rayMul(_userState[recipient].additionalData); + + _userState[sender].additionalData = index.toUint128(); + _userState[recipient].additionalData = index.toUint128(); + + super._transfer(sender, recipient, amount.rayDiv(index).toUint128()); + + if (senderBalanceIncrease > 0) { + emit Transfer(address(0), sender, senderBalanceIncrease); + emit Mint(_msgSender(), sender, senderBalanceIncrease, senderBalanceIncrease, index); + } + + if (sender != recipient && recipientBalanceIncrease > 0) { + emit Transfer(address(0), recipient, recipientBalanceIncrease); + emit Mint(_msgSender(), recipient, recipientBalanceIncrease, recipientBalanceIncrease, index); + } + + emit Transfer(sender, recipient, amount); + } +} + +// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/VariableDebtToken.sol + +/** + * @title VariableDebtToken + * @author Aave + * @notice Implements a variable debt token to track the borrowing positions of users + * at variable rate mode + * @dev Transfer and approve functionalities are disabled since its a non-transferable token + */ +contract VariableDebtToken is DebtTokenBase, ScaledBalanceTokenBase, IVariableDebtToken { + using WadRayMath for uint256; + using SafeCast for uint256; + + uint256 public constant DEBT_TOKEN_REVISION = 0x2; + + /** + * @dev Constructor. + * @param pool The address of the Pool contract + */ + constructor( + IPool pool + ) + DebtTokenBase() + ScaledBalanceTokenBase(pool, 'VARIABLE_DEBT_TOKEN_IMPL', 'VARIABLE_DEBT_TOKEN_IMPL', 0) + { + // Intentionally left blank + } + + /// @inheritdoc IInitializableDebtToken + function initialize( + IPool initializingPool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external override initializer { + require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); + _setName(debtTokenName); + _setSymbol(debtTokenSymbol); + _setDecimals(debtTokenDecimals); + + _underlyingAsset = underlyingAsset; + _incentivesController = incentivesController; + + _domainSeparator = _calculateDomainSeparator(); + + emit Initialized( + underlyingAsset, + address(POOL), + address(incentivesController), + debtTokenDecimals, + debtTokenName, + debtTokenSymbol, + params + ); + } + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure virtual override returns (uint256) { + return DEBT_TOKEN_REVISION; + } + + /// @inheritdoc IERC20 + function balanceOf(address user) public view virtual override returns (uint256) { + uint256 scaledBalance = super.balanceOf(user); + + if (scaledBalance == 0) { + return 0; + } + + return scaledBalance.rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); + } + + /// @inheritdoc IVariableDebtToken + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external virtual override onlyPool returns (bool, uint256) { + if (user != onBehalfOf) { + _decreaseBorrowAllowance(onBehalfOf, user, amount); + } + return (_mintScaled(user, onBehalfOf, amount, index), scaledTotalSupply()); + } + + /// @inheritdoc IVariableDebtToken + function burn( + address from, + uint256 amount, + uint256 index + ) external virtual override onlyPool returns (uint256) { + _burnScaled(from, address(0), amount, index); + return scaledTotalSupply(); + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return super.totalSupply().rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); + } + + /// @inheritdoc EIP712Base + function _EIP712BaseId() internal view override returns (string memory) { + return name(); + } + + /** + * @dev Being non transferrable, the debt token does not implement any of the + * standard ERC20 functions for transfer and allowance. + */ + function transfer(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function allowance(address, address) external view virtual override returns (uint256) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function approve(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function transferFrom(address, address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function increaseAllowance(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function decreaseAllowance(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + /// @inheritdoc IVariableDebtToken + function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { + return _underlyingAsset; + } +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..445ee640 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..1d470e01 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..6303454f --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..6d708093 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity 0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..d5d97ceb --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..c06c605a --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/ICreditDelegationToken.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/ICreditDelegationToken.sol new file mode 100644 index 00000000..323118f1 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/ICreditDelegationToken.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +/** + * @title ICreditDelegationToken + * @author Aave + * @notice Defines the basic interface for a token supporting credit delegation. + */ +interface ICreditDelegationToken { + /** + * @dev Emitted on `approveDelegation` and `borrowAllowance + * @param fromUser The address of the delegator + * @param toUser The address of the delegatee + * @param asset The address of the delegated asset + * @param amount The amount being delegated + */ + event BorrowAllowanceDelegated( + address indexed fromUser, + address indexed toUser, + address indexed asset, + uint256 amount + ); + + /** + * @notice Delegates borrowing power to a user on the specific debt token. + * Delegation will still respect the liquidation constraints (even if delegated, a + * delegatee cannot force a delegator HF to go below 1) + * @param delegatee The address receiving the delegated borrowing power + * @param amount The maximum amount being delegated. + */ + function approveDelegation(address delegatee, uint256 amount) external; + + /** + * @notice Returns the borrow allowance of the user + * @param fromUser The user to giving allowance + * @param toUser The user to give allowance to + * @return The current allowance of `toUser` + */ + function borrowAllowance(address fromUser, address toUser) external view returns (uint256); + + /** + * @notice Delegates borrowing power to a user on the specific debt token via ERC712 signature + * @param delegator The delegator of the credit + * @param delegatee The delegatee that can use the credit + * @param value The amount to be delegated + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v The V signature param + * @param s The S signature param + * @param r The R signature param + */ + function delegationWithSig( + address delegator, + address delegatee, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..ad8cd7c6 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..ef306e73 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPool.sol @@ -0,0 +1,737 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on swapBorrowRateMode() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user swapping his rate mode + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + */ + event SwapBorrowRateMode( + address indexed reserve, + address indexed user, + DataTypes.InterestRateMode interestRateMode + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on rebalanceStableBorrowRate() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user for which the rebalance has been executed + */ + event RebalanceStableBorrowRate(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the + * corresponding debt token (StableDebtToken or VariableDebtToken) + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 stable/variable debt tokens, depending on the `interestRateMode` + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa + * @param asset The address of the underlying asset borrowed + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + */ + function swapBorrowRateMode(address asset, uint256 interestRateMode) external; + + /** + * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. + * - Users can be rebalanced if the following conditions are satisfied: + * 1. Usage ratio is above 95% + * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too + * much has been borrowed at a stable rate and suppliers are not earning enough + * @param asset The address of the underlying asset borrowed + * @param user The address of the user to be rebalanced + */ + function rebalanceStableBorrowRate(address asset, address user) external; + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address stableDebtAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new category for the eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; + + /** + * @notice Returns the data of an eMode category + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate + * @return The percentage of available liquidity to borrow, expressed in bps + */ + function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..587a0d0b --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..fe311fbb --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..50602e6c --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol new file mode 100644 index 00000000..d24312bf --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..990069e0 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..8589dc0a --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,264 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +library DataTypes { + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + //the current stable borrow rate. Expressed in ray + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + //stableDebtToken address + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62-63: reserved + //bit 64-79: reserve factor + //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167 liquidation protocol fee + //bit 168-175 eMode category + //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // each eMode category may or may not have a custom oracle to override the individual assets price oracles + address priceSource; + string label; + } + + enum InterestRateMode {NONE, STABLE, VARIABLE} + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currPrincipalStableDebt; + uint256 currAvgStableBorrowRate; + uint256 currTotalStableDebt; + uint256 nextAvgStableBorrowRate; + uint256 nextTotalStableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address stableDebtTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + uint40 stableDebtLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address addressesProvider; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 maxStableLoanPercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalStableDebt; + uint256 totalVariableDebt; + uint256 averageStableBorrowRate; + uint256 reserveFactor; + address reserve; + address aToken; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address stableDebtAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/VariableDebtToken.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/VariableDebtToken.sol new file mode 100644 index 00000000..fab54633 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/VariableDebtToken.sol @@ -0,0 +1,155 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {SafeCast} from '../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {VersionedInitializable} from '../libraries/aave-upgradeability/VersionedInitializable.sol'; +import {WadRayMath} from '../libraries/math/WadRayMath.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; +import {IPool} from '../../interfaces/IPool.sol'; +import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; +import {IInitializableDebtToken} from '../../interfaces/IInitializableDebtToken.sol'; +import {IVariableDebtToken} from '../../interfaces/IVariableDebtToken.sol'; +import {EIP712Base} from './base/EIP712Base.sol'; +import {DebtTokenBase} from './base/DebtTokenBase.sol'; +import {ScaledBalanceTokenBase} from './base/ScaledBalanceTokenBase.sol'; + +/** + * @title VariableDebtToken + * @author Aave + * @notice Implements a variable debt token to track the borrowing positions of users + * at variable rate mode + * @dev Transfer and approve functionalities are disabled since its a non-transferable token + */ +contract VariableDebtToken is DebtTokenBase, ScaledBalanceTokenBase, IVariableDebtToken { + using WadRayMath for uint256; + using SafeCast for uint256; + + uint256 public constant DEBT_TOKEN_REVISION = 0x2; + + /** + * @dev Constructor. + * @param pool The address of the Pool contract + */ + constructor( + IPool pool + ) + DebtTokenBase() + ScaledBalanceTokenBase(pool, 'VARIABLE_DEBT_TOKEN_IMPL', 'VARIABLE_DEBT_TOKEN_IMPL', 0) + { + // Intentionally left blank + } + + /// @inheritdoc IInitializableDebtToken + function initialize( + IPool initializingPool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external override initializer { + require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); + _setName(debtTokenName); + _setSymbol(debtTokenSymbol); + _setDecimals(debtTokenDecimals); + + _underlyingAsset = underlyingAsset; + _incentivesController = incentivesController; + + _domainSeparator = _calculateDomainSeparator(); + + emit Initialized( + underlyingAsset, + address(POOL), + address(incentivesController), + debtTokenDecimals, + debtTokenName, + debtTokenSymbol, + params + ); + } + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure virtual override returns (uint256) { + return DEBT_TOKEN_REVISION; + } + + /// @inheritdoc IERC20 + function balanceOf(address user) public view virtual override returns (uint256) { + uint256 scaledBalance = super.balanceOf(user); + + if (scaledBalance == 0) { + return 0; + } + + return scaledBalance.rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); + } + + /// @inheritdoc IVariableDebtToken + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external virtual override onlyPool returns (bool, uint256) { + if (user != onBehalfOf) { + _decreaseBorrowAllowance(onBehalfOf, user, amount); + } + return (_mintScaled(user, onBehalfOf, amount, index), scaledTotalSupply()); + } + + /// @inheritdoc IVariableDebtToken + function burn( + address from, + uint256 amount, + uint256 index + ) external virtual override onlyPool returns (uint256) { + _burnScaled(from, address(0), amount, index); + return scaledTotalSupply(); + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return super.totalSupply().rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); + } + + /// @inheritdoc EIP712Base + function _EIP712BaseId() internal view override returns (string memory) { + return name(); + } + + /** + * @dev Being non transferrable, the debt token does not implement any of the + * standard ERC20 functions for transfer and allowance. + */ + function transfer(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function allowance(address, address) external view virtual override returns (uint256) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function approve(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function transferFrom(address, address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function increaseAllowance(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function decreaseAllowance(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + /// @inheritdoc IVariableDebtToken + function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { + return _underlyingAsset; + } +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/DebtTokenBase.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/DebtTokenBase.sol new file mode 100644 index 00000000..4ba95f29 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/DebtTokenBase.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {VersionedInitializable} from '../../libraries/aave-upgradeability/VersionedInitializable.sol'; +import {ICreditDelegationToken} from '../../../interfaces/ICreditDelegationToken.sol'; +import {EIP712Base} from './EIP712Base.sol'; + +/** + * @title DebtTokenBase + * @author Aave + * @notice Base contract for different types of debt tokens, like StableDebtToken or VariableDebtToken + */ +abstract contract DebtTokenBase is + VersionedInitializable, + EIP712Base, + Context, + ICreditDelegationToken +{ + // Map of borrow allowances (delegator => delegatee => borrowAllowanceAmount) + mapping(address => mapping(address => uint256)) internal _borrowAllowances; + + // Credit Delegation Typehash + bytes32 public constant DELEGATION_WITH_SIG_TYPEHASH = + keccak256('DelegationWithSig(address delegatee,uint256 value,uint256 nonce,uint256 deadline)'); + + address internal _underlyingAsset; + + /** + * @dev Constructor. + */ + constructor() EIP712Base() { + // Intentionally left blank + } + + /// @inheritdoc ICreditDelegationToken + function approveDelegation(address delegatee, uint256 amount) external override { + _approveDelegation(_msgSender(), delegatee, amount); + } + + /// @inheritdoc ICreditDelegationToken + function delegationWithSig( + address delegator, + address delegatee, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external { + require(delegator != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + //solium-disable-next-line + require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); + uint256 currentValidNonce = _nonces[delegator]; + bytes32 digest = keccak256( + abi.encodePacked( + '\x19\x01', + DOMAIN_SEPARATOR(), + keccak256( + abi.encode(DELEGATION_WITH_SIG_TYPEHASH, delegatee, value, currentValidNonce, deadline) + ) + ) + ); + require(delegator == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); + _nonces[delegator] = currentValidNonce + 1; + _approveDelegation(delegator, delegatee, value); + } + + /// @inheritdoc ICreditDelegationToken + function borrowAllowance( + address fromUser, + address toUser + ) external view override returns (uint256) { + return _borrowAllowances[fromUser][toUser]; + } + + /** + * @notice Updates the borrow allowance of a user on the specific debt token. + * @param delegator The address delegating the borrowing power + * @param delegatee The address receiving the delegated borrowing power + * @param amount The allowance amount being delegated. + */ + function _approveDelegation(address delegator, address delegatee, uint256 amount) internal { + _borrowAllowances[delegator][delegatee] = amount; + emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, amount); + } + + /** + * @notice Decreases the borrow allowance of a user on the specific debt token. + * @param delegator The address delegating the borrowing power + * @param delegatee The address receiving the delegated borrowing power + * @param amount The amount to subtract from the current allowance + */ + function _decreaseBorrowAllowance(address delegator, address delegatee, uint256 amount) internal { + uint256 newAllowance = _borrowAllowances[delegator][delegatee] - amount; + + _borrowAllowances[delegator][delegatee] = newAllowance; + + emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, newAllowance); + } +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol new file mode 100644 index 00000000..afe9dd8b --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +/** + * @title EIP712Base + * @author Aave + * @notice Base contract implementation of EIP712. + */ +abstract contract EIP712Base { + bytes public constant EIP712_REVISION = bytes('1'); + bytes32 internal constant EIP712_DOMAIN = + keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); + + // Map of address nonces (address => nonce) + mapping(address => uint256) internal _nonces; + + bytes32 internal _domainSeparator; + uint256 internal immutable _chainId; + + /** + * @dev Constructor. + */ + constructor() { + _chainId = block.chainid; + } + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { + if (block.chainid == _chainId) { + return _domainSeparator; + } + return _calculateDomainSeparator(); + } + + /** + * @notice Returns the nonce value for address specified as parameter + * @param owner The address for which the nonce is being returned + * @return The nonce value for the input address` + */ + function nonces(address owner) public view virtual returns (uint256) { + return _nonces[owner]; + } + + /** + * @notice Compute the current domain separator + * @return The domain separator for the token + */ + function _calculateDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + EIP712_DOMAIN, + keccak256(bytes(_EIP712BaseId())), + keccak256(EIP712_REVISION), + block.chainid, + address(this) + ) + ); + } + + /** + * @notice Returns the user readable name of signing domain (e.g. token name) + * @return The name of the signing domain + */ + function _EIP712BaseId() internal view virtual returns (string memory); +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..08a219e0 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,235 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. StableDebtTokens use + * this field to store the user's stable rate. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor(IPool pool, string memory name, string memory symbol, uint8 decimals) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name; + _symbol = symbol; + _decimals = decimals; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol new file mode 100644 index 00000000..6d2120e3 --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IncentivizedERC20} from './IncentivizedERC20.sol'; + +/** + * @title MintableIncentivizedERC20 + * @author Aave + * @notice Implements mint and burn functions for IncentivizedERC20 + */ +abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) IncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /** + * @notice Mints tokens to an account and apply incentives if defined + * @param account The address receiving tokens + * @param amount The amount of tokens to mint + */ + function _mint(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply + amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } + + /** + * @notice Burns tokens from an account and apply incentives if defined + * @param account The account whose tokens are burnt + * @param amount The amount of tokens to burn + */ + function _burn(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply - amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance - amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } +} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol new file mode 100644 index 00000000..d0010e5f --- /dev/null +++ b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {MintableIncentivizedERC20} from './MintableIncentivizedERC20.sol'; + +/** + * @title ScaledBalanceTokenBase + * @author Aave + * @notice Basic ERC20 implementation of scaled balance token + */ +abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) MintableIncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /// @inheritdoc IScaledBalanceToken + function scaledBalanceOf(address user) external view override returns (uint256) { + return super.balanceOf(user); + } + + /// @inheritdoc IScaledBalanceToken + function getScaledUserBalanceAndSupply( + address user + ) external view override returns (uint256, uint256) { + return (super.balanceOf(user), super.totalSupply()); + } + + /// @inheritdoc IScaledBalanceToken + function scaledTotalSupply() public view virtual override returns (uint256) { + return super.totalSupply(); + } + + /// @inheritdoc IScaledBalanceToken + function getPreviousIndex(address user) external view virtual override returns (uint256) { + return _userState[user].additionalData; + } + + /** + * @notice Implements the basic logic to mint a scaled balance token. + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the scaled tokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function _mintScaled( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) internal returns (bool) { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); + + uint256 scaledBalance = super.balanceOf(onBehalfOf); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[onBehalfOf].additionalData); + + _userState[onBehalfOf].additionalData = index.toUint128(); + + _mint(onBehalfOf, amountScaled.toUint128()); + + uint256 amountToMint = amount + balanceIncrease; + emit Transfer(address(0), onBehalfOf, amountToMint); + emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); + + return (scaledBalance == 0); + } + + /** + * @notice Implements the basic logic to burn a scaled balance token. + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param user The user which debt is burnt + * @param target The address that will receive the underlying, if any + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + */ + function _burnScaled(address user, address target, uint256 amount, uint256 index) internal { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); + + uint256 scaledBalance = super.balanceOf(user); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[user].additionalData); + + _userState[user].additionalData = index.toUint128(); + + _burn(user, amountScaled.toUint128()); + + if (balanceIncrease > amount) { + uint256 amountToMint = balanceIncrease - amount; + emit Transfer(address(0), user, amountToMint); + emit Mint(user, user, amountToMint, balanceIncrease, index); + } else { + uint256 amountToBurn = amount - balanceIncrease; + emit Transfer(user, address(0), amountToBurn); + emit Burn(user, target, amountToBurn, balanceIncrease, index); + } + } + + /** + * @notice Implements the basic logic to transfer scaled balance tokens between two users + * @dev It emits a mint event with the interest accrued per user + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + * @param index The next liquidity index of the reserve + */ + function _transfer(address sender, address recipient, uint256 amount, uint256 index) internal { + uint256 senderScaledBalance = super.balanceOf(sender); + uint256 senderBalanceIncrease = senderScaledBalance.rayMul(index) - + senderScaledBalance.rayMul(_userState[sender].additionalData); + + uint256 recipientScaledBalance = super.balanceOf(recipient); + uint256 recipientBalanceIncrease = recipientScaledBalance.rayMul(index) - + recipientScaledBalance.rayMul(_userState[recipient].additionalData); + + _userState[sender].additionalData = index.toUint128(); + _userState[recipient].additionalData = index.toUint128(); + + super._transfer(sender, recipient, amount.rayDiv(index).toUint128()); + + if (senderBalanceIncrease > 0) { + emit Transfer(address(0), sender, senderBalanceIncrease); + emit Mint(_msgSender(), sender, senderBalanceIncrease, senderBalanceIncrease, index); + } + + if (sender != recipient && recipientBalanceIncrease > 0) { + emit Transfer(address(0), recipient, recipientBalanceIncrease); + emit Mint(_msgSender(), recipient, recipientBalanceIncrease, recipientBalanceIncrease, index); + } + + emit Transfer(sender, recipient, amount); + } +} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER.sol b/downloads/ARBITRUM/EMISSION_MANAGER.sol new file mode 100644 index 00000000..be75e57e --- /dev/null +++ b/downloads/ARBITRUM/EMISSION_MANAGER.sol @@ -0,0 +1,791 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity =0.8.10; + +// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} + +// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol + +/** + * @title IRewardsDistributor + * @author Aave + * @notice Defines the basic interface for a Rewards Distributor. + */ +interface IRewardsDistributor { + /** + * @dev Emitted when the configuration of the rewards of an asset is updated. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param oldEmission The old emissions per second value of the reward distribution + * @param newEmission The new emissions per second value of the reward distribution + * @param oldDistributionEnd The old end timestamp of the reward distribution + * @param newDistributionEnd The new end timestamp of the reward distribution + * @param assetIndex The index of the asset distribution + */ + event AssetConfigUpdated( + address indexed asset, + address indexed reward, + uint256 oldEmission, + uint256 newEmission, + uint256 oldDistributionEnd, + uint256 newDistributionEnd, + uint256 assetIndex + ); + + /** + * @dev Emitted when rewards of an asset are accrued on behalf of a user. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param user The address of the user that rewards are accrued on behalf of + * @param assetIndex The index of the asset distribution + * @param userIndex The index of the asset distribution on behalf of the user + * @param rewardsAccrued The amount of rewards accrued + */ + event Accrued( + address indexed asset, + address indexed reward, + address indexed user, + uint256 assetIndex, + uint256 userIndex, + uint256 rewardsAccrued + ); + + /** + * @dev Emitted when the emission manager address is updated. + * @param oldEmissionManager The address of the old emission manager + * @param newEmissionManager The address of the new emission manager + */ + event EmissionManagerUpdated( + address indexed oldEmissionManager, + address indexed newEmissionManager + ); + + /** + * @dev Sets the end date for the distribution + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Gets the end date for the distribution + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The timestamp with the end of the distribution, in unix time format + **/ + function getDistributionEnd(address asset, address reward) external view returns (uint256); + + /** + * @dev Returns the index of a user on a reward distribution + * @param user Address of the user + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The current user asset index, not including new distributions + **/ + function getUserAssetIndex( + address user, + address asset, + address reward + ) external view returns (uint256); + + /** + * @dev Returns the configuration of the distribution reward for a certain asset + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The index of the asset distribution + * @return The emission per second of the reward distribution + * @return The timestamp of the last update of the index + * @return The timestamp of the distribution end + **/ + function getRewardsData( + address asset, + address reward + ) external view returns (uint256, uint256, uint256, uint256); + + /** + * @dev Returns the list of available reward token addresses of an incentivized asset + * @param asset The incentivized asset + * @return List of rewards addresses of the input asset + **/ + function getRewardsByAsset(address asset) external view returns (address[] memory); + + /** + * @dev Returns the list of available reward addresses + * @return List of rewards supported in this contract + **/ + function getRewardsList() external view returns (address[] memory); + + /** + * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. + * @param user The address of the user + * @param reward The address of the reward token + * @return Unclaimed rewards, not including new distributions + **/ + function getUserAccruedRewards(address user, address reward) external view returns (uint256); + + /** + * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @param reward The address of the reward token + * @return The rewards amount + **/ + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view returns (uint256); + + /** + * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @return The list of reward addresses + * @return The list of unclaimed amount of rewards + **/ + function getAllUserRewards( + address[] calldata assets, + address user + ) external view returns (address[] memory, uint256[] memory); + + /** + * @dev Returns the decimals of an asset to calculate the distribution delta + * @param asset The address to retrieve decimals + * @return The decimals of an underlying asset + */ + function getAssetDecimals(address asset) external view returns (uint8); + + /** + * @dev Returns the address of the emission manager + * @return The address of the EmissionManager + */ + function getEmissionManager() external view returns (address); + + /** + * @dev Updates the address of the emission manager + * @param emissionManager The address of the new EmissionManager + */ + function setEmissionManager(address emissionManager) external; +} + +// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol + +interface ITransferStrategyBase { + event EmergencyWithdrawal( + address indexed caller, + address indexed token, + address indexed to, + uint256 amount + ); + + /** + * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation + * @param to Account to transfer rewards + * @param reward Address of the reward token + * @param amount Amount to transfer to the "to" address parameter + * @return Returns true bool if transfer logic succeeds + */ + function performTransfer(address to, address reward, uint256 amount) external returns (bool); + + /** + * @return Returns the address of the Incentives Controller + */ + function getIncentivesController() external view returns (address); + + /** + * @return Returns the address of the Rewards admin + */ + function getRewardsAdmin() external view returns (address); + + /** + * @dev Perform an emergency token withdrawal only callable by the Rewards admin + * @param token Address of the token to withdraw funds from this contract + * @param to Address of the recipient of the withdrawal + * @param amount Amount of the withdrawal + */ + function emergencyWithdrawal(address token, address to, uint256 amount) external; +} + +// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} + +// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol + +library RewardsDataTypes { + struct RewardsConfigInput { + uint88 emissionPerSecond; + uint256 totalSupply; + uint32 distributionEnd; + address asset; + address reward; + ITransferStrategyBase transferStrategy; + IEACAggregatorProxy rewardOracle; + } + + struct UserAssetBalance { + address asset; + uint256 userBalance; + uint256 totalSupply; + } + + struct UserData { + uint104 index; // matches reward index + uint128 accrued; + } + + struct RewardData { + uint104 index; + uint88 emissionPerSecond; + uint32 lastUpdateTimestamp; + uint32 distributionEnd; + mapping(address => UserData) usersData; + } + + struct AssetData { + mapping(address => RewardData) rewards; + mapping(uint128 => address) availableRewards; + uint128 availableRewardsCount; + uint8 decimals; + } +} + +// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol + +/** + * @title IRewardsController + * @author Aave + * @notice Defines the basic interface for a Rewards Controller. + */ +interface IRewardsController is IRewardsDistributor { + /** + * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user + * @param user The address of the user + * @param claimer The address of the claimer + */ + event ClaimerSet(address indexed user, address indexed claimer); + + /** + * @dev Emitted when rewards are claimed + * @param user The address of the user rewards has been claimed on behalf of + * @param reward The address of the token reward is claimed + * @param to The address of the receiver of the rewards + * @param claimer The address of the claimer + * @param amount The amount of rewards claimed + */ + event RewardsClaimed( + address indexed user, + address indexed reward, + address indexed to, + address claimer, + uint256 amount + ); + + /** + * @dev Emitted when a transfer strategy is installed for the reward distribution + * @param reward The address of the token reward + * @param transferStrategy The address of TransferStrategy contract + */ + event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); + + /** + * @dev Emitted when the reward oracle is updated + * @param reward The address of the token reward + * @param rewardOracle The address of oracle + */ + event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Get the price aggregator oracle address + * @param reward The address of the reward + * @return The price oracle of the reward + */ + function getRewardOracle(address reward) external view returns (address); + + /** + * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) + * @param user The address of the user + * @return The claimer address + */ + function getClaimer(address user) external view returns (address); + + /** + * @dev Returns the Transfer Strategy implementation contract address being used for a reward address + * @param reward The address of the reward + * @return The address of the TransferStrategy contract + */ + function getTransferStrategy(address reward) external view returns (address); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Called by the corresponding asset on any update that affects the rewards distribution + * @param user The address of the user + * @param userBalance The user balance of the asset + * @param totalSupply The total supply of the asset + **/ + function handleAction(address user, uint256 userBalance, uint256 totalSupply) external; + + /** + * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The + * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external returns (uint256); + + /** + * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" + **/ + function claimAllRewards( + address[] calldata assets, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must + * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsToSelf( + address[] calldata assets + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); +} + +// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IEmissionManager.sol + +/** + * @title IEmissionManager + * @author Aave + * @notice Defines the basic interface for the Emission Manager + */ +interface IEmissionManager { + /** + * @dev Emitted when the admin of a reward emission is updated. + * @param reward The address of the rewarding token + * @param oldAdmin The address of the old emission admin + * @param newAdmin The address of the new emission admin + */ + event EmissionAdminUpdated( + address indexed reward, + address indexed oldAdmin, + address indexed newAdmin + ); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @dev Only callable by the emission admin of the given rewards + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @dev Only callable by the emission admin of the given reward + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @dev Only callable by the emission admin of the given reward + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Sets the end date for the distribution + * @dev Only callable by the emission admin of the given reward + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @dev Only callable by the owner of the EmissionManager + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Updates the address of the emission manager + * @dev Only callable by the owner of the EmissionManager + * @param emissionManager The address of the new EmissionManager + */ + function setEmissionManager(address emissionManager) external; + + /** + * @dev Updates the admin of the reward emission + * @dev Only callable by the owner of the EmissionManager + * @param reward The address of the reward token + * @param admin The address of the new admin of the emission + */ + function setEmissionAdmin(address reward, address admin) external; + + /** + * @dev Updates the address of the rewards controller + * @dev Only callable by the owner of the EmissionManager + * @param controller the address of the RewardsController contract + */ + function setRewardsController(address controller) external; + + /** + * @dev Returns the rewards controller address + * @return The address of the RewardsController contract + */ + function getRewardsController() external view returns (IRewardsController); + + /** + * @dev Returns the admin of the given reward emission + * @param reward The address of the reward token + * @return The address of the emission admin + */ + function getEmissionAdmin(address reward) external view returns (address); +} + +// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/EmissionManager.sol + +/** + * @title EmissionManager + * @author Aave + * @notice It manages the list of admins of reward emissions and provides functions to control reward emissions. + */ +contract EmissionManager is Ownable, IEmissionManager { + // reward => emissionAdmin + mapping(address => address) internal _emissionAdmins; + + IRewardsController internal _rewardsController; + + /** + * @dev Only emission admin of the given reward can call functions marked by this modifier. + **/ + modifier onlyEmissionAdmin(address reward) { + require(msg.sender == _emissionAdmins[reward], 'ONLY_EMISSION_ADMIN'); + _; + } + + /** + * Constructor. + * @param controller The address of the RewardsController contract + * @param owner The address of the owner + */ + constructor(address controller, address owner) { + _rewardsController = IRewardsController(controller); + transferOwnership(owner); + } + + /// @inheritdoc IEmissionManager + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external override { + for (uint256 i = 0; i < config.length; i++) { + require(_emissionAdmins[config[i].reward] == msg.sender, 'ONLY_EMISSION_ADMIN'); + } + _rewardsController.configureAssets(config); + } + + /// @inheritdoc IEmissionManager + function setTransferStrategy( + address reward, + ITransferStrategyBase transferStrategy + ) external override onlyEmissionAdmin(reward) { + _rewardsController.setTransferStrategy(reward, transferStrategy); + } + + /// @inheritdoc IEmissionManager + function setRewardOracle( + address reward, + IEACAggregatorProxy rewardOracle + ) external override onlyEmissionAdmin(reward) { + _rewardsController.setRewardOracle(reward, rewardOracle); + } + + /// @inheritdoc IEmissionManager + function setDistributionEnd( + address asset, + address reward, + uint32 newDistributionEnd + ) external override onlyEmissionAdmin(reward) { + _rewardsController.setDistributionEnd(asset, reward, newDistributionEnd); + } + + /// @inheritdoc IEmissionManager + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external override { + for (uint256 i = 0; i < rewards.length; i++) { + require(_emissionAdmins[rewards[i]] == msg.sender, 'ONLY_EMISSION_ADMIN'); + } + _rewardsController.setEmissionPerSecond(asset, rewards, newEmissionsPerSecond); + } + + /// @inheritdoc IEmissionManager + function setClaimer(address user, address claimer) external override onlyOwner { + _rewardsController.setClaimer(user, claimer); + } + + /// @inheritdoc IEmissionManager + function setEmissionManager(address emissionManager) external override onlyOwner { + _rewardsController.setEmissionManager(emissionManager); + } + + /// @inheritdoc IEmissionManager + function setEmissionAdmin(address reward, address admin) external override onlyOwner { + address oldAdmin = _emissionAdmins[reward]; + _emissionAdmins[reward] = admin; + emit EmissionAdminUpdated(reward, oldAdmin, admin); + } + + /// @inheritdoc IEmissionManager + function setRewardsController(address controller) external override onlyOwner { + _rewardsController = IRewardsController(controller); + } + + /// @inheritdoc IEmissionManager + function getRewardsController() external view override returns (IRewardsController) { + return _rewardsController; + } + + /// @inheritdoc IEmissionManager + function getEmissionAdmin(address reward) external view override returns (address) { + return _emissionAdmins[reward]; + } +} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..445ee640 --- /dev/null +++ b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol new file mode 100644 index 00000000..020feeca --- /dev/null +++ b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.10; + +import './Context.sol'; + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol new file mode 100644 index 00000000..ddb6f137 --- /dev/null +++ b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/EmissionManager.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/EmissionManager.sol new file mode 100644 index 00000000..b02f27ac --- /dev/null +++ b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/EmissionManager.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {Ownable} from '../../../core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol'; +import {IEACAggregatorProxy} from '../misc/interfaces/IEACAggregatorProxy.sol'; +import {IEmissionManager} from './interfaces/IEmissionManager.sol'; +import {ITransferStrategyBase} from './interfaces/ITransferStrategyBase.sol'; +import {IRewardsController} from './interfaces/IRewardsController.sol'; +import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol'; + +/** + * @title EmissionManager + * @author Aave + * @notice It manages the list of admins of reward emissions and provides functions to control reward emissions. + */ +contract EmissionManager is Ownable, IEmissionManager { + // reward => emissionAdmin + mapping(address => address) internal _emissionAdmins; + + IRewardsController internal _rewardsController; + + /** + * @dev Only emission admin of the given reward can call functions marked by this modifier. + **/ + modifier onlyEmissionAdmin(address reward) { + require(msg.sender == _emissionAdmins[reward], 'ONLY_EMISSION_ADMIN'); + _; + } + + /** + * Constructor. + * @param controller The address of the RewardsController contract + * @param owner The address of the owner + */ + constructor(address controller, address owner) { + _rewardsController = IRewardsController(controller); + transferOwnership(owner); + } + + /// @inheritdoc IEmissionManager + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external override { + for (uint256 i = 0; i < config.length; i++) { + require(_emissionAdmins[config[i].reward] == msg.sender, 'ONLY_EMISSION_ADMIN'); + } + _rewardsController.configureAssets(config); + } + + /// @inheritdoc IEmissionManager + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) + external + override + onlyEmissionAdmin(reward) + { + _rewardsController.setTransferStrategy(reward, transferStrategy); + } + + /// @inheritdoc IEmissionManager + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) + external + override + onlyEmissionAdmin(reward) + { + _rewardsController.setRewardOracle(reward, rewardOracle); + } + + /// @inheritdoc IEmissionManager + function setDistributionEnd( + address asset, + address reward, + uint32 newDistributionEnd + ) external override onlyEmissionAdmin(reward) { + _rewardsController.setDistributionEnd(asset, reward, newDistributionEnd); + } + + /// @inheritdoc IEmissionManager + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external override { + for (uint256 i = 0; i < rewards.length; i++) { + require(_emissionAdmins[rewards[i]] == msg.sender, 'ONLY_EMISSION_ADMIN'); + } + _rewardsController.setEmissionPerSecond(asset, rewards, newEmissionsPerSecond); + } + + /// @inheritdoc IEmissionManager + function setClaimer(address user, address claimer) external override onlyOwner { + _rewardsController.setClaimer(user, claimer); + } + + /// @inheritdoc IEmissionManager + function setEmissionManager(address emissionManager) external override onlyOwner { + _rewardsController.setEmissionManager(emissionManager); + } + + /// @inheritdoc IEmissionManager + function setEmissionAdmin(address reward, address admin) external override onlyOwner { + address oldAdmin = _emissionAdmins[reward]; + _emissionAdmins[reward] = admin; + emit EmissionAdminUpdated(reward, oldAdmin, admin); + } + + /// @inheritdoc IEmissionManager + function setRewardsController(address controller) external override onlyOwner { + _rewardsController = IRewardsController(controller); + } + + /// @inheritdoc IEmissionManager + function getRewardsController() external view override returns (IRewardsController) { + return _rewardsController; + } + + /// @inheritdoc IEmissionManager + function getEmissionAdmin(address reward) external view override returns (address) { + return _emissionAdmins[reward]; + } +} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IEmissionManager.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IEmissionManager.sol new file mode 100644 index 00000000..b31d338f --- /dev/null +++ b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IEmissionManager.sol @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol'; +import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; +import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; +import {IRewardsController} from './IRewardsController.sol'; + +/** + * @title IEmissionManager + * @author Aave + * @notice Defines the basic interface for the Emission Manager + */ +interface IEmissionManager { + /** + * @dev Emitted when the admin of a reward emission is updated. + * @param reward The address of the rewarding token + * @param oldAdmin The address of the old emission admin + * @param newAdmin The address of the new emission admin + */ + event EmissionAdminUpdated( + address indexed reward, + address indexed oldAdmin, + address indexed newAdmin + ); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @dev Only callable by the emission admin of the given rewards + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @dev Only callable by the emission admin of the given reward + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @dev Only callable by the emission admin of the given reward + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Sets the end date for the distribution + * @dev Only callable by the emission admin of the given reward + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd( + address asset, + address reward, + uint32 newDistributionEnd + ) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @dev Only callable by the owner of the EmissionManager + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Updates the address of the emission manager + * @dev Only callable by the owner of the EmissionManager + * @param emissionManager The address of the new EmissionManager + */ + function setEmissionManager(address emissionManager) external; + + /** + * @dev Updates the admin of the reward emission + * @dev Only callable by the owner of the EmissionManager + * @param reward The address of the reward token + * @param admin The address of the new admin of the emission + */ + function setEmissionAdmin(address reward, address admin) external; + + /** + * @dev Updates the address of the rewards controller + * @dev Only callable by the owner of the EmissionManager + * @param controller the address of the RewardsController contract + */ + function setRewardsController(address controller) external; + + /** + * @dev Returns the rewards controller address + * @return The address of the RewardsController contract + */ + function getRewardsController() external view returns (IRewardsController); + + /** + * @dev Returns the admin of the given reward emission + * @param reward The address of the reward token + * @return The address of the emission admin + */ + function getEmissionAdmin(address reward) external view returns (address); +} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol new file mode 100644 index 00000000..706e3cd6 --- /dev/null +++ b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol @@ -0,0 +1,205 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {IRewardsDistributor} from './IRewardsDistributor.sol'; +import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; +import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol'; +import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; + +/** + * @title IRewardsController + * @author Aave + * @notice Defines the basic interface for a Rewards Controller. + */ +interface IRewardsController is IRewardsDistributor { + /** + * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user + * @param user The address of the user + * @param claimer The address of the claimer + */ + event ClaimerSet(address indexed user, address indexed claimer); + + /** + * @dev Emitted when rewards are claimed + * @param user The address of the user rewards has been claimed on behalf of + * @param reward The address of the token reward is claimed + * @param to The address of the receiver of the rewards + * @param claimer The address of the claimer + * @param amount The amount of rewards claimed + */ + event RewardsClaimed( + address indexed user, + address indexed reward, + address indexed to, + address claimer, + uint256 amount + ); + + /** + * @dev Emitted when a transfer strategy is installed for the reward distribution + * @param reward The address of the token reward + * @param transferStrategy The address of TransferStrategy contract + */ + event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); + + /** + * @dev Emitted when the reward oracle is updated + * @param reward The address of the token reward + * @param rewardOracle The address of oracle + */ + event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Get the price aggregator oracle address + * @param reward The address of the reward + * @return The price oracle of the reward + */ + function getRewardOracle(address reward) external view returns (address); + + /** + * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) + * @param user The address of the user + * @return The claimer address + */ + function getClaimer(address user) external view returns (address); + + /** + * @dev Returns the Transfer Strategy implementation contract address being used for a reward address + * @param reward The address of the reward + * @return The address of the TransferStrategy contract + */ + function getTransferStrategy(address reward) external view returns (address); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Called by the corresponding asset on any update that affects the rewards distribution + * @param user The address of the user + * @param userBalance The user balance of the asset + * @param totalSupply The total supply of the asset + **/ + function handleAction( + address user, + uint256 userBalance, + uint256 totalSupply + ) external; + + /** + * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The + * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external returns (uint256); + + /** + * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" + **/ + function claimAllRewards(address[] calldata assets, address to) + external + returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must + * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsToSelf(address[] calldata assets) + external + returns (address[] memory rewardsList, uint256[] memory claimedAmounts); +} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol new file mode 100644 index 00000000..431fdfe7 --- /dev/null +++ b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol @@ -0,0 +1,186 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +/** + * @title IRewardsDistributor + * @author Aave + * @notice Defines the basic interface for a Rewards Distributor. + */ +interface IRewardsDistributor { + /** + * @dev Emitted when the configuration of the rewards of an asset is updated. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param oldEmission The old emissions per second value of the reward distribution + * @param newEmission The new emissions per second value of the reward distribution + * @param oldDistributionEnd The old end timestamp of the reward distribution + * @param newDistributionEnd The new end timestamp of the reward distribution + * @param assetIndex The index of the asset distribution + */ + event AssetConfigUpdated( + address indexed asset, + address indexed reward, + uint256 oldEmission, + uint256 newEmission, + uint256 oldDistributionEnd, + uint256 newDistributionEnd, + uint256 assetIndex + ); + + /** + * @dev Emitted when rewards of an asset are accrued on behalf of a user. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param user The address of the user that rewards are accrued on behalf of + * @param assetIndex The index of the asset distribution + * @param userIndex The index of the asset distribution on behalf of the user + * @param rewardsAccrued The amount of rewards accrued + */ + event Accrued( + address indexed asset, + address indexed reward, + address indexed user, + uint256 assetIndex, + uint256 userIndex, + uint256 rewardsAccrued + ); + + /** + * @dev Emitted when the emission manager address is updated. + * @param oldEmissionManager The address of the old emission manager + * @param newEmissionManager The address of the new emission manager + */ + event EmissionManagerUpdated( + address indexed oldEmissionManager, + address indexed newEmissionManager + ); + + /** + * @dev Sets the end date for the distribution + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd( + address asset, + address reward, + uint32 newDistributionEnd + ) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Gets the end date for the distribution + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The timestamp with the end of the distribution, in unix time format + **/ + function getDistributionEnd(address asset, address reward) external view returns (uint256); + + /** + * @dev Returns the index of a user on a reward distribution + * @param user Address of the user + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The current user asset index, not including new distributions + **/ + function getUserAssetIndex( + address user, + address asset, + address reward + ) external view returns (uint256); + + /** + * @dev Returns the configuration of the distribution reward for a certain asset + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The index of the asset distribution + * @return The emission per second of the reward distribution + * @return The timestamp of the last update of the index + * @return The timestamp of the distribution end + **/ + function getRewardsData(address asset, address reward) + external + view + returns ( + uint256, + uint256, + uint256, + uint256 + ); + + /** + * @dev Returns the list of available reward token addresses of an incentivized asset + * @param asset The incentivized asset + * @return List of rewards addresses of the input asset + **/ + function getRewardsByAsset(address asset) external view returns (address[] memory); + + /** + * @dev Returns the list of available reward addresses + * @return List of rewards supported in this contract + **/ + function getRewardsList() external view returns (address[] memory); + + /** + * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. + * @param user The address of the user + * @param reward The address of the reward token + * @return Unclaimed rewards, not including new distributions + **/ + function getUserAccruedRewards(address user, address reward) external view returns (uint256); + + /** + * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @param reward The address of the reward token + * @return The rewards amount + **/ + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view returns (uint256); + + /** + * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @return The list of reward addresses + * @return The list of unclaimed amount of rewards + **/ + function getAllUserRewards(address[] calldata assets, address user) + external + view + returns (address[] memory, uint256[] memory); + + /** + * @dev Returns the decimals of an asset to calculate the distribution delta + * @param asset The address to retrieve decimals + * @return The decimals of an underlying asset + */ + function getAssetDecimals(address asset) external view returns (uint8); + + /** + * @dev Returns the address of the emission manager + * @return The address of the EmissionManager + */ + function getEmissionManager() external view returns (address); + + /** + * @dev Updates the address of the emission manager + * @param emissionManager The address of the new EmissionManager + */ + function setEmissionManager(address emissionManager) external; +} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol new file mode 100644 index 00000000..46d67b08 --- /dev/null +++ b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +interface ITransferStrategyBase { + event EmergencyWithdrawal( + address indexed caller, + address indexed token, + address indexed to, + uint256 amount + ); + + /** + * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation + * @param to Account to transfer rewards + * @param reward Address of the reward token + * @param amount Amount to transfer to the "to" address parameter + * @return Returns true bool if transfer logic succeeds + */ + function performTransfer( + address to, + address reward, + uint256 amount + ) external returns (bool); + + /** + * @return Returns the address of the Incentives Controller + */ + function getIncentivesController() external view returns (address); + + /** + * @return Returns the address of the Rewards admin + */ + function getRewardsAdmin() external view returns (address); + + /** + * @dev Perform an emergency token withdrawal only callable by the Rewards admin + * @param token Address of the token to withdraw funds from this contract + * @param to Address of the recipient of the withdrawal + * @param amount Amount of the withdrawal + */ + function emergencyWithdrawal( + address token, + address to, + uint256 amount + ) external; +} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol new file mode 100644 index 00000000..e8e631c1 --- /dev/null +++ b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; +import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol'; + +library RewardsDataTypes { + struct RewardsConfigInput { + uint88 emissionPerSecond; + uint256 totalSupply; + uint32 distributionEnd; + address asset; + address reward; + ITransferStrategyBase transferStrategy; + IEACAggregatorProxy rewardOracle; + } + + struct UserAssetBalance { + address asset; + uint256 userBalance; + uint256 totalSupply; + } + + struct UserData { + uint104 index; // matches reward index + uint128 accrued; + } + + struct RewardData { + uint104 index; + uint88 emissionPerSecond; + uint32 lastUpdateTimestamp; + uint32 distributionEnd; + mapping(address => UserData) usersData; + } + + struct AssetData { + mapping(address => RewardData) rewards; + mapping(uint128 => address) availableRewards; + uint128 availableRewardsCount; + uint8 decimals; + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC.sol b/downloads/ARBITRUM/EMODE_LOGIC.sol new file mode 100644 index 00000000..38363c8b --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC.sol @@ -0,0 +1,5534 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} + +// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..01e1bcaf --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol @@ -0,0 +1,833 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..e7ba8f7a --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..43987f47 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,583 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..647fc7e7 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..cd5b83c6 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..dd5c637d --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..e08a30e8 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,642 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..9adca939 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC.sol new file mode 100644 index 00000000..35feed8e --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC.sol @@ -0,0 +1,6141 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol + +/** + * @title IFlashLoanReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + */ +interface IFlashLoanReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed assets + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param assets The addresses of the flash-borrowed assets + * @param amounts The amounts of the flash-borrowed assets + * @param premiums The fee of each flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata premiums, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol + +/** + * @title IFlashLoanSimpleReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + */ +interface IFlashLoanSimpleReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed asset + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param asset The address of the flash-borrowed asset + * @param amount The amount of the flash-borrowed asset + * @param premium The fee of the flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address asset, + uint256 amount, + uint256 premium, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol + +/** + * @title BorrowLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to borrowing + */ +library BorrowLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the + * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the + * isolated debt. + * @dev Emits the `Borrow()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the borrow function + */ + function executeBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteBorrowParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ( + bool isolationModeActive, + address isolationModeCollateralAddress, + uint256 isolationModeDebtCeiling + ) = userConfig.getIsolationModeState(reservesData, reservesList); + + ValidationLogic.validateBorrow( + reservesData, + reservesList, + eModeCategories, + DataTypes.ValidateBorrowParams({ + reserveCache: reserveCache, + userConfig: userConfig, + asset: params.asset, + userAddress: params.onBehalfOf, + amount: params.amount, + interestRateMode: params.interestRateMode, + reservesCount: params.reservesCount, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory, + priceOracleSentinel: params.priceOracleSentinel, + isolationModeActive: isolationModeActive, + isolationModeCollateralAddress: isolationModeCollateralAddress, + isolationModeDebtCeiling: isolationModeDebtCeiling + }) + ); + + bool isFirstBorrowing = false; + + (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); + + if (isFirstBorrowing) { + userConfig.setBorrowing(reserve.id, true); + } + + if (isolationModeActive) { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt += (params.amount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + 0, + params.releaseUnderlying ? params.amount : 0 + ); + + if (params.releaseUnderlying) { + IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); + } + + emit Borrow( + params.asset, + params.user, + params.onBehalfOf, + params.amount, + DataTypes.InterestRateMode.VARIABLE, + reserve.currentVariableBorrowRate, + params.referralCode + ); + } + + /** + * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the + * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also + * reduces the isolated debt. + * @dev Emits the `Repay()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the repay function + * @return The actual amount being repaid + */ + function executeRepay( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteRepayParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + + uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( + params.onBehalfOf + ); + + ValidationLogic.validateRepay( + reserveCache, + params.amount, + params.interestRateMode, + params.onBehalfOf, + variableDebt + ); + + uint256 paybackAmount = variableDebt; + + // Allows a user to repay with aTokens without leaving dust from interest. + if (params.useATokens && params.amount == type(uint256).max) { + params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); + } + + if (params.amount < paybackAmount) { + paybackAmount = params.amount; + } + + reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) + .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + params.useATokens ? 0 : paybackAmount, + 0 + ); + + if (variableDebt - paybackAmount == 0) { + userConfig.setBorrowing(reserve.id, false); + } + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + reserveCache, + paybackAmount + ); + + if (params.useATokens) { + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + reserveCache.aTokenAddress, + paybackAmount, + reserveCache.nextLiquidityIndex + ); + // in case of aToken repayment the msg.sender must always repay on behalf of itself + if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + } else { + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); + IAToken(reserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.onBehalfOf, + paybackAmount + ); + } + + emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); + + return paybackAmount; + } +} + +// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol + +/** + * @title FlashLoanLogic library + * @author Aave + * @notice Implements the logic for the flash loans + */ +library FlashLoanLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + + // See `IPool` for descriptions + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + // Helper struct for internal variables used in the `executeFlashLoan` function + struct FlashLoanLocalVars { + IFlashLoanReceiver receiver; + address currentAsset; + uint256 currentAmount; + uint256[] totalPremiums; + uint256 flashloanPremiumTotal; + uint256 flashloanPremiumToProtocol; + } + + /** + * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction + * as long as the amount taken plus fee is returned or debt is opened. + * @dev For authorized flashborrowers the fee is waived + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the flashloan function + */ + function executeFlashLoan( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.FlashloanParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); + + FlashLoanLocalVars memory vars; + + vars.totalPremiums = new uint256[](params.assets.length); + + vars.receiver = IFlashLoanReceiver(params.receiverAddress); + (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower + ? (0, 0) + : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); + + for (uint256 i = 0; i < params.assets.length; i++) { + vars.currentAmount = params.amounts[i]; + vars.totalPremiums[i] = DataTypes.InterestRateMode(params.interestRateModes[i]) == + DataTypes.InterestRateMode.NONE + ? vars.currentAmount.percentMul(vars.flashloanPremiumTotal) + : 0; + + if (reservesData[params.assets[i]].configuration.getIsVirtualAccActive()) { + reservesData[params.assets[i]].virtualUnderlyingBalance -= vars.currentAmount.toUint128(); + } + + IAToken(reservesData[params.assets[i]].aTokenAddress).transferUnderlyingTo( + params.receiverAddress, + vars.currentAmount + ); + } + + require( + vars.receiver.executeOperation( + params.assets, + params.amounts, + vars.totalPremiums, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + for (uint256 i = 0; i < params.assets.length; i++) { + vars.currentAsset = params.assets[i]; + vars.currentAmount = params.amounts[i]; + + if ( + DataTypes.InterestRateMode(params.interestRateModes[i]) == DataTypes.InterestRateMode.NONE + ) { + _handleFlashLoanRepayment( + reservesData[vars.currentAsset], + DataTypes.FlashLoanRepaymentParams({ + asset: vars.currentAsset, + receiverAddress: params.receiverAddress, + amount: vars.currentAmount, + totalPremium: vars.totalPremiums[i], + flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } else { + // If the user chose to not return the funds, the system checks if there is enough collateral and + // eventually opens a debt position + BorrowLogic.executeBorrow( + reservesData, + reservesList, + eModeCategories, + userConfig, + DataTypes.ExecuteBorrowParams({ + asset: vars.currentAsset, + user: msg.sender, + onBehalfOf: params.onBehalfOf, + amount: vars.currentAmount, + interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[i]), + referralCode: params.referralCode, + releaseUnderlying: false, + reservesCount: IPool(params.pool).getReservesCount(), + oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), + userEModeCategory: IPool(params.pool).getUserEMode(params.onBehalfOf).toUint8(), + priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) + .getPriceOracleSentinel() + }) + ); + // no premium is paid when taking on the flashloan as debt + emit FlashLoan( + params.receiverAddress, + msg.sender, + vars.currentAsset, + vars.currentAmount, + DataTypes.InterestRateMode(params.interestRateModes[i]), + 0, + params.referralCode + ); + } + } + } + + /** + * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one + * transaction as long as the amount taken plus fee is returned. + * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the simple flashloan function + */ + function executeFlashLoanSimple( + DataTypes.ReserveData storage reserve, + DataTypes.FlashloanSimpleParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloanSimple(reserve, params.amount); + + IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); + uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); + + if (reserve.configuration.getIsVirtualAccActive()) { + reserve.virtualUnderlyingBalance -= params.amount.toUint128(); + } + + IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); + + require( + receiver.executeOperation( + params.asset, + params.amount, + totalPremium, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + _handleFlashLoanRepayment( + reserve, + DataTypes.FlashLoanRepaymentParams({ + asset: params.asset, + receiverAddress: params.receiverAddress, + amount: params.amount, + totalPremium: totalPremium, + flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } + + /** + * @notice Handles repayment of flashloaned assets + premium + * @dev Will pull the amount + premium from the receiver, so must have approved pool + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the repayment function + */ + function _handleFlashLoanRepayment( + DataTypes.ReserveData storage reserve, + DataTypes.FlashLoanRepaymentParams memory params + ) internal { + uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); + uint256 premiumToLP = params.totalPremium - premiumToProtocol; + uint256 amountPlusPremium = params.amount + params.totalPremium; + + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply() + + uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), + premiumToLP + ); + + reserve.accruedToTreasury += premiumToProtocol + .rayDiv(reserveCache.nextLiquidityIndex) + .toUint128(); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, amountPlusPremium, 0); + + IERC20(params.asset).safeTransferFrom( + params.receiverAddress, + reserveCache.aTokenAddress, + amountPlusPremium + ); + + IAToken(reserveCache.aTokenAddress).handleRepayment( + params.receiverAddress, + params.receiverAddress, + amountPlusPremium + ); + + emit FlashLoan( + params.receiverAddress, + msg.sender, + params.asset, + params.amount, + DataTypes.InterestRateMode.NONE, + params.totalPremium, + params.referralCode + ); + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..01e1bcaf --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol @@ -0,0 +1,833 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..e7ba8f7a --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol new file mode 100644 index 00000000..a3a55684 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; + +/** + * @title IFlashLoanReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + */ +interface IFlashLoanReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed assets + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param assets The addresses of the flash-borrowed assets + * @param amounts The amounts of the flash-borrowed assets + * @param premiums The fee of each flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata premiums, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol new file mode 100644 index 00000000..bff21ae4 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; + +/** + * @title IFlashLoanSimpleReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + */ +interface IFlashLoanSimpleReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed asset + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param asset The address of the flash-borrowed asset + * @param amount The amount of the flash-borrowed asset + * @param premium The fee of the flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address asset, + uint256 amount, + uint256 premium, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..43987f47 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,583 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol new file mode 100644 index 00000000..c4ed26ed --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {IsolationModeLogic} from './IsolationModeLogic.sol'; + +/** + * @title BorrowLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to borrowing + */ +library BorrowLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the + * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the + * isolated debt. + * @dev Emits the `Borrow()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the borrow function + */ + function executeBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteBorrowParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ( + bool isolationModeActive, + address isolationModeCollateralAddress, + uint256 isolationModeDebtCeiling + ) = userConfig.getIsolationModeState(reservesData, reservesList); + + ValidationLogic.validateBorrow( + reservesData, + reservesList, + eModeCategories, + DataTypes.ValidateBorrowParams({ + reserveCache: reserveCache, + userConfig: userConfig, + asset: params.asset, + userAddress: params.onBehalfOf, + amount: params.amount, + interestRateMode: params.interestRateMode, + reservesCount: params.reservesCount, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory, + priceOracleSentinel: params.priceOracleSentinel, + isolationModeActive: isolationModeActive, + isolationModeCollateralAddress: isolationModeCollateralAddress, + isolationModeDebtCeiling: isolationModeDebtCeiling + }) + ); + + bool isFirstBorrowing = false; + + (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); + + if (isFirstBorrowing) { + userConfig.setBorrowing(reserve.id, true); + } + + if (isolationModeActive) { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt += (params.amount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + 0, + params.releaseUnderlying ? params.amount : 0 + ); + + if (params.releaseUnderlying) { + IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); + } + + emit Borrow( + params.asset, + params.user, + params.onBehalfOf, + params.amount, + DataTypes.InterestRateMode.VARIABLE, + reserve.currentVariableBorrowRate, + params.referralCode + ); + } + + /** + * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the + * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also + * reduces the isolated debt. + * @dev Emits the `Repay()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the repay function + * @return The actual amount being repaid + */ + function executeRepay( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteRepayParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + + uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( + params.onBehalfOf + ); + + ValidationLogic.validateRepay( + reserveCache, + params.amount, + params.interestRateMode, + params.onBehalfOf, + variableDebt + ); + + uint256 paybackAmount = variableDebt; + + // Allows a user to repay with aTokens without leaving dust from interest. + if (params.useATokens && params.amount == type(uint256).max) { + params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); + } + + if (params.amount < paybackAmount) { + paybackAmount = params.amount; + } + + reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) + .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + params.useATokens ? 0 : paybackAmount, + 0 + ); + + if (variableDebt - paybackAmount == 0) { + userConfig.setBorrowing(reserve.id, false); + } + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + reserveCache, + paybackAmount + ); + + if (params.useATokens) { + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + reserveCache.aTokenAddress, + paybackAmount, + reserveCache.nextLiquidityIndex + ); + // in case of aToken repayment the msg.sender must always repay on behalf of itself + if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + } else { + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); + IAToken(reserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.onBehalfOf, + paybackAmount + ); + } + + emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); + + return paybackAmount; + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..647fc7e7 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol new file mode 100644 index 00000000..31ffb288 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol @@ -0,0 +1,277 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IFlashLoanReceiver} from '../../../misc/flashloan/interfaces/IFlashLoanReceiver.sol'; +import {IFlashLoanSimpleReceiver} from '../../../misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {BorrowLogic} from './BorrowLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title FlashLoanLogic library + * @author Aave + * @notice Implements the logic for the flash loans + */ +library FlashLoanLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + + // See `IPool` for descriptions + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + // Helper struct for internal variables used in the `executeFlashLoan` function + struct FlashLoanLocalVars { + IFlashLoanReceiver receiver; + address currentAsset; + uint256 currentAmount; + uint256[] totalPremiums; + uint256 flashloanPremiumTotal; + uint256 flashloanPremiumToProtocol; + } + + /** + * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction + * as long as the amount taken plus fee is returned or debt is opened. + * @dev For authorized flashborrowers the fee is waived + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the flashloan function + */ + function executeFlashLoan( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.FlashloanParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); + + FlashLoanLocalVars memory vars; + + vars.totalPremiums = new uint256[](params.assets.length); + + vars.receiver = IFlashLoanReceiver(params.receiverAddress); + (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower + ? (0, 0) + : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); + + for (uint256 i = 0; i < params.assets.length; i++) { + vars.currentAmount = params.amounts[i]; + vars.totalPremiums[i] = DataTypes.InterestRateMode(params.interestRateModes[i]) == + DataTypes.InterestRateMode.NONE + ? vars.currentAmount.percentMul(vars.flashloanPremiumTotal) + : 0; + + if (reservesData[params.assets[i]].configuration.getIsVirtualAccActive()) { + reservesData[params.assets[i]].virtualUnderlyingBalance -= vars.currentAmount.toUint128(); + } + + IAToken(reservesData[params.assets[i]].aTokenAddress).transferUnderlyingTo( + params.receiverAddress, + vars.currentAmount + ); + } + + require( + vars.receiver.executeOperation( + params.assets, + params.amounts, + vars.totalPremiums, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + for (uint256 i = 0; i < params.assets.length; i++) { + vars.currentAsset = params.assets[i]; + vars.currentAmount = params.amounts[i]; + + if ( + DataTypes.InterestRateMode(params.interestRateModes[i]) == DataTypes.InterestRateMode.NONE + ) { + _handleFlashLoanRepayment( + reservesData[vars.currentAsset], + DataTypes.FlashLoanRepaymentParams({ + asset: vars.currentAsset, + receiverAddress: params.receiverAddress, + amount: vars.currentAmount, + totalPremium: vars.totalPremiums[i], + flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } else { + // If the user chose to not return the funds, the system checks if there is enough collateral and + // eventually opens a debt position + BorrowLogic.executeBorrow( + reservesData, + reservesList, + eModeCategories, + userConfig, + DataTypes.ExecuteBorrowParams({ + asset: vars.currentAsset, + user: msg.sender, + onBehalfOf: params.onBehalfOf, + amount: vars.currentAmount, + interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[i]), + referralCode: params.referralCode, + releaseUnderlying: false, + reservesCount: IPool(params.pool).getReservesCount(), + oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), + userEModeCategory: IPool(params.pool).getUserEMode(params.onBehalfOf).toUint8(), + priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) + .getPriceOracleSentinel() + }) + ); + // no premium is paid when taking on the flashloan as debt + emit FlashLoan( + params.receiverAddress, + msg.sender, + vars.currentAsset, + vars.currentAmount, + DataTypes.InterestRateMode(params.interestRateModes[i]), + 0, + params.referralCode + ); + } + } + } + + /** + * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one + * transaction as long as the amount taken plus fee is returned. + * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the simple flashloan function + */ + function executeFlashLoanSimple( + DataTypes.ReserveData storage reserve, + DataTypes.FlashloanSimpleParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloanSimple(reserve, params.amount); + + IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); + uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); + + if (reserve.configuration.getIsVirtualAccActive()) { + reserve.virtualUnderlyingBalance -= params.amount.toUint128(); + } + + IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); + + require( + receiver.executeOperation( + params.asset, + params.amount, + totalPremium, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + _handleFlashLoanRepayment( + reserve, + DataTypes.FlashLoanRepaymentParams({ + asset: params.asset, + receiverAddress: params.receiverAddress, + amount: params.amount, + totalPremium: totalPremium, + flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } + + /** + * @notice Handles repayment of flashloaned assets + premium + * @dev Will pull the amount + premium from the receiver, so must have approved pool + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the repayment function + */ + function _handleFlashLoanRepayment( + DataTypes.ReserveData storage reserve, + DataTypes.FlashLoanRepaymentParams memory params + ) internal { + uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); + uint256 premiumToLP = params.totalPremium - premiumToProtocol; + uint256 amountPlusPremium = params.amount + params.totalPremium; + + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply() + + uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), + premiumToLP + ); + + reserve.accruedToTreasury += premiumToProtocol + .rayDiv(reserveCache.nextLiquidityIndex) + .toUint128(); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, amountPlusPremium, 0); + + IERC20(params.asset).safeTransferFrom( + params.receiverAddress, + reserveCache.aTokenAddress, + amountPlusPremium + ); + + IAToken(reserveCache.aTokenAddress).handleRepayment( + params.receiverAddress, + params.receiverAddress, + amountPlusPremium + ); + + emit FlashLoan( + params.receiverAddress, + msg.sender, + params.asset, + params.amount, + DataTypes.InterestRateMode.NONE, + params.totalPremium, + params.referralCode + ); + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..cd5b83c6 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol new file mode 100644 index 00000000..473840ea --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..dd5c637d --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..e08a30e8 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,642 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..9adca939 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER.sol b/downloads/ARBITRUM/L2_ENCODER.sol new file mode 100644 index 00000000..9ab49b39 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER.sol @@ -0,0 +1,1811 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity =0.8.10; + +// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + **/ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + **/ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + **/ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + **/ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + **/ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + **/ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + **/ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + **/ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + **/ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + //the current stable borrow rate. Expressed in ray + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + //stableDebtToken address + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62-63: reserved + //bit 64-79: reserve factor + //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167 liquidation protocol fee + //bit 168-175 eMode category + //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // each eMode category may or may not have a custom oracle to override the individual assets price oracles + address priceSource; + string label; + } + + enum InterestRateMode { + NONE, + STABLE, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currPrincipalStableDebt; + uint256 currAvgStableBorrowRate; + uint256 currTotalStableDebt; + uint256 nextAvgStableBorrowRate; + uint256 nextTotalStableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address stableDebtTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + uint40 stableDebtLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address addressesProvider; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 maxStableLoanPercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalStableDebt; + uint256 totalVariableDebt; + uint256 averageStableBorrowRate; + uint256 reserveFactor; + address reserve; + address aToken; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address stableDebtAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + **/ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + **/ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + **/ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + **/ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + **/ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + **/ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + **/ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on swapBorrowRateMode() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user swapping his rate mode + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + **/ + event SwapBorrowRateMode( + address indexed reserve, + address indexed user, + DataTypes.InterestRateMode interestRateMode + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + **/ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + **/ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + **/ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on rebalanceStableBorrowRate() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user for which the rebalance has been executed + **/ + event RebalanceStableBorrowRate(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt + * @param premium The fee flash borrowed + * @param referralCode The referral code used + **/ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + **/ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + **/ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + **/ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @dev Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @dev Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + **/ + function backUnbacked(address asset, uint256 amount, uint256 fee) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + **/ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + **/ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the + * corresponding debt token (StableDebtToken or VariableDebtToken) + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 stable/variable debt tokens, depending on the `interestRateMode` + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + **/ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + **/ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + **/ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @return The final amount repaid + **/ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa + * @param asset The address of the underlying asset borrowed + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + **/ + function swapBorrowRateMode(address asset, uint256 interestRateMode) external; + + /** + * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. + * - Users can be rebalanced if the following conditions are satisfied: + * 1. Usage ratio is above 95% + * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too + * much has been borrowed at a stable rate and suppliers are not earning enough + * @param asset The address of the underlying asset borrowed + * @param user The address of the user to be rebalanced + **/ + function rebalanceStableBorrowRate(address asset, address user) external; + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + **/ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + **/ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://developers.aave.com + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://developers.aave.com + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + **/ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + **/ + function initReserve( + address asset, + address aTokenAddress, + address stableDebtAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + **/ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + **/ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + **/ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + **/ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + **/ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + **/ + function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + **/ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + **/ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + **/ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new category for the eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; + + /** + * @notice Returns the data of an eMode category + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate + * @return The percentage of available liquidity to borrow, expressed in bps + */ + function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + **/ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; +} + +// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/L2Encoder.sol + +/** + * @title L2Encoder + * @author Aave + * @notice Helper contract to encode calldata, used to optimize calldata size in L2Pool for transaction cost reduction + * only indented to help generate calldata for uses/frontends. + */ +contract L2Encoder { + using SafeCast for uint256; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The address of the Pool contract + */ + constructor(IPool pool) { + POOL = pool; + } + + /** + * @notice Encodes supply parameters from standard input to compact representation of 1 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param referralCode referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @return compact representation of supply parameters + */ + function encodeSupplyParams( + address asset, + uint256 amount, + uint16 referralCode + ) external view returns (bytes32) { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount.toUint128(); + bytes32 res; + + assembly { + res := add(assetId, add(shl(16, shortenedAmount), shl(144, referralCode))) + } + return res; + } + + /** + * @notice Encodes supplyWithPermit parameters from standard input to compact representation of 3 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param referralCode referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return compact representation of supplyWithPermit parameters + * @return The R parameter of ERC712 permit sig + * @return The S parameter of ERC712 permit sig + */ + function encodeSupplyWithPermitParams( + address asset, + uint256 amount, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external view returns (bytes32, bytes32, bytes32) { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount.toUint128(); + uint32 shortenedDeadline = deadline.toUint32(); + + bytes32 res; + assembly { + res := add( + assetId, + add( + shl(16, shortenedAmount), + add(shl(144, referralCode), add(shl(160, shortenedDeadline), shl(192, permitV))) + ) + ) + } + + return (res, permitR, permitS); + } + + /** + * @notice Encodes withdraw parameters from standard input to compact representation of 1 bytes32 + * @dev Without a to parameter as the compact calls to L2Pool will use msg.sender as to + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * @return compact representation of withdraw parameters + */ + function encodeWithdrawParams(address asset, uint256 amount) external view returns (bytes32) { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); + + bytes32 res; + assembly { + res := add(assetId, shl(16, shortenedAmount)) + } + return res; + } + + /** + * @notice Encodes borrow parameters from standard input to compact representation of 1 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @return compact representation of withdraw parameters + */ + function encodeBorrowParams( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode + ) external view returns (bytes32) { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount.toUint128(); + uint8 shortenedInterestRateMode = interestRateMode.toUint8(); + bytes32 res; + assembly { + res := add( + assetId, + add( + shl(16, shortenedAmount), + add(shl(144, shortenedInterestRateMode), shl(152, referralCode)) + ) + ) + } + return res; + } + + /** + * @notice Encodes repay parameters from standard input to compact representation of 1 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `interestRateMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @return compact representation of repay parameters + */ + function encodeRepayParams( + address asset, + uint256 amount, + uint256 interestRateMode + ) public view returns (bytes32) { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); + uint8 shortenedInterestRateMode = interestRateMode.toUint8(); + + bytes32 res; + assembly { + res := add(assetId, add(shl(16, shortenedAmount), shl(144, shortenedInterestRateMode))) + } + return res; + } + + /** + * @notice Encodes repayWithPermit parameters from standard input to compact representation of 3 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return compact representation of repayWithPermit parameters + * @return The R parameter of ERC712 permit sig + * @return The S parameter of ERC712 permit sig + */ + function encodeRepayWithPermitParams( + address asset, + uint256 amount, + uint256 interestRateMode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external view returns (bytes32, bytes32, bytes32) { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); + uint8 shortenedInterestRateMode = interestRateMode.toUint8(); + uint32 shortenedDeadline = deadline.toUint32(); + + bytes32 res; + assembly { + res := add( + assetId, + add( + shl(16, shortenedAmount), + add( + shl(144, shortenedInterestRateMode), + add(shl(152, shortenedDeadline), shl(184, permitV)) + ) + ) + ) + } + return (res, permitR, permitS); + } + + /** + * @notice Encodes repay with aToken parameters from standard input to compact representation of 1 bytes32 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @return compact representation of repay with aToken parameters + */ + function encodeRepayWithATokensParams( + address asset, + uint256 amount, + uint256 interestRateMode + ) external view returns (bytes32) { + return encodeRepayParams(asset, amount, interestRateMode); + } + + /** + * @notice Encodes swap borrow rate mode parameters from standard input to compact representation of 1 bytes32 + * @param asset The address of the underlying asset borrowed + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + * @return compact representation of swap borrow rate mode parameters + */ + function encodeSwapBorrowRateMode( + address asset, + uint256 interestRateMode + ) external view returns (bytes32) { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + uint16 assetId = data.id; + uint8 shortenedInterestRateMode = interestRateMode.toUint8(); + bytes32 res; + assembly { + res := add(assetId, shl(16, shortenedInterestRateMode)) + } + return res; + } + + /** + * @notice Encodes rebalance stable borrow rate parameters from standard input to compact representation of 1 bytes32 + * @param asset The address of the underlying asset borrowed + * @param user The address of the user to be rebalanced + * @return compact representation of rebalance stable borrow rate parameters + */ + function encodeRebalanceStableBorrowRate( + address asset, + address user + ) external view returns (bytes32) { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + uint16 assetId = data.id; + + bytes32 res; + assembly { + res := add(assetId, shl(16, user)) + } + return res; + } + + /** + * @notice Encodes set user use reserve as collateral parameters from standard input to compact representation of 1 bytes32 + * @param asset The address of the underlying asset borrowed + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + * @return compact representation of set user use reserve as collateral parameters + */ + function encodeSetUserUseReserveAsCollateral( + address asset, + bool useAsCollateral + ) external view returns (bytes32) { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + uint16 assetId = data.id; + bytes32 res; + assembly { + res := add(assetId, shl(16, useAsCollateral)) + } + return res; + } + + /** + * @notice Encodes liquidation call parameters from standard input to compact representation of 2 bytes32 + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + * @return First half ot compact representation of liquidation call parameters + * @return Second half ot compact representation of liquidation call parameters + */ + function encodeLiquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external view returns (bytes32, bytes32) { + DataTypes.ReserveData memory collateralData = POOL.getReserveData(collateralAsset); + uint16 collateralAssetId = collateralData.id; + + DataTypes.ReserveData memory debtData = POOL.getReserveData(debtAsset); + uint16 debtAssetId = debtData.id; + + uint128 shortenedDebtToCover = debtToCover == type(uint256).max + ? type(uint128).max + : debtToCover.toUint128(); + + bytes32 res1; + bytes32 res2; + + assembly { + res1 := add(add(collateralAssetId, shl(16, debtAssetId)), shl(32, user)) + res2 := add(shortenedDebtToCover, shl(128, receiveAToken)) + } + return (res1, res2); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol new file mode 100644 index 00000000..496151aa --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +// Chainlink Contracts v0.8 +pragma solidity ^0.8.0; + +interface AggregatorInterface { + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt); + + event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..7c3a99d7 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity 0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer( + IERC20 token, + address to, + uint256 value + ) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom( + IERC20 token, + address from, + address to, + uint256 value + ) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol new file mode 100644 index 00000000..d7834c71 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.10; + +import './IAccessControl.sol'; +import './Context.sol'; +import './Strings.sol'; +import './ERC165.sol'; + +/** + * @dev Contract module that allows children to implement role-based access + * control mechanisms. This is a lightweight version that doesn't allow enumerating role + * members except through off-chain means by accessing the contract event logs. Some + * applications may benefit from on-chain enumerability, for those cases see + * {AccessControlEnumerable}. + * + * Roles are referred to by their `bytes32` identifier. These should be exposed + * in the external API and be unique. The best way to achieve this is by + * using `public constant` hash digests: + * + * ``` + * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); + * ``` + * + * Roles can be used to represent a set of permissions. To restrict access to a + * function call, use {hasRole}: + * + * ``` + * function foo() public { + * require(hasRole(MY_ROLE, msg.sender)); + * ... + * } + * ``` + * + * Roles can be granted and revoked dynamically via the {grantRole} and + * {revokeRole} functions. Each role has an associated admin role, and only + * accounts that have a role's admin role can call {grantRole} and {revokeRole}. + * + * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means + * that only accounts with this role will be able to grant or revoke other + * roles. More complex role relationships can be created by using + * {_setRoleAdmin}. + * + * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to + * grant and revoke this role. Extra precautions should be taken to secure + * accounts that have been granted it. + */ +abstract contract AccessControl is Context, IAccessControl, ERC165 { + struct RoleData { + mapping(address => bool) members; + bytes32 adminRole; + } + + mapping(bytes32 => RoleData) private _roles; + + bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; + + /** + * @dev Modifier that checks that an account has a specific role. Reverts + * with a standardized message including the required role. + * + * The format of the revert reason is given by the following regular expression: + * + * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ + * + * _Available since v4.1._ + */ + modifier onlyRole(bytes32 role) { + _checkRole(role, _msgSender()); + _; + } + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); + } + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) public view override returns (bool) { + return _roles[role].members[account]; + } + + /** + * @dev Revert with a standard message if `account` is missing `role`. + * + * The format of the revert reason is given by the following regular expression: + * + * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ + */ + function _checkRole(bytes32 role, address account) internal view { + if (!hasRole(role, account)) { + revert( + string( + abi.encodePacked( + 'AccessControl: account ', + Strings.toHexString(uint160(account), 20), + ' is missing role ', + Strings.toHexString(uint256(role), 32) + ) + ) + ); + } + } + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) public view override returns (bytes32) { + return _roles[role].adminRole; + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) + public + virtual + override + onlyRole(getRoleAdmin(role)) + { + _grantRole(role, account); + } + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) + public + virtual + override + onlyRole(getRoleAdmin(role)) + { + _revokeRole(role, account); + } + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) public virtual override { + require(account == _msgSender(), 'AccessControl: can only renounce roles for self'); + + _revokeRole(role, account); + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. Note that unlike {grantRole}, this function doesn't perform any + * checks on the calling account. + * + * [WARNING] + * ==== + * This function should only be called from the constructor when setting + * up the initial roles for the system. + * + * Using this function in any other way is effectively circumventing the admin + * system imposed by {AccessControl}. + * ==== + */ + function _setupRole(bytes32 role, address account) internal virtual { + _grantRole(role, account); + } + + /** + * @dev Sets `adminRole` as ``role``'s admin role. + * + * Emits a {RoleAdminChanged} event. + */ + function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { + bytes32 previousAdminRole = getRoleAdmin(role); + _roles[role].adminRole = adminRole; + emit RoleAdminChanged(role, previousAdminRole, adminRole); + } + + function _grantRole(bytes32 role, address account) private { + if (!hasRole(role, account)) { + _roles[role].members[account] = true; + emit RoleGranted(role, account, _msgSender()); + } + } + + function _revokeRole(bytes32 role, address account) private { + if (hasRole(role, account)) { + _roles[role].members[account] = false; + emit RoleRevoked(role, account, _msgSender()); + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..c6dcfda7 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // According to EIP-1052, 0x0 is the value returned for not-yet created accounts + // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned + // for accounts without code, i.e. `keccak256('')` + bytes32 codehash; + bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; + // solhint-disable-next-line no-inline-assembly + assembly { + codehash := extcodehash(account) + } + return (codehash != accountHash && codehash != 0x0); + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + // solhint-disable-next-line avoid-low-level-calls, avoid-call-value + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..445ee640 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol new file mode 100644 index 00000000..15336e7e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.10; + +import './IERC165.sol'; + +/** + * @dev Implementation of the {IERC165} interface. + * + * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check + * for the additional interface id that will be supported. For example: + * + * ```solidity + * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); + * } + * ``` + * + * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. + */ +abstract contract ERC165 is IERC165 { + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IERC165).interfaceId; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC20.sol new file mode 100644 index 00000000..e794581f --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC20.sol @@ -0,0 +1,344 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.10; + +import './Context.sol'; +import './IERC20.sol'; +import './SafeMath.sol'; +import './Address.sol'; + +/** + * @dev Implementation of the {IERC20} interface. + * + * This implementation is agnostic to the way tokens are created. This means + * that a supply mechanism has to be added in a derived contract using {_mint}. + * For a generic mechanism see {ERC20PresetMinterPauser}. + * + * TIP: For a detailed writeup see our guide + * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How + * to implement supply mechanisms]. + * + * We have followed general OpenZeppelin guidelines: functions revert instead + * of returning `false` on failure. This behavior is nonetheless conventional + * and does not conflict with the expectations of ERC20 applications. + * + * Additionally, an {Approval} event is emitted on calls to {transferFrom}. + * This allows applications to reconstruct the allowance for all accounts just + * by listening to said events. Other implementations of the EIP may not emit + * these events, as it isn't required by the specification. + * + * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} + * functions have been added to mitigate the well-known issues around setting + * allowances. See {IERC20-approve}. + */ +contract ERC20 is Context, IERC20 { + using SafeMath for uint256; + using Address for address; + + mapping(address => uint256) private _balances; + + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 private _totalSupply; + + string private _name; + string private _symbol; + uint8 private _decimals; + + /** + * @dev Sets the values for {name} and {symbol}, initializes {decimals} with + * a default value of 18. + * + * To select a different value for {decimals}, use {_setupDecimals}. + * + * All three of these values are immutable: they can only be set once during + * construction. + */ + constructor(string memory name, string memory symbol) { + _name = name; + _symbol = symbol; + _decimals = 18; + } + + /** + * @dev Returns the name of the token. + */ + function name() public view returns (string memory) { + return _name; + } + + /** + * @dev Returns the symbol of the token, usually a shorter version of the + * name. + */ + function symbol() public view returns (string memory) { + return _symbol; + } + + /** + * @dev Returns the number of decimals used to get its user representation. + * For example, if `decimals` equals `2`, a balance of `505` tokens should + * be displayed to a user as `5,05` (`505 / 10 ** 2`). + * + * Tokens usually opt for a value of 18, imitating the relationship between + * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is + * called. + * + * NOTE: This information is only used for _display_ purposes: it in + * no way affects any of the arithmetic of the contract, including + * {IERC20-balanceOf} and {IERC20-transfer}. + */ + function decimals() public view returns (uint8) { + return _decimals; + } + + /** + * @dev See {IERC20-totalSupply}. + */ + function totalSupply() public view override returns (uint256) { + return _totalSupply; + } + + /** + * @dev See {IERC20-balanceOf}. + */ + function balanceOf(address account) public view override returns (uint256) { + return _balances[account]; + } + + /** + * @dev See {IERC20-transfer}. + * + * Requirements: + * + * - `recipient` cannot be the zero address. + * - the caller must have a balance of at least `amount`. + */ + function transfer(address recipient, uint256 amount) public virtual override returns (bool) { + _transfer(_msgSender(), recipient, amount); + return true; + } + + /** + * @dev See {IERC20-allowance}. + */ + function allowance(address owner, address spender) + public + view + virtual + override + returns (uint256) + { + return _allowances[owner][spender]; + } + + /** + * @dev See {IERC20-approve}. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function approve(address spender, uint256 amount) public virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /** + * @dev See {IERC20-transferFrom}. + * + * Emits an {Approval} event indicating the updated allowance. This is not + * required by the EIP. See the note at the beginning of {ERC20}; + * + * Requirements: + * - `sender` and `recipient` cannot be the zero address. + * - `sender` must have a balance of at least `amount`. + * - the caller must have allowance for ``sender``'s tokens of at least + * `amount`. + */ + function transferFrom( + address sender, + address recipient, + uint256 amount + ) public virtual override returns (bool) { + _transfer(sender, recipient, amount); + _approve( + sender, + _msgSender(), + _allowances[sender][_msgSender()].sub(amount, 'ERC20: transfer amount exceeds allowance') + ); + return true; + } + + /** + * @dev Atomically increases the allowance granted to `spender` by the caller. + * + * This is an alternative to {approve} that can be used as a mitigation for + * problems described in {IERC20-approve}. + * + * Emits an {Approval} event indicating the updated allowance. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); + return true; + } + + /** + * @dev Atomically decreases the allowance granted to `spender` by the caller. + * + * This is an alternative to {approve} that can be used as a mitigation for + * problems described in {IERC20-approve}. + * + * Emits an {Approval} event indicating the updated allowance. + * + * Requirements: + * + * - `spender` cannot be the zero address. + * - `spender` must have allowance for the caller of at least + * `subtractedValue`. + */ + function decreaseAllowance(address spender, uint256 subtractedValue) + public + virtual + returns (bool) + { + _approve( + _msgSender(), + spender, + _allowances[_msgSender()][spender].sub( + subtractedValue, + 'ERC20: decreased allowance below zero' + ) + ); + return true; + } + + /** + * @dev Moves tokens `amount` from `sender` to `recipient`. + * + * This is internal function is equivalent to {transfer}, and can be used to + * e.g. implement automatic token fees, slashing mechanisms, etc. + * + * Emits a {Transfer} event. + * + * Requirements: + * + * - `sender` cannot be the zero address. + * - `recipient` cannot be the zero address. + * - `sender` must have a balance of at least `amount`. + */ + function _transfer( + address sender, + address recipient, + uint256 amount + ) internal virtual { + require(sender != address(0), 'ERC20: transfer from the zero address'); + require(recipient != address(0), 'ERC20: transfer to the zero address'); + + _beforeTokenTransfer(sender, recipient, amount); + + _balances[sender] = _balances[sender].sub(amount, 'ERC20: transfer amount exceeds balance'); + _balances[recipient] = _balances[recipient].add(amount); + emit Transfer(sender, recipient, amount); + } + + /** @dev Creates `amount` tokens and assigns them to `account`, increasing + * the total supply. + * + * Emits a {Transfer} event with `from` set to the zero address. + * + * Requirements + * + * - `to` cannot be the zero address. + */ + function _mint(address account, uint256 amount) internal virtual { + require(account != address(0), 'ERC20: mint to the zero address'); + + _beforeTokenTransfer(address(0), account, amount); + + _totalSupply = _totalSupply.add(amount); + _balances[account] = _balances[account].add(amount); + emit Transfer(address(0), account, amount); + } + + /** + * @dev Destroys `amount` tokens from `account`, reducing the + * total supply. + * + * Emits a {Transfer} event with `to` set to the zero address. + * + * Requirements + * + * - `account` cannot be the zero address. + * - `account` must have at least `amount` tokens. + */ + function _burn(address account, uint256 amount) internal virtual { + require(account != address(0), 'ERC20: burn from the zero address'); + + _beforeTokenTransfer(account, address(0), amount); + + _balances[account] = _balances[account].sub(amount, 'ERC20: burn amount exceeds balance'); + _totalSupply = _totalSupply.sub(amount); + emit Transfer(account, address(0), amount); + } + + /** + * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. + * + * This is internal function is equivalent to `approve`, and can be used to + * e.g. set automatic allowances for certain subsystems, etc. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `owner` cannot be the zero address. + * - `spender` cannot be the zero address. + */ + function _approve( + address owner, + address spender, + uint256 amount + ) internal virtual { + require(owner != address(0), 'ERC20: approve from the zero address'); + require(spender != address(0), 'ERC20: approve to the zero address'); + + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @dev Sets {decimals} to a value other than the default one of 18. + * + * WARNING: This function should only be called from the constructor. Most + * applications that interact with token contracts will not expect + * {decimals} to ever change, and may work incorrectly if it does. + */ + function _setupDecimals(uint8 decimals_) internal { + _decimals = decimals_; + } + + /** + * @dev Hook that is called before any transfer of tokens. This includes + * minting and burning. + * + * Calling conditions: + * + * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens + * will be to transferred to `to`. + * - when `from` is zero, `amount` tokens will be minted for `to`. + * - when `to` is zero, `amount` of ``from``'s tokens will be burned. + * - `from` and `to` are never both zero. + * + * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. + */ + function _beforeTokenTransfer( + address from, + address to, + uint256 amount + ) internal virtual {} +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..c6f35263 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol new file mode 100644 index 00000000..ce3c290e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.10; + +/** + * @dev Interface of the ERC165 standard, as defined in the + * https://eips.ethereum.org/EIPS/eip-165[EIP]. + * + * Implementers can declare support of contract interfaces, which can then be + * queried by others ({ERC165Checker}). + * + * For an implementation, see {ERC165}. + */ +interface IERC165 { + /** + * @dev Returns true if this contract implements the interface defined by + * `interfaceId`. See the corresponding + * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] + * to learn more about how these ids are created. + * + * This function call must use less than 30 000 gas. + */ + function supportsInterface(bytes4 interfaceId) external view returns (bool); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..7dc55938 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..02693059 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol new file mode 100644 index 00000000..020feeca --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.10; + +import './Context.sol'; + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..6d708093 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity 0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol new file mode 100644 index 00000000..bf5b1ee5 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +/// @title Optimized overflow and underflow safe math operations +/// @notice Contains methods for doing math operations that revert on overflow or underflow for minimal gas cost +library SafeMath { + /// @notice Returns x + y, reverts if sum overflows uint256 + /// @param x The augend + /// @param y The addend + /// @return z The sum of x and y + function add(uint256 x, uint256 y) internal pure returns (uint256 z) { + unchecked { + require((z = x + y) >= x); + } + } + + /// @notice Returns x - y, reverts if underflows + /// @param x The minuend + /// @param y The subtrahend + /// @return z The difference of x and y + function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { + unchecked { + require((z = x - y) <= x); + } + } + + /// @notice Returns x - y, reverts if underflows + /// @param x The minuend + /// @param y The subtrahend + /// @param message The error msg + /// @return z The difference of x and y + function sub( + uint256 x, + uint256 y, + string memory message + ) internal pure returns (uint256 z) { + unchecked { + require((z = x - y) <= x, message); + } + } + + /// @notice Returns x * y, reverts if overflows + /// @param x The multiplicand + /// @param y The multiplier + /// @return z The product of x and y + function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { + unchecked { + require(x == 0 || (z = x * y) / x == y); + } + } + + /// @notice Returns x / y, reverts if overflows - no specific check, solidity reverts on division by 0 + /// @param x The numerator + /// @param y The denominator + /// @return z The product of x and y + function div(uint256 x, uint256 y) internal pure returns (uint256 z) { + return x / y; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol new file mode 100644 index 00000000..bcb1ee6a --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.10; + +/** + * @dev String operations. + */ +library Strings { + bytes16 private constant _HEX_SYMBOLS = '0123456789abcdef'; + + /** + * @dev Converts a `uint256` to its ASCII `string` decimal representation. + */ + function toString(uint256 value) internal pure returns (string memory) { + // Inspired by OraclizeAPI's implementation - MIT licence + // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol + + if (value == 0) { + return '0'; + } + uint256 temp = value; + uint256 digits; + while (temp != 0) { + digits++; + temp /= 10; + } + bytes memory buffer = new bytes(digits); + while (value != 0) { + digits -= 1; + buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); + value /= 10; + } + return string(buffer); + } + + /** + * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. + */ + function toHexString(uint256 value) internal pure returns (string memory) { + if (value == 0) { + return '0x00'; + } + uint256 temp = value; + uint256 length = 0; + while (temp != 0) { + length++; + temp >>= 8; + } + return toHexString(value, length); + } + + /** + * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. + */ + function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { + bytes memory buffer = new bytes(2 * length + 2); + buffer[0] = '0'; + buffer[1] = 'x'; + for (uint256 i = 2 * length + 1; i > 1; --i) { + buffer[i] = _HEX_SYMBOLS[value & 0xf]; + value >>= 4; + } + require(value == 0, 'Strings: hex length insufficient'); + return string(buffer); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..4bab0994 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseAdminUpgradeabilityProxy.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import './UpgradeabilityProxy.sol'; + +/** + * @title BaseAdminUpgradeabilityProxy + * @dev This contract combines an upgradeability proxy with an authorization + * mechanism for administrative tasks. + * All external functions in this contract must be guarded by the + * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity + * feature proposal that would enable this to be done automatically. + */ +contract BaseAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + /** + * @dev Emitted when the administration has been transferred. + * @param previousAdmin Address of the previous admin. + * @param newAdmin Address of the new admin. + */ + event AdminChanged(address previousAdmin, address newAdmin); + + /** + * @dev Storage slot with the admin of the contract. + * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is + * validated in the constructor. + */ + bytes32 internal constant ADMIN_SLOT = + 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; + + /** + * @dev Modifier to check whether the `msg.sender` is the admin. + * If it is, it will run the function. Otherwise, it will delegate the call + * to the implementation. + */ + modifier ifAdmin() { + if (msg.sender == _admin()) { + _; + } else { + _fallback(); + } + } + + /** + * @return The address of the proxy admin. + */ + function admin() external ifAdmin returns (address) { + return _admin(); + } + + /** + * @return The address of the implementation. + */ + function implementation() external ifAdmin returns (address) { + return _implementation(); + } + + /** + * @dev Changes the admin of the proxy. + * Only the current admin can call this function. + * @param newAdmin Address to transfer proxy administration to. + */ + function changeAdmin(address newAdmin) external ifAdmin { + require(newAdmin != address(0), 'Cannot change the admin of a proxy to the zero address'); + emit AdminChanged(_admin(), newAdmin); + _setAdmin(newAdmin); + } + + /** + * @dev Upgrade the backing implementation of the proxy. + * Only the admin can call this function. + * @param newImplementation Address of the new implementation. + */ + function upgradeTo(address newImplementation) external ifAdmin { + _upgradeTo(newImplementation); + } + + /** + * @dev Upgrade the backing implementation of the proxy and call a function + * on the new implementation. + * This is useful to initialize the proxied contract. + * @param newImplementation Address of the new implementation. + * @param data Data to send as msg.data in the low level call. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + */ + function upgradeToAndCall(address newImplementation, bytes calldata data) + external + payable + ifAdmin + { + _upgradeTo(newImplementation); + (bool success, ) = newImplementation.delegatecall(data); + require(success); + } + + /** + * @return adm The admin slot. + */ + function _admin() internal view returns (address adm) { + bytes32 slot = ADMIN_SLOT; + //solium-disable-next-line + assembly { + adm := sload(slot) + } + } + + /** + * @dev Sets the address of the proxy admin. + * @param newAdmin Address of the new proxy admin. + */ + function _setAdmin(address newAdmin) internal { + bytes32 slot = ADMIN_SLOT; + //solium-disable-next-line + assembly { + sstore(slot, newAdmin) + } + } + + /** + * @dev Only fall back when the sender is not the admin. + */ + function _willFallback() internal virtual override { + require(msg.sender != _admin(), 'Cannot call fallback function from the proxy admin'); + super._willFallback(); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol new file mode 100644 index 00000000..bf52cd59 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import './Proxy.sol'; +import '../contracts/Address.sol'; + +/** + * @title BaseUpgradeabilityProxy + * @dev This contract implements a proxy that allows to change the + * implementation address to which it will delegate. + * Such a change is called an implementation upgrade. + */ +contract BaseUpgradeabilityProxy is Proxy { + /** + * @dev Emitted when the implementation is upgraded. + * @param implementation Address of the new implementation. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Storage slot with the address of the current implementation. + * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is + * validated in the constructor. + */ + bytes32 internal constant IMPLEMENTATION_SLOT = + 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + /** + * @dev Returns the current implementation. + * @return impl Address of the current implementation + */ + function _implementation() internal view override returns (address impl) { + bytes32 slot = IMPLEMENTATION_SLOT; + //solium-disable-next-line + assembly { + impl := sload(slot) + } + } + + /** + * @dev Upgrades the proxy to a new implementation. + * @param newImplementation Address of the new implementation. + */ + function _upgradeTo(address newImplementation) internal { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + } + + /** + * @dev Sets the implementation address of the proxy. + * @param newImplementation Address of the new implementation. + */ + function _setImplementation(address newImplementation) internal { + require( + Address.isContract(newImplementation), + 'Cannot set a proxy implementation to a non-contract address' + ); + + bytes32 slot = IMPLEMENTATION_SLOT; + + //solium-disable-next-line + assembly { + sstore(slot, newImplementation) + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..49ca1344 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import './BaseAdminUpgradeabilityProxy.sol'; +import './InitializableUpgradeabilityProxy.sol'; + +/** + * @title InitializableAdminUpgradeabilityProxy + * @dev Extends from BaseAdminUpgradeabilityProxy with an initializer for + * initializing the implementation, admin, and init data. + */ +contract InitializableAdminUpgradeabilityProxy is + BaseAdminUpgradeabilityProxy, + InitializableUpgradeabilityProxy +{ + /** + * Contract initializer. + * @param logic address of the initial implementation. + * @param admin Address of the proxy administrator. + * @param data Data to send as msg.data to the implementation to initialize the proxied contract. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. + */ + function initialize( + address logic, + address admin, + bytes memory data + ) public payable { + require(_implementation() == address(0)); + InitializableUpgradeabilityProxy.initialize(logic, data); + assert(ADMIN_SLOT == bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)); + _setAdmin(admin); + } + + /** + * @dev Only fall back when the sender is not the admin. + */ + function _willFallback() internal override(BaseAdminUpgradeabilityProxy, Proxy) { + BaseAdminUpgradeabilityProxy._willFallback(); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol new file mode 100644 index 00000000..5ecec083 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import './BaseUpgradeabilityProxy.sol'; + +/** + * @title InitializableUpgradeabilityProxy + * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing + * implementation and init data. + */ +contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { + /** + * @dev Contract initializer. + * @param _logic Address of the initial implementation. + * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. + */ + function initialize(address _logic, bytes memory _data) public payable { + require(_implementation() == address(0)); + assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); + _setImplementation(_logic); + if (_data.length > 0) { + (bool success, ) = _logic.delegatecall(_data); + require(success); + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol new file mode 100644 index 00000000..44b790da --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +/** + * @title Proxy + * @dev Implements delegation of calls to other contracts, with proper + * forwarding of return values and bubbling of failures. + * It defines a fallback function that delegates all calls to the address + * returned by the abstract _implementation() internal function. + */ +abstract contract Proxy { + /** + * @dev Fallback function. + * Will run if no other function in the contract matches the call data. + * Implemented entirely in `_fallback`. + */ + fallback() external payable { + _fallback(); + } + + /** + * @return The Address of the implementation. + */ + function _implementation() internal view virtual returns (address); + + /** + * @dev Delegates execution to an implementation contract. + * This is a low level function that doesn't return to its internal call site. + * It will return to the external caller whatever the implementation returns. + * @param implementation Address to delegate. + */ + function _delegate(address implementation) internal { + //solium-disable-next-line + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + /** + * @dev Function that is run as the first thing in the fallback function. + * Can be redefined in derived contracts to add functionality. + * Redefinitions must call super._willFallback(). + */ + function _willFallback() internal virtual {} + + /** + * @dev fallback implementation. + * Extracted to enable manual triggering. + */ + function _fallback() internal { + _willFallback(); + _delegate(_implementation()); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/UpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/UpgradeabilityProxy.sol new file mode 100644 index 00000000..896707a8 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/UpgradeabilityProxy.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import './BaseUpgradeabilityProxy.sol'; + +/** + * @title UpgradeabilityProxy + * @dev Extends BaseUpgradeabilityProxy with a constructor for initializing + * implementation and init data. + */ +contract UpgradeabilityProxy is BaseUpgradeabilityProxy { + /** + * @dev Contract constructor. + * @param _logic Address of the initial implementation. + * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. + */ + constructor(address _logic, bytes memory _data) payable { + assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); + _setImplementation(_logic); + if (_data.length > 0) { + (bool success, ) = _logic.delegatecall(_data); + require(success); + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol new file mode 100644 index 00000000..8176f6cf --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {PoolConfigurator} from '../protocol/pool/PoolConfigurator.sol'; +import {Ownable} from '../dependencies/openzeppelin/contracts/Ownable.sol'; + +/** + * @title ReservesSetupHelper + * @author Aave + * @notice Deployment helper to setup the assets risk parameters at PoolConfigurator in batch. + * @dev The ReservesSetupHelper is an Ownable contract, so only the deployer or future owners can call this contract. + */ +contract ReservesSetupHelper is Ownable { + struct ConfigureReserveInput { + address asset; + uint256 baseLTV; + uint256 liquidationThreshold; + uint256 liquidationBonus; + uint256 reserveFactor; + uint256 borrowCap; + uint256 supplyCap; + bool stableBorrowingEnabled; + bool borrowingEnabled; + } + + /** + * @notice External function called by the owner account to setup the assets risk parameters in batch. + * @dev The Pool or Risk admin must transfer the ownership to ReservesSetupHelper before calling this function + * @param configurator The address of PoolConfigurator contract + * @param inputParams An array of ConfigureReserveInput struct that contains the assets and their risk parameters + */ + function configureReserves( + PoolConfigurator configurator, + ConfigureReserveInput[] calldata inputParams + ) external onlyOwner { + for (uint256 i = 0; i < inputParams.length; i++) { + configurator.configureReserveAsCollateral( + inputParams[i].asset, + inputParams[i].baseLTV, + inputParams[i].liquidationThreshold, + inputParams[i].liquidationBonus + ); + + if (inputParams[i].borrowingEnabled) { + configurator.setReserveBorrowing(inputParams[i].asset, true); + + configurator.setBorrowCap(inputParams[i].asset, inputParams[i].borrowCap); + configurator.setReserveStableRateBorrowing( + inputParams[i].asset, + inputParams[i].stableBorrowingEnabled + ); + } + configurator.setSupplyCap(inputParams[i].asset, inputParams[i].supplyCap); + configurator.setReserveFactor(inputParams[i].asset, inputParams[i].reserveFactor); + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/base/FlashLoanReceiverBase.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/base/FlashLoanReceiverBase.sol new file mode 100644 index 00000000..23908982 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/base/FlashLoanReceiverBase.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IFlashLoanReceiver} from '../interfaces/IFlashLoanReceiver.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../interfaces/IPool.sol'; + +/** + * @title FlashLoanReceiverBase + * @author Aave + * @notice Base contract to develop a flashloan-receiver contract. + */ +abstract contract FlashLoanReceiverBase is IFlashLoanReceiver { + IPoolAddressesProvider public immutable override ADDRESSES_PROVIDER; + IPool public immutable override POOL; + + constructor(IPoolAddressesProvider provider) { + ADDRESSES_PROVIDER = provider; + POOL = IPool(provider.getPool()); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/interfaces/IFlashLoanReceiver.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/interfaces/IFlashLoanReceiver.sol new file mode 100644 index 00000000..132c5477 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/interfaces/IFlashLoanReceiver.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../interfaces/IPool.sol'; + +/** + * @title IFlashLoanReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + **/ +interface IFlashLoanReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed assets + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param assets The addresses of the flash-borrowed assets + * @param amounts The amounts of the flash-borrowed assets + * @param premiums The fee of each flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata premiums, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/interfaces/IFlashLoanSimpleReceiver.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/interfaces/IFlashLoanSimpleReceiver.sol new file mode 100644 index 00000000..46236f5e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/interfaces/IFlashLoanSimpleReceiver.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../interfaces/IPool.sol'; + +/** + * @title IFlashLoanSimpleReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + **/ +interface IFlashLoanSimpleReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed asset + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param asset The address of the flash-borrowed asset + * @param amount The amount of the flash-borrowed asset + * @param premium The fee of the flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address asset, + uint256 amount, + uint256 premium, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..4bb6e645 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + **/ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an admin as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..21726c8e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAToken.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + **/ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The amount being transferred + * @param index The next liquidity index of the reserve + **/ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + **/ + function burn( + address from, + address receiverOfUnderlying, + uint256 amount, + uint256 index + ) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + **/ + function transferOnLiquidation( + address from, + address to, + uint256 value + ) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param user The recipient of the underlying + * @param amount The amount getting transferred + **/ + function transferUnderlyingTo(address user, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param amount The amount getting repaid + **/ + function handleRepayment(address user, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + **/ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + **/ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + **/ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens( + address token, + address to, + uint256 amount + ) external; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..d0663cd3 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,176 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + **/ +interface IAaveIncentivesController { + /** + * @dev Emitted during `handleAction`, `claimRewards` and `claimRewardsOnBehalf` + * @param user The user that accrued rewards + * @param amount The amount of accrued rewards + */ + event RewardsAccrued(address indexed user, uint256 amount); + + event RewardsClaimed(address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted during `claimRewards` and `claimRewardsOnBehalf` + * @param user The address that accrued rewards + * @param to The address that will be receiving the rewards + * @param claimer The address that performed the claim + * @param amount The amount of rewards + */ + event RewardsClaimed( + address indexed user, + address indexed to, + address indexed claimer, + uint256 amount + ); + + /** + * @dev Emitted during `setClaimer` + * @param user The address of the user + * @param claimer The address of the claimer + */ + event ClaimerSet(address indexed user, address indexed claimer); + + /** + * @notice Returns the configuration of the distribution for a certain asset + * @param asset The address of the reference asset of the distribution + * @return The asset index + * @return The emission per second + * @return The last updated timestamp + **/ + function getAssetData(address asset) + external + view + returns ( + uint256, + uint256, + uint256 + ); + + /** + * LEGACY ************************** + * @dev Returns the configuration of the distribution for a certain asset + * @param asset The address of the reference asset of the distribution + * @return The asset index, the emission per second and the last updated timestamp + **/ + function assets(address asset) + external + view + returns ( + uint128, + uint128, + uint256 + ); + + /** + * @notice Whitelists an address to claim the rewards on behalf of another address + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @notice Returns the whitelisted claimer for a certain address (0x0 if not set) + * @param user The address of the user + * @return The claimer address + */ + function getClaimer(address user) external view returns (address); + + /** + * @notice Configure assets for a certain rewards emission + * @param assets The assets to incentivize + * @param emissionsPerSecond The emission for each asset + */ + function configureAssets(address[] calldata assets, uint256[] calldata emissionsPerSecond) + external; + + /** + * @notice Called by the corresponding asset on any update that affects the rewards distribution + * @param asset The address of the user + * @param userBalance The balance of the user of the asset in the pool + * @param totalSupply The total supply of the asset in the pool + **/ + function handleAction( + address asset, + uint256 userBalance, + uint256 totalSupply + ) external; + + /** + * @notice Returns the total of rewards of a user, already accrued + not yet accrued + * @param assets The assets to accumulate rewards for + * @param user The address of the user + * @return The rewards + **/ + function getRewardsBalance(address[] calldata assets, address user) + external + view + returns (uint256); + + /** + * @notice Claims reward for a user, on the assets of the pool, accumulating the pending rewards + * @param assets The assets to accumulate rewards for + * @param amount Amount of rewards to claim + * @param to Address that will be receiving the rewards + * @return Rewards claimed + **/ + function claimRewards( + address[] calldata assets, + uint256 amount, + address to + ) external returns (uint256); + + /** + * @notice Claims reward for a user on its behalf, on the assets of the pool, accumulating the pending rewards. + * @dev The caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The assets to accumulate rewards for + * @param amount The amount of rewards to claim + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @return The amount of rewards claimed + **/ + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to + ) external returns (uint256); + + /** + * @notice Returns the unclaimed rewards of the user + * @param user The address of the user + * @return The unclaimed user rewards + */ + function getUserUnclaimedRewards(address user) external view returns (uint256); + + /** + * @notice Returns the user index for a specific asset + * @param user The address of the user + * @param asset The asset to incentivize + * @return The user index for the asset + */ + function getUserAssetData(address user, address asset) external view returns (uint256); + + /** + * @notice for backward compatibility with previous implementation of the Incentives controller + * @return The address of the reward token + */ + function REWARD_TOKEN() external view returns (address); + + /** + * @notice for backward compatibility with previous implementation of the Incentives controller + * @return The precision used in the incentives controller + */ + function PRECISION() external view returns (uint8); + + /** + * @dev Gets the distribution end timestamp of the emissions + */ + function DISTRIBUTION_END() external view returns (uint256); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAaveOracle.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAaveOracle.sol new file mode 100644 index 00000000..0ad9b47f --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAaveOracle.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IPriceOracleGetter} from './IPriceOracleGetter.sol'; +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IAaveOracle + * @author Aave + * @notice Defines the basic interface for the Aave Oracle + */ +interface IAaveOracle is IPriceOracleGetter { + /** + * @dev Emitted after the base currency is set + * @param baseCurrency The base currency of used for price quotes + * @param baseCurrencyUnit The unit of the base currency + */ + event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); + + /** + * @dev Emitted after the price source of an asset is updated + * @param asset The address of the asset + * @param source The price source of the asset + */ + event AssetSourceUpdated(address indexed asset, address indexed source); + + /** + * @dev Emitted after the address of fallback oracle is updated + * @param fallbackOracle The address of the fallback oracle + */ + event FallbackOracleUpdated(address indexed fallbackOracle); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Sets or replaces price sources of assets + * @param assets The addresses of the assets + * @param sources The addresses of the price sources + */ + function setAssetSources(address[] calldata assets, address[] calldata sources) external; + + /** + * @notice Sets the fallback oracle + * @param fallbackOracle The address of the fallback oracle + */ + function setFallbackOracle(address fallbackOracle) external; + + /** + * @notice Returns a list of prices from a list of assets addresses + * @param assets The list of assets addresses + * @return The prices of the given assets + */ + function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); + + /** + * @notice Returns the address of the source for an asset address + * @param asset The address of the asset + * @return The address of the source + */ + function getSourceOfAsset(address asset) external view returns (address); + + /** + * @notice Returns the address of the fallback oracle + * @return The address of the fallback oracle + */ + function getFallbackOracle() external view returns (address); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/ICreditDelegationToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/ICreditDelegationToken.sol new file mode 100644 index 00000000..a06de1f8 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/ICreditDelegationToken.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title ICreditDelegationToken + * @author Aave + * @notice Defines the basic interface for a token supporting credit delegation. + **/ +interface ICreditDelegationToken { + /** + * @dev Emitted on `approveDelegation` and `borrowAllowance + * @param fromUser The address of the delegator + * @param toUser The address of the delegatee + * @param asset The address of the delegated asset + * @param amount The amount being delegated + */ + event BorrowAllowanceDelegated( + address indexed fromUser, + address indexed toUser, + address indexed asset, + uint256 amount + ); + + /** + * @notice Delegates borrowing power to a user on the specific debt token. + * Delegation will still respect the liquidation constraints (even if delegated, a + * delegatee cannot force a delegator HF to go below 1) + * @param delegatee The address receiving the delegated borrowing power + * @param amount The maximum amount being delegated. + **/ + function approveDelegation(address delegatee, uint256 amount) external; + + /** + * @notice Returns the borrow allowance of the user + * @param fromUser The user to giving allowance + * @param toUser The user to give allowance to + * @return The current allowance of `toUser` + **/ + function borrowAllowance(address fromUser, address toUser) external view returns (uint256); + + /** + * @notice Delegates borrowing power to a user on the specific debt token via ERC712 signature + * @param delegator The delegator of the credit + * @param delegatee The delegatee that can use the credit + * @param value The amount to be delegated + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v The V signature param + * @param s The S signature param + * @param r The R signature param + */ + function delegationWithSig( + address delegator, + address delegatee, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IDelegationToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IDelegationToken.sol new file mode 100644 index 00000000..288f1e55 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IDelegationToken.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title IDelegationToken + * @author Aave + * @notice Implements an interface for tokens with delegation COMP/UNI compatible + **/ +interface IDelegationToken { + /** + * @notice Delegate voting power to a delegatee + * @param delegatee The address of the delegatee + */ + function delegate(address delegatee) external; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IERC20WithPermit.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IERC20WithPermit.sol new file mode 100644 index 00000000..3c67e56e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IERC20WithPermit.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; + +/** + * @title IERC20WithPermit + * @author Aave + * @notice Interface for the permit function (EIP-2612) + **/ +interface IERC20WithPermit is IERC20 { + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..ba0ca82e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + **/ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + **/ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..740cb8c7 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + **/ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + **/ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IL2Pool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IL2Pool.sol new file mode 100644 index 00000000..27ac223e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IL2Pool.sol @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title IL2Pool + * @author Aave + * @notice Defines the basic extension interface for an L2 Aave Pool. + **/ +interface IL2Pool { + /** + * @notice Calldata efficient wrapper of the supply function on behalf of the caller + * @param args Arguments for the supply function packed in one bytes32 + * 96 bits 16 bits 128 bits 16 bits + * | 0-padding | referralCode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + */ + function supply(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the supplyWithPermit function on behalf of the caller + * @param args Arguments for the supply function packed in one bytes32 + * 56 bits 8 bits 32 bits 16 bits 128 bits 16 bits + * | 0-padding | permitV | shortenedDeadline | referralCode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @param r The R parameter of ERC712 permit sig + * @param s The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + bytes32 args, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Calldata efficient wrapper of the withdraw function, withdrawing to the caller + * @param args Arguments for the withdraw function packed in one bytes32 + * 112 bits 128 bits 16 bits + * | 0-padding | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + */ + function withdraw(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the borrow function, borrowing on behalf of the caller + * @param args Arguments for the borrow function packed in one bytes32 + * 88 bits 16 bits 8 bits 128 bits 16 bits + * | 0-padding | referralCode | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + */ + function borrow(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the repay function, repaying on behalf of the caller + * @param args Arguments for the repay function packed in one bytes32 + * 104 bits 8 bits 128 bits 16 bits + * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @return The final amount repaid + */ + function repay(bytes32 args) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the repayWithPermit function, repaying on behalf of the caller + * @param args Arguments for the repayWithPermit function packed in one bytes32 + * 64 bits 8 bits 32 bits 8 bits 128 bits 16 bits + * | 0-padding | permitV | shortenedDeadline | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @param r The R parameter of ERC712 permit sig + * @param s The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + bytes32 args, + bytes32 r, + bytes32 s + ) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the repayWithATokens function + * @param args Arguments for the repayWithATokens function packed in one bytes32 + * 104 bits 8 bits 128 bits 16 bits + * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @return The final amount repaid + */ + function repayWithATokens(bytes32 args) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the swapBorrowRateMode function + * @param args Arguments for the swapBorrowRateMode function packed in one bytes32 + * 232 bits 8 bits 16 bits + * | 0-padding | shortenedInterestRateMode | assetId | + * @dev assetId is the index of the asset in the reservesList. + */ + function swapBorrowRateMode(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the rebalanceStableBorrowRate function + * @param args Arguments for the rebalanceStableBorrowRate function packed in one bytes32 + * 80 bits 160 bits 16 bits + * | 0-padding | user address | assetId | + * @dev assetId is the index of the asset in the reservesList. + */ + function rebalanceStableBorrowRate(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the setUserUseReserveAsCollateral function + * @param args Arguments for the setUserUseReserveAsCollateral function packed in one bytes32 + * 239 bits 1 bit 16 bits + * | 0-padding | useAsCollateral | assetId | + * @dev assetId is the index of the asset in the reservesList. + */ + function setUserUseReserveAsCollateral(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the liquidationCall function + * @param args1 part of the arguments for the liquidationCall function packed in one bytes32 + * 64 bits 160 bits 16 bits 16 bits + * | 0-padding | user address | debtAssetId | collateralAssetId | + * @param args2 part of the arguments for the liquidationCall function packed in one bytes32 + * 127 bits 1 bit 128 bits + * | 0-padding | receiveAToken | shortenedDebtToCover | + * @dev the shortenedDebtToCover is cast to 256 bits at decode time, + * if type(uint128).max the value will be expanded to type(uint256).max + */ + function liquidationCall(bytes32 args1, bytes32 args2) external; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..7f64b4ab --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPool.sol @@ -0,0 +1,747 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + **/ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + **/ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + **/ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + **/ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + **/ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + **/ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + **/ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on swapBorrowRateMode() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user swapping his rate mode + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + **/ + event SwapBorrowRateMode( + address indexed reserve, + address indexed user, + DataTypes.InterestRateMode interestRateMode + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + **/ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + **/ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + **/ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on rebalanceStableBorrowRate() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user for which the rebalance has been executed + **/ + event RebalanceStableBorrowRate(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt + * @param premium The fee flash borrowed + * @param referralCode The referral code used + **/ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + **/ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + **/ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + **/ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @dev Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @dev Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + **/ + function backUnbacked( + address asset, + uint256 amount, + uint256 fee + ) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function supply( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + **/ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + **/ + function withdraw( + address asset, + uint256 amount, + address to + ) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the + * corresponding debt token (StableDebtToken or VariableDebtToken) + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 stable/variable debt tokens, depending on the `interestRateMode` + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + **/ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + **/ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + **/ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @return The final amount repaid + **/ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa + * @param asset The address of the underlying asset borrowed + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + **/ + function swapBorrowRateMode(address asset, uint256 interestRateMode) external; + + /** + * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. + * - Users can be rebalanced if the following conditions are satisfied: + * 1. Usage ratio is above 95% + * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too + * much has been borrowed at a stable rate and suppliers are not earning enough + * @param asset The address of the underlying asset borrowed + * @param user The address of the user to be rebalanced + **/ + function rebalanceStableBorrowRate(address asset, address user) external; + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + **/ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + **/ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://developers.aave.com + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://developers.aave.com + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + **/ + function getUserAccountData(address user) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + **/ + function initReserve( + address asset, + address aTokenAddress, + address stableDebtAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + **/ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + **/ + function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress) + external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + **/ + function setConfiguration(address asset, DataTypes.ReserveConfigurationMap calldata configuration) + external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + **/ + function getConfiguration(address asset) + external + view + returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + **/ + function getUserConfiguration(address user) + external + view + returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + **/ + function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + **/ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + **/ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + **/ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new category for the eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; + + /** + * @notice Returns the data of an eMode category + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate + * @return The percentage of available liquidity to borrow, expressed in bps + */ + function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + **/ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens( + address token, + address to, + uint256 amount + ) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function deposit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..01a126bd --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + **/ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + **/ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + **/ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + **/ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + **/ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + **/ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + **/ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + **/ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + **/ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol new file mode 100644 index 00000000..a48ff207 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title IPoolAddressesProviderRegistry + * @author Aave + * @notice Defines the basic interface for an Aave Pool Addresses Provider Registry. + **/ +interface IPoolAddressesProviderRegistry { + /** + * @dev Emitted when a new AddressesProvider is registered. + * @param addressesProvider The address of the registered PoolAddressesProvider + * @param id The id of the registered PoolAddressesProvider + */ + event AddressesProviderRegistered(address indexed addressesProvider, uint256 indexed id); + + /** + * @dev Emitted when an AddressesProvider is unregistered. + * @param addressesProvider The address of the unregistered PoolAddressesProvider + * @param id The id of the unregistered PoolAddressesProvider + */ + event AddressesProviderUnregistered(address indexed addressesProvider, uint256 indexed id); + + /** + * @notice Returns the list of registered addresses providers + * @return The list of addresses providers + **/ + function getAddressesProvidersList() external view returns (address[] memory); + + /** + * @notice Returns the id of a registered PoolAddressesProvider + * @param addressesProvider The address of the PoolAddressesProvider + * @return The id of the PoolAddressesProvider or 0 if is not registered + */ + function getAddressesProviderIdByAddress(address addressesProvider) + external + view + returns (uint256); + + /** + * @notice Returns the address of a registered PoolAddressesProvider + * @param id The id of the market + * @return The address of the PoolAddressesProvider with the given id or zero address if it is not registered + */ + function getAddressesProviderAddressById(uint256 id) external view returns (address); + + /** + * @notice Registers an addresses provider + * @dev The PoolAddressesProvider must not already be registered in the registry + * @dev The id must not be used by an already registered PoolAddressesProvider + * @param provider The address of the new PoolAddressesProvider + * @param id The id for the new PoolAddressesProvider, referring to the market it belongs to + **/ + function registerAddressesProvider(address provider, uint256 id) external; + + /** + * @notice Removes an addresses provider from the list of registered addresses providers + * @param provider The PoolAddressesProvider address + **/ + function unregisterAddressesProvider(address provider) external; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolConfigurator.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolConfigurator.sol new file mode 100644 index 00000000..d84454a7 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolConfigurator.sol @@ -0,0 +1,468 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {ConfiguratorInputTypes} from '../protocol/libraries/types/ConfiguratorInputTypes.sol'; + +/** + * @title IPoolConfigurator + * @author Aave + * @notice Defines the basic interface for a Pool configurator. + **/ +interface IPoolConfigurator { + /** + * @dev Emitted when a reserve is initialized. + * @param asset The address of the underlying asset of the reserve + * @param aToken The address of the associated aToken contract + * @param stableDebtToken The address of the associated stable rate debt token + * @param variableDebtToken The address of the associated variable rate debt token + * @param interestRateStrategyAddress The address of the interest rate strategy for the reserve + **/ + event ReserveInitialized( + address indexed asset, + address indexed aToken, + address stableDebtToken, + address variableDebtToken, + address interestRateStrategyAddress + ); + + /** + * @dev Emitted when borrowing is enabled or disabled on a reserve. + * @param asset The address of the underlying asset of the reserve + * @param enabled True if borrowing is enabled, false otherwise + **/ + event ReserveBorrowing(address indexed asset, bool enabled); + + /** + * @dev Emitted when the collateralization risk parameters for the specified asset are updated. + * @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 + **/ + event CollateralConfigurationChanged( + address indexed asset, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus + ); + + /** + * @dev Emitted when stable rate borrowing is enabled or disabled on a reserve + * @param asset The address of the underlying asset of the reserve + * @param enabled True if stable rate borrowing is enabled, false otherwise + **/ + event ReserveStableRateBorrowing(address indexed asset, bool enabled); + + /** + * @dev Emitted when a reserve is activated or deactivated + * @param asset The address of the underlying asset of the reserve + * @param active True if reserve is active, false otherwise + **/ + event ReserveActive(address indexed asset, bool active); + + /** + * @dev Emitted when a reserve is frozen or unfrozen + * @param asset The address of the underlying asset of the reserve + * @param frozen True if reserve is frozen, false otherwise + **/ + event ReserveFrozen(address indexed asset, bool frozen); + + /** + * @dev Emitted when a reserve is paused or unpaused + * @param asset The address of the underlying asset of the reserve + * @param paused True if reserve is paused, false otherwise + **/ + event ReservePaused(address indexed asset, bool paused); + + /** + * @dev Emitted when a reserve is dropped. + * @param asset The address of the underlying asset of the reserve + **/ + event ReserveDropped(address indexed asset); + + /** + * @dev Emitted when a reserve factor is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldReserveFactor The old reserve factor, expressed in bps + * @param newReserveFactor The new reserve factor, expressed in bps + **/ + event ReserveFactorChanged( + address indexed asset, + uint256 oldReserveFactor, + uint256 newReserveFactor + ); + + /** + * @dev Emitted when the borrow cap of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldBorrowCap The old borrow cap + * @param newBorrowCap The new borrow cap + **/ + event BorrowCapChanged(address indexed asset, uint256 oldBorrowCap, uint256 newBorrowCap); + + /** + * @dev Emitted when the supply cap of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldSupplyCap The old supply cap + * @param newSupplyCap The new supply cap + **/ + event SupplyCapChanged(address indexed asset, uint256 oldSupplyCap, uint256 newSupplyCap); + + /** + * @dev Emitted when the liquidation protocol fee of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldFee The old liquidation protocol fee, expressed in bps + * @param newFee The new liquidation protocol fee, expressed in bps + **/ + event LiquidationProtocolFeeChanged(address indexed asset, uint256 oldFee, uint256 newFee); + + /** + * @dev Emitted when the unbacked mint cap of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldUnbackedMintCap The old unbacked mint cap + * @param newUnbackedMintCap The new unbacked mint cap + */ + event UnbackedMintCapChanged( + address indexed asset, + uint256 oldUnbackedMintCap, + uint256 newUnbackedMintCap + ); + + /** + * @dev Emitted when the category of an asset in eMode is changed. + * @param asset The address of the underlying asset of the reserve + * @param oldCategoryId The old eMode asset category + * @param newCategoryId The new eMode asset category + **/ + event EModeAssetCategoryChanged(address indexed asset, uint8 oldCategoryId, uint8 newCategoryId); + + /** + * @dev Emitted when a new eMode category is added. + * @param categoryId The new eMode category id + * @param ltv The ltv for the asset category in eMode + * @param liquidationThreshold The liquidationThreshold for the asset category in eMode + * @param liquidationBonus The liquidationBonus for the asset category in eMode + * @param oracle The optional address of the price oracle specific for this category + * @param label A human readable identifier for the category + **/ + event EModeCategoryAdded( + uint8 indexed categoryId, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + address oracle, + string label + ); + + /** + * @dev Emitted when a reserve interest strategy contract is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldStrategy The address of the old interest strategy contract + * @param newStrategy The address of the new interest strategy contract + **/ + event ReserveInterestRateStrategyChanged( + address indexed asset, + address oldStrategy, + address newStrategy + ); + + /** + * @dev Emitted when an aToken implementation is upgraded. + * @param asset The address of the underlying asset of the reserve + * @param proxy The aToken proxy address + * @param implementation The new aToken implementation + **/ + event ATokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @dev Emitted when the implementation of a stable debt token is upgraded. + * @param asset The address of the underlying asset of the reserve + * @param proxy The stable debt token proxy address + * @param implementation The new aToken implementation + **/ + event StableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @dev Emitted when the implementation of a variable debt token is upgraded. + * @param asset The address of the underlying asset of the reserve + * @param proxy The variable debt token proxy address + * @param implementation The new aToken implementation + **/ + event VariableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @dev Emitted when the debt ceiling of an asset is set. + * @param asset The address of the underlying asset of the reserve + * @param oldDebtCeiling The old debt ceiling + * @param newDebtCeiling The new debt ceiling + **/ + event DebtCeilingChanged(address indexed asset, uint256 oldDebtCeiling, uint256 newDebtCeiling); + + /** + * @dev Emitted when the the siloed borrowing state for an asset is changed. + * @param asset The address of the underlying asset of the reserve + * @param oldState The old siloed borrowing state + * @param newState The new siloed borrowing state + **/ + event SiloedBorrowingChanged(address indexed asset, bool oldState, bool newState); + + /** + * @dev Emitted when the bridge protocol fee is updated. + * @param oldBridgeProtocolFee The old protocol fee, expressed in bps + * @param newBridgeProtocolFee The new protocol fee, expressed in bps + */ + event BridgeProtocolFeeUpdated(uint256 oldBridgeProtocolFee, uint256 newBridgeProtocolFee); + + /** + * @dev Emitted when the total premium on flashloans is updated. + * @param oldFlashloanPremiumTotal The old premium, expressed in bps + * @param newFlashloanPremiumTotal The new premium, expressed in bps + **/ + event FlashloanPremiumTotalUpdated( + uint128 oldFlashloanPremiumTotal, + uint128 newFlashloanPremiumTotal + ); + + /** + * @dev Emitted when the part of the premium that goes to protocol is updated. + * @param oldFlashloanPremiumToProtocol The old premium, expressed in bps + * @param newFlashloanPremiumToProtocol The new premium, expressed in bps + **/ + event FlashloanPremiumToProtocolUpdated( + uint128 oldFlashloanPremiumToProtocol, + uint128 newFlashloanPremiumToProtocol + ); + + /** + * @dev Emitted when the reserve is set as borrowable/non borrowable in isolation mode. + * @param asset The address of the underlying asset of the reserve + * @param borrowable True if the reserve is borrowable in isolation, false otherwise + **/ + event BorrowableInIsolationChanged(address asset, bool borrowable); + + /** + * @notice Initializes multiple reserves. + * @param input The array of initialization parameters + **/ + function initReserves(ConfiguratorInputTypes.InitReserveInput[] calldata input) external; + + /** + * @dev Updates the aToken implementation for the reserve. + * @param input The aToken update parameters + **/ + function updateAToken(ConfiguratorInputTypes.UpdateATokenInput calldata input) external; + + /** + * @notice Updates the stable debt token implementation for the reserve. + * @param input The stableDebtToken update parameters + **/ + function updateStableDebtToken(ConfiguratorInputTypes.UpdateDebtTokenInput calldata input) + external; + + /** + * @notice Updates the variable debt token implementation for the asset. + * @param input The variableDebtToken update parameters + **/ + function updateVariableDebtToken(ConfiguratorInputTypes.UpdateDebtTokenInput calldata input) + external; + + /** + * @notice Configures borrowing on a reserve. + * @dev Can only be disabled (set to false) if stable borrowing is disabled + * @param asset The address of the underlying asset of the reserve + * @param enabled True if borrowing needs to be enabled, false otherwise + **/ + function setReserveBorrowing(address asset, bool enabled) external; + + /** + * @notice Configures the reserve collateralization parameters. + * @dev All the values are expressed in bps. A value of 10000, results in 100.00% + * @dev The `liquidationBonus` is always above 100%. A value of 105% means the liquidator will receive a 5% bonus + * @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 + **/ + function configureReserveAsCollateral( + address asset, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus + ) external; + + /** + * @notice Enable or disable stable rate borrowing on a reserve. + * @dev Can only be enabled (set to true) if borrowing is enabled + * @param asset The address of the underlying asset of the reserve + * @param enabled True if stable rate borrowing needs to be enabled, false otherwise + **/ + function setReserveStableRateBorrowing(address asset, bool enabled) external; + + /** + * @notice Activate or deactivate a reserve + * @param asset The address of the underlying asset of the reserve + * @param active True if the reserve needs to be active, false otherwise + **/ + function setReserveActive(address asset, bool active) external; + + /** + * @notice Freeze or unfreeze a reserve. A frozen reserve doesn't allow any new supply, borrow + * or rate swap but allows repayments, liquidations, rate rebalances and withdrawals. + * @param asset The address of the underlying asset of the reserve + * @param freeze True if the reserve needs to be frozen, false otherwise + **/ + function setReserveFreeze(address asset, bool freeze) external; + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the + * borrowed amount will be accumulated in the isolated collateral's total debt exposure + * @dev Only assets of the same family (e.g. USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations + * @param asset The address of the underlying asset of the reserve + * @param borrowable True if the asset should be borrowable in isolation, false otherwise + **/ + function setBorrowableInIsolation(address asset, bool borrowable) external; + + /** + * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, + * swap interest rate, liquidate, atoken transfers). + * @param asset The address of the underlying asset of the reserve + * @param paused True if pausing the reserve, false if unpausing + **/ + function setReservePause(address asset, bool paused) external; + + /** + * @notice Updates the reserve factor of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newReserveFactor The new reserve factor of the reserve + **/ + function setReserveFactor(address asset, uint256 newReserveFactor) external; + + /** + * @notice Sets the interest rate strategy of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newRateStrategyAddress The address of the new interest strategy contract + **/ + function setReserveInterestRateStrategyAddress(address asset, address newRateStrategyAddress) + external; + + /** + * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions + * are suspended. + * @param paused True if protocol needs to be paused, false otherwise + **/ + function setPoolPause(bool paused) external; + + /** + * @notice Updates the borrow cap of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newBorrowCap The new borrow cap of the reserve + **/ + function setBorrowCap(address asset, uint256 newBorrowCap) external; + + /** + * @notice Updates the supply cap of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newSupplyCap The new supply cap of the reserve + **/ + function setSupplyCap(address asset, uint256 newSupplyCap) external; + + /** + * @notice Updates the liquidation protocol fee of reserve. + * @param asset The address of the underlying asset of the reserve + * @param newFee The new liquidation protocol fee of the reserve, expressed in bps + **/ + function setLiquidationProtocolFee(address asset, uint256 newFee) external; + + /** + * @notice Updates the unbacked mint cap of reserve. + * @param asset The address of the underlying asset of the reserve + * @param newUnbackedMintCap The new unbacked mint cap of the reserve + **/ + function setUnbackedMintCap(address asset, uint256 newUnbackedMintCap) external; + + /** + * @notice Assign an efficiency mode (eMode) category to asset. + * @param asset The address of the underlying asset of the reserve + * @param newCategoryId The new category id of the asset + **/ + function setAssetEModeCategory(address asset, uint8 newCategoryId) external; + + /** + * @notice Adds a new efficiency mode (eMode) category. + * @dev If zero is provided as oracle address, the default asset oracles will be used to compute the overall debt and + * overcollateralization of the users using this category. + * @dev The new ltv and liquidation threshold must be greater than the base + * ltvs and liquidation thresholds of all assets within the eMode category + * @param categoryId The id of the category to be configured + * @param ltv The ltv associated with the category + * @param liquidationThreshold The liquidation threshold associated with the category + * @param liquidationBonus The liquidation bonus associated with the category + * @param oracle The oracle associated with the category + * @param label A label identifying the category + **/ + function setEModeCategory( + uint8 categoryId, + uint16 ltv, + uint16 liquidationThreshold, + uint16 liquidationBonus, + address oracle, + string calldata label + ) external; + + /** + * @notice Drops a reserve entirely. + * @param asset The address of the reserve to drop + **/ + function dropReserve(address asset) external; + + /** + * @notice Updates the bridge fee collected by the protocol reserves. + * @param newBridgeProtocolFee The part of the fee sent to the protocol treasury, expressed in bps + */ + function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external; + + /** + * @notice Updates the total flash loan premium. + * Total flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra balance + * - A part is collected by the protocol reserves + * @dev Expressed in bps + * @dev The premium is calculated on the total amount borrowed + * @param newFlashloanPremiumTotal The total flashloan premium + */ + function updateFlashloanPremiumTotal(uint128 newFlashloanPremiumTotal) external; + + /** + * @notice Updates the flash loan premium collected by protocol reserves + * @dev Expressed in bps + * @dev The premium to protocol is calculated on the total flashloan premium + * @param newFlashloanPremiumToProtocol The part of the flashloan premium sent to the protocol treasury + */ + function updateFlashloanPremiumToProtocol(uint128 newFlashloanPremiumToProtocol) external; + + /** + * @notice Sets the debt ceiling for an asset. + * @param newDebtCeiling The new debt ceiling + */ + function setDebtCeiling(address asset, uint256 newDebtCeiling) external; + + /** + * @notice Sets siloed borrowing for an asset + * @param siloed The new siloed borrowing state + */ + function setSiloedBorrowing(address asset, bool siloed) external; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolDataProvider.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolDataProvider.sol new file mode 100644 index 00000000..331653a2 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolDataProvider.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +interface IPoolDataProvider { + /** + * @notice Returns the reserve data + * @param asset The address of the underlying asset of the reserve + * @return unbacked The amount of unbacked tokens + * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted + * @return totalAToken The total supply of the aToken + * @return totalStableDebt The total stable debt of the reserve + * @return totalVariableDebt The total variable debt of the reserve + * @return liquidityRate The liquidity rate of the reserve + * @return variableBorrowRate The variable borrow rate of the reserve + * @return stableBorrowRate The stable borrow rate of the reserve + * @return averageStableBorrowRate The average stable borrow rate of the reserve + * @return liquidityIndex The liquidity index of the reserve + * @return variableBorrowIndex The variable borrow index of the reserve + * @return lastUpdateTimestamp The timestamp of the last update of the reserve + **/ + function getReserveData(address asset) + external + view + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ); + + /** + * @notice Returns the total supply of aTokens for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total supply of the aToken + **/ + function getATokenTotalSupply(address asset) external view returns (uint256); + + /** + * @notice Returns the total debt for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total debt for asset + **/ + function getTotalDebt(address asset) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..92c1c466 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + **/ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + **/ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + **/ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + **/ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..6d05bf0f --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..5c9cbdce --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author Aave + * @notice Interface for the calculation of the interest rates + */ +interface IReserveInterestRateStrategy { + /** + * @notice Returns the base variable borrow rate + * @return The base variable borrow rate, expressed in ray + **/ + function getBaseVariableBorrowRate() external view returns (uint256); + + /** + * @notice Returns the maximum variable borrow rate + * @return The maximum variable borrow rate, expressed in ray + **/ + function getMaxVariableBorrowRate() external view returns (uint256); + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in rays + * @return stableBorrowRate The stable borrow rate expressed in rays + * @return variableBorrowRate The variable borrow rate expressed in rays + **/ + function calculateInterestRates(DataTypes.CalculateInterestRatesParams memory params) + external + view + returns ( + uint256, + uint256, + uint256 + ); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..901e8751 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaledbalance token. + **/ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted scaled balance tokens + * @param value The amount being minted (user entered amount + balance increase from interest) + * @param balanceIncrease The increase in balance since the last action of the user + * @param index The next liquidity index of the reserve + **/ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after scaled balance tokens are burned + * @param from The address from which the scaled tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in balance since the last action of the user + * @param index The next liquidity index of the reserve + **/ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + **/ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + **/ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + **/ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + **/ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IStableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IStableDebtToken.sol new file mode 100644 index 00000000..ad5cdb45 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IStableDebtToken.sol @@ -0,0 +1,153 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IStableDebtToken + * @author Aave + * @notice Defines the interface for the stable debt token + * @dev It does not inherit from IERC20 to save in code size + **/ +interface IStableDebtToken is IInitializableDebtToken { + /** + * @dev Emitted when new stable debt is minted + * @param user The address of the user who triggered the minting + * @param onBehalfOf The recipient of stable debt tokens + * @param amount The amount minted (user entered amount + balance increase from interest) + * @param currentBalance The current balance of the user + * @param balanceIncrease The increase in balance since the last action of the user + * @param newRate The rate of the debt after the minting + * @param avgStableRate The next average stable rate after the minting + * @param newTotalSupply The next total supply of the stable debt token after the action + **/ + event Mint( + address indexed user, + address indexed onBehalfOf, + uint256 amount, + uint256 currentBalance, + uint256 balanceIncrease, + uint256 newRate, + uint256 avgStableRate, + uint256 newTotalSupply + ); + + /** + * @dev Emitted when new stable debt is burned + * @param from The address from which the debt will be burned + * @param amount The amount being burned (user entered amount - balance increase from interest) + * @param currentBalance The current balance of the user + * @param balanceIncrease The the increase in balance since the last action of the user + * @param avgStableRate The next average stable rate after the burning + * @param newTotalSupply The next total supply of the stable debt token after the action + **/ + event Burn( + address indexed from, + uint256 amount, + uint256 currentBalance, + uint256 balanceIncrease, + uint256 avgStableRate, + uint256 newTotalSupply + ); + + /** + * @notice Mints debt token to the `onBehalfOf` address. + * @dev The resulting rate is the weighted average between the rate of the new debt + * and the rate of the previous debt + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt tokens to mint + * @param rate The rate of the debt being minted + * @return True if it is the first borrow, false otherwise + * @return The total stable debt + * @return The average stable borrow rate + **/ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 rate + ) + external + returns ( + bool, + uint256, + uint256 + ); + + /** + * @notice Burns debt of `user` + * @dev The resulting rate is the weighted average between the rate of the new debt + * and the rate of the previous debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest the user earned + * @param from The address from which the debt will be burned + * @param amount The amount of debt tokens getting burned + * @return The total stable debt + * @return The average stable borrow rate + **/ + function burn(address from, uint256 amount) external returns (uint256, uint256); + + /** + * @notice Returns the average rate of all the stable rate loans. + * @return The average stable rate + **/ + function getAverageStableRate() external view returns (uint256); + + /** + * @notice Returns the stable rate of the user debt + * @param user The address of the user + * @return The stable rate of the user + **/ + function getUserStableRate(address user) external view returns (uint256); + + /** + * @notice Returns the timestamp of the last update of the user + * @param user The address of the user + * @return The timestamp + **/ + function getUserLastUpdated(address user) external view returns (uint40); + + /** + * @notice Returns the principal, the total supply, the average stable rate and the timestamp for the last update + * @return The principal + * @return The total supply + * @return The average stable rate + * @return The timestamp of the last update + **/ + function getSupplyData() + external + view + returns ( + uint256, + uint256, + uint256, + uint40 + ); + + /** + * @notice Returns the timestamp of the last update of the total supply + * @return The timestamp + **/ + function getTotalSupplyLastUpdated() external view returns (uint40); + + /** + * @notice Returns the total supply and the average stable rate + * @return The total supply + * @return The average rate + **/ + function getTotalSupplyAndAvgRate() external view returns (uint256, uint256); + + /** + * @notice Returns the principal debt balance of the user + * @return The debt balance of the user since the last burn/mint action + **/ + function principalBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this stableDebtToken (E.g. WETH for stableDebtWETH) + * @return The address of the underlying asset + **/ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..59facb7b --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + **/ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + **/ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + **/ + function burn( + address from, + uint256 amount, + uint256 index + ) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + **/ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/AaveOracle.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/AaveOracle.sol new file mode 100644 index 00000000..99afe286 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/AaveOracle.sol @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {AggregatorInterface} from '../dependencies/chainlink/AggregatorInterface.sol'; +import {Errors} from '../protocol/libraries/helpers/Errors.sol'; +import {IACLManager} from '../interfaces/IACLManager.sol'; +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {IPriceOracleGetter} from '../interfaces/IPriceOracleGetter.sol'; +import {IAaveOracle} from '../interfaces/IAaveOracle.sol'; + +/** + * @title AaveOracle + * @author Aave + * @notice Contract to get asset prices, manage price sources and update the fallback oracle + * - Use of Chainlink Aggregators as first source of price + * - If the returned price by a Chainlink aggregator is <= 0, the call is forwarded to a fallback oracle + * - Owned by the Aave governance + */ +contract AaveOracle is IAaveOracle { + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + // Map of asset price sources (asset => priceSource) + mapping(address => AggregatorInterface) private assetsSources; + + IPriceOracleGetter private _fallbackOracle; + address public immutable override BASE_CURRENCY; + uint256 public immutable override BASE_CURRENCY_UNIT; + + /** + * @dev Only asset listing or pool admin can call functions marked by this modifier. + **/ + modifier onlyAssetListingOrPoolAdmins() { + _onlyAssetListingOrPoolAdmins(); + _; + } + + /** + * @notice Constructor + * @param provider The address of the new PoolAddressesProvider + * @param assets The addresses of the assets + * @param sources The address of the source of each asset + * @param fallbackOracle The address of the fallback oracle to use if the data of an + * aggregator is not consistent + * @param baseCurrency The base currency used for the price quotes. If USD is used, base currency is 0x0 + * @param baseCurrencyUnit The unit of the base currency + */ + constructor( + IPoolAddressesProvider provider, + address[] memory assets, + address[] memory sources, + address fallbackOracle, + address baseCurrency, + uint256 baseCurrencyUnit + ) { + ADDRESSES_PROVIDER = provider; + _setFallbackOracle(fallbackOracle); + _setAssetsSources(assets, sources); + BASE_CURRENCY = baseCurrency; + BASE_CURRENCY_UNIT = baseCurrencyUnit; + emit BaseCurrencySet(baseCurrency, baseCurrencyUnit); + } + + /// @inheritdoc IAaveOracle + function setAssetSources(address[] calldata assets, address[] calldata sources) + external + override + onlyAssetListingOrPoolAdmins + { + _setAssetsSources(assets, sources); + } + + /// @inheritdoc IAaveOracle + function setFallbackOracle(address fallbackOracle) + external + override + onlyAssetListingOrPoolAdmins + { + _setFallbackOracle(fallbackOracle); + } + + /** + * @notice Internal function to set the sources for each asset + * @param assets The addresses of the assets + * @param sources The address of the source of each asset + */ + function _setAssetsSources(address[] memory assets, address[] memory sources) internal { + require(assets.length == sources.length, Errors.INCONSISTENT_PARAMS_LENGTH); + for (uint256 i = 0; i < assets.length; i++) { + assetsSources[assets[i]] = AggregatorInterface(sources[i]); + emit AssetSourceUpdated(assets[i], sources[i]); + } + } + + /** + * @notice Internal function to set the fallback oracle + * @param fallbackOracle The address of the fallback oracle + */ + function _setFallbackOracle(address fallbackOracle) internal { + _fallbackOracle = IPriceOracleGetter(fallbackOracle); + emit FallbackOracleUpdated(fallbackOracle); + } + + /// @inheritdoc IPriceOracleGetter + function getAssetPrice(address asset) public view override returns (uint256) { + AggregatorInterface source = assetsSources[asset]; + + if (asset == BASE_CURRENCY) { + return BASE_CURRENCY_UNIT; + } else if (address(source) == address(0)) { + return _fallbackOracle.getAssetPrice(asset); + } else { + int256 price = source.latestAnswer(); + if (price > 0) { + return uint256(price); + } else { + return _fallbackOracle.getAssetPrice(asset); + } + } + } + + /// @inheritdoc IAaveOracle + function getAssetsPrices(address[] calldata assets) + external + view + override + returns (uint256[] memory) + { + uint256[] memory prices = new uint256[](assets.length); + for (uint256 i = 0; i < assets.length; i++) { + prices[i] = getAssetPrice(assets[i]); + } + return prices; + } + + /// @inheritdoc IAaveOracle + function getSourceOfAsset(address asset) external view override returns (address) { + return address(assetsSources[asset]); + } + + /// @inheritdoc IAaveOracle + function getFallbackOracle() external view returns (address) { + return address(_fallbackOracle); + } + + function _onlyAssetListingOrPoolAdmins() internal view { + IACLManager aclManager = IACLManager(ADDRESSES_PROVIDER.getACLManager()); + require( + aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), + Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN + ); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol new file mode 100644 index 00000000..21bef5d0 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol @@ -0,0 +1,377 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; +import {WadRayMath} from '../protocol/libraries/math/WadRayMath.sol'; +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {IStableDebtToken} from '../interfaces/IStableDebtToken.sol'; +import {IVariableDebtToken} from '../interfaces/IVariableDebtToken.sol'; +import {IPool} from '../interfaces/IPool.sol'; +import {IPoolDataProvider} from '../interfaces/IPoolDataProvider.sol'; + +/** + * @title AaveProtocolDataProvider + * @author Aave + * @notice Peripheral contract to collect and pre-process information from the Pool. + */ +contract AaveProtocolDataProvider is IPoolDataProvider { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + + address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; + address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + struct TokenData { + string symbol; + address tokenAddress; + } + + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + constructor(IPoolAddressesProvider addressesProvider) { + ADDRESSES_PROVIDER = addressesProvider; + } + + /** + * @notice Returns the list of the existing reserves in the pool. + * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. + * @return The list of reserves, pairs of symbols and addresses + */ + function getAllReservesTokens() external view returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory reservesTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + if (reserves[i] == MKR) { + reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); + continue; + } + if (reserves[i] == ETH) { + reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); + continue; + } + reservesTokens[i] = TokenData({ + symbol: IERC20Detailed(reserves[i]).symbol(), + tokenAddress: reserves[i] + }); + } + return reservesTokens; + } + + /** + * @notice Returns the list of the existing ATokens in the pool. + * @return The list of ATokens, pairs of symbols and addresses + */ + function getAllATokens() external view returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory aTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveData memory reserveData = pool.getReserveData(reserves[i]); + aTokens[i] = TokenData({ + symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), + tokenAddress: reserveData.aTokenAddress + }); + } + return aTokens; + } + + /** + * @notice Returns the configuration data of the reserve + * @dev Not returning borrow and supply caps for compatibility, nor pause flag + * @param asset The address of the underlying asset of the reserve + * @return decimals The number of decimals of the reserve + * @return ltv The ltv of the reserve + * @return liquidationThreshold The liquidationThreshold of the reserve + * @return liquidationBonus The liquidationBonus of the reserve + * @return reserveFactor The reserveFactor of the reserve + * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise + * @return borrowingEnabled True if borrowing is enabled, false otherwise + * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise + * @return isActive True if it is active, false otherwise + * @return isFrozen True if it is frozen, false otherwise + **/ + function getReserveConfigurationData(address asset) + external + view + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ) + { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor, ) = configuration + .getParams(); + + (isActive, isFrozen, borrowingEnabled, stableBorrowRateEnabled, ) = configuration.getFlags(); + + usageAsCollateralEnabled = liquidationThreshold != 0; + } + + /** + * Returns the efficiency mode category of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The eMode id of the reserve + */ + function getReserveEModeCategory(address asset) external view returns (uint256) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + return configuration.getEModeCategory(); + } + + /** + * @notice Returns the caps parameters of the reserve + * @param asset The address of the underlying asset of the reserve + * @return borrowCap The borrow cap of the reserve + * @return supplyCap The supply cap of the reserve + **/ + function getReserveCaps(address asset) + external + view + returns (uint256 borrowCap, uint256 supplyCap) + { + (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); + } + + /** + * @notice Returns if the pool is paused + * @param asset The address of the underlying asset of the reserve + * @return isPaused True if the pool is paused, false otherwise + **/ + function getPaused(address asset) external view returns (bool isPaused) { + (, , , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); + } + + /** + * @notice Returns the siloed borrowing flag + * @param asset The address of the underlying asset of the reserve + * @return True if the asset is siloed for borrowing + **/ + function getSiloedBorrowing(address asset) external view returns (bool) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); + } + + /** + * @notice Returns the protocol fee on the liquidation bonus + * @param asset The address of the underlying asset of the reserve + * @return The protocol fee on liquidation + **/ + function getLiquidationProtocolFee(address asset) external view returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); + } + + /** + * @notice Returns the unbacked mint cap of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The unbacked mint cap of the reserve + **/ + function getUnbackedMintCap(address asset) external view returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); + } + + /** + * @notice Returns the debt ceiling of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The debt ceiling of the reserve + **/ + function getDebtCeiling(address asset) external view returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); + } + + /** + * @notice Returns the debt ceiling decimals + * @return The debt ceiling decimals + **/ + function getDebtCeilingDecimals() external pure returns (uint256) { + return ReserveConfiguration.DEBT_CEILING_DECIMALS; + } + + /** + * @notice Returns the reserve data + * @param asset The address of the underlying asset of the reserve + * @return unbacked The amount of unbacked tokens + * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted + * @return totalAToken The total supply of the aToken + * @return totalStableDebt The total stable debt of the reserve + * @return totalVariableDebt The total variable debt of the reserve + * @return liquidityRate The liquidity rate of the reserve + * @return variableBorrowRate The variable borrow rate of the reserve + * @return stableBorrowRate The stable borrow rate of the reserve + * @return averageStableBorrowRate The average stable borrow rate of the reserve + * @return liquidityIndex The liquidity index of the reserve + * @return variableBorrowIndex The variable borrow index of the reserve + * @return lastUpdateTimestamp The timestamp of the last update of the reserve + **/ + function getReserveData(address asset) + external + view + override + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ) + { + DataTypes.ReserveData memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + return ( + reserve.unbacked, + reserve.accruedToTreasury, + IERC20Detailed(reserve.aTokenAddress).totalSupply(), + IERC20Detailed(reserve.stableDebtTokenAddress).totalSupply(), + IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), + reserve.currentLiquidityRate, + reserve.currentVariableBorrowRate, + reserve.currentStableBorrowRate, + IStableDebtToken(reserve.stableDebtTokenAddress).getAverageStableRate(), + reserve.liquidityIndex, + reserve.variableBorrowIndex, + reserve.lastUpdateTimestamp + ); + } + + /** + * @notice Returns the total supply of aTokens for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total supply of the aToken + **/ + function getATokenTotalSupply(address asset) external view override returns (uint256) { + DataTypes.ReserveData memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.aTokenAddress).totalSupply(); + } + + /** + * @notice Returns the total debt for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total debt for asset + **/ + function getTotalDebt(address asset) external view override returns (uint256) { + DataTypes.ReserveData memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return + IERC20Detailed(reserve.stableDebtTokenAddress).totalSupply() + + IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); + } + + /** + * @notice Returns the user data in a reserve + * @param asset The address of the underlying asset of the reserve + * @param user The address of the user + * @return currentATokenBalance The current AToken balance of the user + * @return currentStableDebt The current stable debt of the user + * @return currentVariableDebt The current variable debt of the user + * @return principalStableDebt The principal stable debt of the user + * @return scaledVariableDebt The scaled variable debt of the user + * @return stableBorrowRate The stable borrow rate of the user + * @return liquidityRate The liquidity rate of the reserve + * @return stableRateLastUpdated The timestamp of the last update of the user stable rate + * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false + * otherwise + **/ + function getUserReserveData(address asset, address user) + external + view + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ) + { + DataTypes.ReserveData memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) + .getUserConfiguration(user); + + currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); + currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); + currentStableDebt = IERC20Detailed(reserve.stableDebtTokenAddress).balanceOf(user); + principalStableDebt = IStableDebtToken(reserve.stableDebtTokenAddress).principalBalanceOf(user); + scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); + liquidityRate = reserve.currentLiquidityRate; + stableBorrowRate = IStableDebtToken(reserve.stableDebtTokenAddress).getUserStableRate(user); + stableRateLastUpdated = IStableDebtToken(reserve.stableDebtTokenAddress).getUserLastUpdated( + user + ); + usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); + } + + /** + * @notice Returns the token addresses of the reserve + * @param asset The address of the underlying asset of the reserve + * @return aTokenAddress The AToken address of the reserve + * @return stableDebtTokenAddress The StableDebtToken address of the reserve + * @return variableDebtTokenAddress The VariableDebtToken address of the reserve + */ + function getReserveTokensAddresses(address asset) + external + view + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ) + { + DataTypes.ReserveData memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + return ( + reserve.aTokenAddress, + reserve.stableDebtTokenAddress, + reserve.variableDebtTokenAddress + ); + } + + /** + * @notice Returns the address of the Interest Rate strategy + * @param asset The address of the underlying asset of the reserve + * @return irStrategyAddress The address of the Interest Rate strategy + */ + function getInterestRateStrategyAddress(address asset) + external + view + returns (address irStrategyAddress) + { + DataTypes.ReserveData memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + return (reserve.interestRateStrategyAddress); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/L2Encoder.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/L2Encoder.sol new file mode 100644 index 00000000..0f73b11f --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/L2Encoder.sol @@ -0,0 +1,355 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {SafeCast} from '../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IPool} from '../interfaces/IPool.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title L2Encoder + * @author Aave + * @notice Helper contract to encode calldata, used to optimize calldata size in L2Pool for transaction cost reduction + * only indented to help generate calldata for uses/frontends. + */ +contract L2Encoder { + using SafeCast for uint256; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The address of the Pool contract + */ + constructor(IPool pool) { + POOL = pool; + } + + /** + * @notice Encodes supply parameters from standard input to compact representation of 1 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param referralCode referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @return compact representation of supply parameters + */ + function encodeSupplyParams( + address asset, + uint256 amount, + uint16 referralCode + ) external view returns (bytes32) { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount.toUint128(); + bytes32 res; + + assembly { + res := add(assetId, add(shl(16, shortenedAmount), shl(144, referralCode))) + } + return res; + } + + /** + * @notice Encodes supplyWithPermit parameters from standard input to compact representation of 3 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param referralCode referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return compact representation of supplyWithPermit parameters + * @return The R parameter of ERC712 permit sig + * @return The S parameter of ERC712 permit sig + */ + function encodeSupplyWithPermitParams( + address asset, + uint256 amount, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) + external + view + returns ( + bytes32, + bytes32, + bytes32 + ) + { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount.toUint128(); + uint32 shortenedDeadline = deadline.toUint32(); + + bytes32 res; + assembly { + res := add( + assetId, + add( + shl(16, shortenedAmount), + add(shl(144, referralCode), add(shl(160, shortenedDeadline), shl(192, permitV))) + ) + ) + } + + return (res, permitR, permitS); + } + + /** + * @notice Encodes withdraw parameters from standard input to compact representation of 1 bytes32 + * @dev Without a to parameter as the compact calls to L2Pool will use msg.sender as to + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * @return compact representation of withdraw parameters + */ + function encodeWithdrawParams(address asset, uint256 amount) external view returns (bytes32) { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); + + bytes32 res; + assembly { + res := add(assetId, shl(16, shortenedAmount)) + } + return res; + } + + /** + * @notice Encodes borrow parameters from standard input to compact representation of 1 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @return compact representation of withdraw parameters + */ + function encodeBorrowParams( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode + ) external view returns (bytes32) { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount.toUint128(); + uint8 shortenedInterestRateMode = interestRateMode.toUint8(); + bytes32 res; + assembly { + res := add( + assetId, + add( + shl(16, shortenedAmount), + add(shl(144, shortenedInterestRateMode), shl(152, referralCode)) + ) + ) + } + return res; + } + + /** + * @notice Encodes repay parameters from standard input to compact representation of 1 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `interestRateMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @return compact representation of repay parameters + */ + function encodeRepayParams( + address asset, + uint256 amount, + uint256 interestRateMode + ) public view returns (bytes32) { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); + uint8 shortenedInterestRateMode = interestRateMode.toUint8(); + + bytes32 res; + assembly { + res := add(assetId, add(shl(16, shortenedAmount), shl(144, shortenedInterestRateMode))) + } + return res; + } + + /** + * @notice Encodes repayWithPermit parameters from standard input to compact representation of 3 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return compact representation of repayWithPermit parameters + * @return The R parameter of ERC712 permit sig + * @return The S parameter of ERC712 permit sig + */ + function encodeRepayWithPermitParams( + address asset, + uint256 amount, + uint256 interestRateMode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) + external + view + returns ( + bytes32, + bytes32, + bytes32 + ) + { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); + uint8 shortenedInterestRateMode = interestRateMode.toUint8(); + uint32 shortenedDeadline = deadline.toUint32(); + + bytes32 res; + assembly { + res := add( + assetId, + add( + shl(16, shortenedAmount), + add( + shl(144, shortenedInterestRateMode), + add(shl(152, shortenedDeadline), shl(184, permitV)) + ) + ) + ) + } + return (res, permitR, permitS); + } + + /** + * @notice Encodes repay with aToken parameters from standard input to compact representation of 1 bytes32 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @return compact representation of repay with aToken parameters + */ + function encodeRepayWithATokensParams( + address asset, + uint256 amount, + uint256 interestRateMode + ) external view returns (bytes32) { + return encodeRepayParams(asset, amount, interestRateMode); + } + + /** + * @notice Encodes swap borrow rate mode parameters from standard input to compact representation of 1 bytes32 + * @param asset The address of the underlying asset borrowed + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + * @return compact representation of swap borrow rate mode parameters + */ + function encodeSwapBorrowRateMode(address asset, uint256 interestRateMode) + external + view + returns (bytes32) + { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + uint16 assetId = data.id; + uint8 shortenedInterestRateMode = interestRateMode.toUint8(); + bytes32 res; + assembly { + res := add(assetId, shl(16, shortenedInterestRateMode)) + } + return res; + } + + /** + * @notice Encodes rebalance stable borrow rate parameters from standard input to compact representation of 1 bytes32 + * @param asset The address of the underlying asset borrowed + * @param user The address of the user to be rebalanced + * @return compact representation of rebalance stable borrow rate parameters + */ + function encodeRebalanceStableBorrowRate(address asset, address user) + external + view + returns (bytes32) + { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + uint16 assetId = data.id; + + bytes32 res; + assembly { + res := add(assetId, shl(16, user)) + } + return res; + } + + /** + * @notice Encodes set user use reserve as collateral parameters from standard input to compact representation of 1 bytes32 + * @param asset The address of the underlying asset borrowed + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + * @return compact representation of set user use reserve as collateral parameters + */ + function encodeSetUserUseReserveAsCollateral(address asset, bool useAsCollateral) + external + view + returns (bytes32) + { + DataTypes.ReserveData memory data = POOL.getReserveData(asset); + uint16 assetId = data.id; + bytes32 res; + assembly { + res := add(assetId, shl(16, useAsCollateral)) + } + return res; + } + + /** + * @notice Encodes liquidation call parameters from standard input to compact representation of 2 bytes32 + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + * @return First half ot compact representation of liquidation call parameters + * @return Second half ot compact representation of liquidation call parameters + */ + function encodeLiquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external view returns (bytes32, bytes32) { + DataTypes.ReserveData memory collateralData = POOL.getReserveData(collateralAsset); + uint16 collateralAssetId = collateralData.id; + + DataTypes.ReserveData memory debtData = POOL.getReserveData(debtAsset); + uint16 debtAssetId = debtData.id; + + uint128 shortenedDebtToCover = debtToCover == type(uint256).max + ? type(uint128).max + : debtToCover.toUint128(); + + bytes32 res1; + bytes32 res2; + + assembly { + res1 := add(add(collateralAssetId, shl(16, debtAssetId)), shl(32, user)) + res2 := add(shortenedDebtToCover, shl(128, receiveAToken)) + } + return (res1, res2); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol new file mode 100644 index 00000000..7202f1a1 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {FlashLoanReceiverBase} from '../../flashloan/base/FlashLoanReceiverBase.sol'; +import {MintableERC20} from '../tokens/MintableERC20.sol'; + +contract MockFlashLoanReceiver is FlashLoanReceiverBase { + using GPv2SafeERC20 for IERC20; + + event ExecutedWithFail(address[] _assets, uint256[] _amounts, uint256[] _premiums); + event ExecutedWithSuccess(address[] _assets, uint256[] _amounts, uint256[] _premiums); + + bool internal _failExecution; + uint256 internal _amountToApprove; + bool internal _simulateEOA; + + constructor(IPoolAddressesProvider provider) FlashLoanReceiverBase(provider) {} + + function setFailExecutionTransfer(bool fail) public { + _failExecution = fail; + } + + function setAmountToApprove(uint256 amountToApprove) public { + _amountToApprove = amountToApprove; + } + + function setSimulateEOA(bool flag) public { + _simulateEOA = flag; + } + + function getAmountToApprove() public view returns (uint256) { + return _amountToApprove; + } + + function simulateEOA() public view returns (bool) { + return _simulateEOA; + } + + function executeOperation( + address[] memory assets, + uint256[] memory amounts, + uint256[] memory premiums, + address, // initiator + bytes memory // params + ) public override returns (bool) { + if (_failExecution) { + emit ExecutedWithFail(assets, amounts, premiums); + return !_simulateEOA; + } + + for (uint256 i = 0; i < assets.length; i++) { + //mint to this contract the specific amount + MintableERC20 token = MintableERC20(assets[i]); + + //check the contract has the specified balance + require( + amounts[i] <= IERC20(assets[i]).balanceOf(address(this)), + 'Invalid balance for the contract' + ); + + uint256 amountToReturn = (_amountToApprove != 0) + ? _amountToApprove + : amounts[i] + premiums[i]; + //execution does not fail - mint tokens and return them to the _destination + + token.mint(premiums[i]); + + IERC20(assets[i]).approve(address(POOL), amountToReturn); + } + + emit ExecutedWithSuccess(assets, amounts, premiums); + + return true; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol new file mode 100644 index 00000000..a20feae4 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; + +contract MockIncentivesController is IAaveIncentivesController { + function getAssetData(address) + external + pure + override + returns ( + uint256, + uint256, + uint256 + ) + { + return (0, 0, 0); + } + + function assets(address) + external + pure + override + returns ( + uint128, + uint128, + uint256 + ) + { + return (0, 0, 0); + } + + function setClaimer(address, address) external override {} + + function getClaimer(address) external pure override returns (address) { + return address(1); + } + + function configureAssets(address[] calldata, uint256[] calldata) external override {} + + function handleAction( + address, + uint256, + uint256 + ) external override {} + + function getRewardsBalance(address[] calldata, address) external pure override returns (uint256) { + return 0; + } + + function claimRewards( + address[] calldata, + uint256, + address + ) external pure override returns (uint256) { + return 0; + } + + function claimRewardsOnBehalf( + address[] calldata, + uint256, + address, + address + ) external pure override returns (uint256) { + return 0; + } + + function getUserUnclaimedRewards(address) external pure override returns (uint256) { + return 0; + } + + function getUserAssetData(address, address) external pure override returns (uint256) { + return 0; + } + + function REWARD_TOKEN() external pure override returns (address) { + return address(0); + } + + function PRECISION() external pure override returns (uint8) { + return 0; + } + + function DISTRIBUTION_END() external pure override returns (uint256) { + return 0; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol new file mode 100644 index 00000000..08ac0a22 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {L2Pool} from '../../protocol/pool/L2Pool.sol'; + +contract MockL2Pool is L2Pool { + function getRevision() internal pure override returns (uint256) { + return 0x3; + } + + constructor(IPoolAddressesProvider provider) L2Pool(provider) {} +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockPool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockPool.sol new file mode 100644 index 00000000..258b9631 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockPool.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; + +contract MockPool { + // Reserved storage space to avoid layout collisions. + uint256[100] private ______gap; + + address internal _addressesProvider; + address[] internal _reserveList; + + function initialize(address provider) external { + _addressesProvider = provider; + } + + function addReserveToReservesList(address reserve) external { + _reserveList.push(reserve); + } + + function getReservesList() external view returns (address[] memory) { + address[] memory reservesList = new address[](_reserveList.length); + for (uint256 i; i < _reserveList.length; i++) { + reservesList[i] = _reserveList[i]; + } + return reservesList; + } +} + +import {Pool} from '../../protocol/pool/Pool.sol'; + +contract MockPoolInherited is Pool { + uint16 internal _maxNumberOfReserves = 128; + + function getRevision() internal pure override returns (uint256) { + return 0x3; + } + + constructor(IPoolAddressesProvider provider) Pool(provider) {} + + function setMaxNumberOfReserves(uint16 newMaxNumberOfReserves) public { + _maxNumberOfReserves = newMaxNumberOfReserves; + } + + function MAX_NUMBER_RESERVES() public view override returns (uint16) { + return _maxNumberOfReserves; + } + + function dropReserve(address asset) external override { + _reservesList[_reserves[asset].id] = address(0); + delete _reserves[asset]; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol new file mode 100644 index 00000000..4774da4b --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol @@ -0,0 +1,174 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {ReserveConfiguration} from '../../protocol/libraries/configuration/ReserveConfiguration.sol'; +import {DataTypes} from '../../protocol/libraries/types/DataTypes.sol'; + +contract MockReserveConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + DataTypes.ReserveConfigurationMap public configuration; + + function setLtv(uint256 ltv) external { + DataTypes.ReserveConfigurationMap memory config = configuration; + config.setLtv(ltv); + configuration = config; + } + + function getLtv() external view returns (uint256) { + return configuration.getLtv(); + } + + function setLiquidationBonus(uint256 bonus) external { + DataTypes.ReserveConfigurationMap memory config = configuration; + config.setLiquidationBonus(bonus); + configuration = config; + } + + function getLiquidationBonus() external view returns (uint256) { + return configuration.getLiquidationBonus(); + } + + function setLiquidationThreshold(uint256 threshold) external { + DataTypes.ReserveConfigurationMap memory config = configuration; + config.setLiquidationThreshold(threshold); + configuration = config; + } + + function getLiquidationThreshold() external view returns (uint256) { + return configuration.getLiquidationThreshold(); + } + + function setDecimals(uint256 decimals) external { + DataTypes.ReserveConfigurationMap memory config = configuration; + config.setDecimals(decimals); + configuration = config; + } + + function getDecimals() external view returns (uint256) { + return configuration.getDecimals(); + } + + function setFrozen(bool frozen) external { + DataTypes.ReserveConfigurationMap memory config = configuration; + config.setFrozen(frozen); + configuration = config; + } + + function getFrozen() external view returns (bool) { + return configuration.getFrozen(); + } + + function setBorrowingEnabled(bool enabled) external { + DataTypes.ReserveConfigurationMap memory config = configuration; + config.setBorrowingEnabled(enabled); + configuration = config; + } + + function getBorrowingEnabled() external view returns (bool) { + return configuration.getBorrowingEnabled(); + } + + function setStableRateBorrowingEnabled(bool enabled) external { + DataTypes.ReserveConfigurationMap memory config = configuration; + config.setStableRateBorrowingEnabled(enabled); + configuration = config; + } + + function getStableRateBorrowingEnabled() external view returns (bool) { + return configuration.getStableRateBorrowingEnabled(); + } + + function setReserveFactor(uint256 reserveFactor) external { + DataTypes.ReserveConfigurationMap memory config = configuration; + config.setReserveFactor(reserveFactor); + configuration = config; + } + + function getReserveFactor() external view returns (uint256) { + return configuration.getReserveFactor(); + } + + function setBorrowCap(uint256 borrowCap) external { + DataTypes.ReserveConfigurationMap memory config = configuration; + config.setBorrowCap(borrowCap); + configuration = config; + } + + function getBorrowCap() external view returns (uint256) { + return configuration.getBorrowCap(); + } + + function getEModeCategory() external view returns (uint256) { + return configuration.getEModeCategory(); + } + + function setEModeCategory(uint256 categoryId) external { + DataTypes.ReserveConfigurationMap memory config = configuration; + config.setEModeCategory(categoryId); + configuration = config; + } + + function setSupplyCap(uint256 supplyCap) external { + DataTypes.ReserveConfigurationMap memory config = configuration; + config.setSupplyCap(supplyCap); + configuration = config; + } + + function getSupplyCap() external view returns (uint256) { + return configuration.getSupplyCap(); + } + + function setLiquidationProtocolFee(uint256 liquidationProtocolFee) external { + DataTypes.ReserveConfigurationMap memory config = configuration; + config.setLiquidationProtocolFee(liquidationProtocolFee); + configuration = config; + } + + function getLiquidationProtocolFee() external view returns (uint256) { + return configuration.getLiquidationProtocolFee(); + } + + function setUnbackedMintCap(uint256 unbackedMintCap) external { + DataTypes.ReserveConfigurationMap memory config = configuration; + config.setUnbackedMintCap(unbackedMintCap); + configuration = config; + } + + function getUnbackedMintCap() external view returns (uint256) { + return configuration.getUnbackedMintCap(); + } + + function getFlags() + external + view + returns ( + bool, + bool, + bool, + bool, + bool + ) + { + return configuration.getFlags(); + } + + function getParams() + external + view + returns ( + uint256, + uint256, + uint256, + uint256, + uint256, + uint256 + ) + { + return configuration.getParams(); + } + + function getCaps() external view returns (uint256, uint256) { + return configuration.getCaps(); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol new file mode 100644 index 00000000..0fbdb633 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {ERC20} from '../../dependencies/openzeppelin/contracts/ERC20.sol'; +import {IDelegationToken} from '../../interfaces/IDelegationToken.sol'; + +/** + * @title MintableDelegationERC20 + * @dev ERC20 minting logic with delegation + */ +contract MintableDelegationERC20 is IDelegationToken, ERC20 { + address public delegatee; + + constructor( + string memory name, + string memory symbol, + uint8 decimals + ) ERC20(name, symbol) { + _setupDecimals(decimals); + } + + /** + * @dev Function to mint tokens + * @param value The amount of tokens to mint. + * @return A boolean that indicates if the operation was successful. + */ + function mint(uint256 value) public returns (bool) { + _mint(msg.sender, value); + return true; + } + + function delegate(address delegateeAddress) external override { + delegatee = delegateeAddress; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol new file mode 100644 index 00000000..37fa2be8 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {ERC20} from '../../dependencies/openzeppelin/contracts/ERC20.sol'; +import {IERC20WithPermit} from '../../interfaces/IERC20WithPermit.sol'; + +/** + * @title ERC20Mintable + * @dev ERC20 minting logic + */ +contract MintableERC20 is IERC20WithPermit, ERC20 { + bytes public constant EIP712_REVISION = bytes('1'); + bytes32 internal constant EIP712_DOMAIN = + keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); + bytes32 public constant PERMIT_TYPEHASH = + keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); + + // Map of address nonces (address => nonce) + mapping(address => uint256) internal _nonces; + + bytes32 public DOMAIN_SEPARATOR; + + constructor( + string memory name, + string memory symbol, + uint8 decimals + ) ERC20(name, symbol) { + uint256 chainId = block.chainid; + + DOMAIN_SEPARATOR = keccak256( + abi.encode( + EIP712_DOMAIN, + keccak256(bytes(name)), + keccak256(EIP712_REVISION), + chainId, + address(this) + ) + ); + _setupDecimals(decimals); + } + + /// @inheritdoc IERC20WithPermit + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external override { + require(owner != address(0), 'INVALID_OWNER'); + //solium-disable-next-line + require(block.timestamp <= deadline, 'INVALID_EXPIRATION'); + uint256 currentValidNonce = _nonces[owner]; + bytes32 digest = keccak256( + abi.encodePacked( + '\x19\x01', + DOMAIN_SEPARATOR, + keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentValidNonce, deadline)) + ) + ); + require(owner == ecrecover(digest, v, r, s), 'INVALID_SIGNATURE'); + _nonces[owner] = currentValidNonce + 1; + _approve(owner, spender, value); + } + + /** + * @dev Function to mint tokens + * @param value The amount of tokens to mint. + * @return A boolean that indicates if the operation was successful. + */ + function mint(uint256 value) public returns (bool) { + _mint(_msgSender(), value); + return true; + } + + /** + * @dev Function to mint tokens to address + * @param account The account to mint tokens. + * @param value The amount of tokens to mint. + * @return A boolean that indicates if the operation was successful. + */ + function mint(address account, uint256 value) public returns (bool) { + _mint(account, value); + return true; + } + + function nonces(address owner) public view virtual returns (uint256) { + return _nonces[owner]; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol new file mode 100644 index 00000000..7a105fbc --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {AToken} from '../../protocol/tokenization/AToken.sol'; +import {IPool} from '../../interfaces/IPool.sol'; +import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; + +contract MockAToken is AToken { + constructor(IPool pool) AToken(pool) {} + + function getRevision() internal pure override returns (uint256) { + return 0x2; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol new file mode 100644 index 00000000..e70eab11 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {VersionedInitializable} from '../../protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; + +contract MockInitializableImple is VersionedInitializable { + uint256 public value; + string public text; + uint256[] public values; + + uint256 public constant REVISION = 1; + + /** + * @dev returns the revision number of the contract + * Needs to be defined in the inherited class as a constant. + **/ + function getRevision() internal pure override returns (uint256) { + return REVISION; + } + + function initialize( + uint256 val, + string memory txt, + uint256[] memory vals + ) external initializer { + value = val; + text = txt; + values = vals; + } + + function setValue(uint256 newValue) public { + value = newValue; + } + + function setValueViaProxy(uint256 newValue) public { + value = newValue; + } +} + +contract MockInitializableImpleV2 is VersionedInitializable { + uint256 public value; + string public text; + uint256[] public values; + + uint256 public constant REVISION = 2; + + /** + * @dev returns the revision number of the contract + * Needs to be defined in the inherited class as a constant. + **/ + function getRevision() internal pure override returns (uint256) { + return REVISION; + } + + function initialize( + uint256 val, + string memory txt, + uint256[] memory vals + ) public initializer { + value = val; + text = txt; + values = vals; + } + + function setValue(uint256 newValue) public { + value = newValue; + } + + function setValueViaProxy(uint256 newValue) public { + value = newValue; + } +} + +contract MockInitializableFromConstructorImple is VersionedInitializable { + uint256 public value; + + uint256 public constant REVISION = 2; + + /** + * @dev returns the revision number of the contract + * Needs to be defined in the inherited class as a constant. + **/ + function getRevision() internal pure override returns (uint256) { + return REVISION; + } + + constructor(uint256 val) { + initialize(val); + } + + function initialize(uint256 val) public initializer { + value = val; + } +} + +contract MockReentrantInitializableImple is VersionedInitializable { + uint256 public value; + + uint256 public constant REVISION = 2; + + /** + * @dev returns the revision number of the contract + * Needs to be defined in the inherited class as a constant. + **/ + function getRevision() internal pure override returns (uint256) { + return REVISION; + } + + function initialize(uint256 val) public initializer { + value = val; + if (value < 2) { + initialize(value + 1); + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol new file mode 100644 index 00000000..3c93bfe3 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {StableDebtToken} from '../../protocol/tokenization/StableDebtToken.sol'; +import {IPool} from '../../interfaces/IPool.sol'; + +contract MockStableDebtToken is StableDebtToken { + constructor(IPool pool) StableDebtToken(pool) {} + + function getRevision() internal pure override returns (uint256) { + return 0x3; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol new file mode 100644 index 00000000..3c302028 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {VariableDebtToken} from '../../protocol/tokenization/VariableDebtToken.sol'; +import {IPool} from '../../interfaces/IPool.sol'; + +contract MockVariableDebtToken is VariableDebtToken { + constructor(IPool pool) VariableDebtToken(pool) {} + + function getRevision() internal pure override returns (uint256) { + return 0x3; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol new file mode 100644 index 00000000..7b03541d --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {AccessControl} from '../../dependencies/openzeppelin/contracts/AccessControl.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {IACLManager} from '../../interfaces/IACLManager.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; + +/** + * @title ACLManager + * @author Aave + * @notice Access Control List Manager. Main registry of system roles and permissions. + */ +contract ACLManager is AccessControl, IACLManager { + bytes32 public constant override POOL_ADMIN_ROLE = keccak256('POOL_ADMIN'); + bytes32 public constant override EMERGENCY_ADMIN_ROLE = keccak256('EMERGENCY_ADMIN'); + bytes32 public constant override RISK_ADMIN_ROLE = keccak256('RISK_ADMIN'); + bytes32 public constant override FLASH_BORROWER_ROLE = keccak256('FLASH_BORROWER'); + bytes32 public constant override BRIDGE_ROLE = keccak256('BRIDGE'); + bytes32 public constant override ASSET_LISTING_ADMIN_ROLE = keccak256('ASSET_LISTING_ADMIN'); + + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @dev Constructor + * @dev The ACL admin should be initialized at the addressesProvider beforehand + * @param provider The address of the PoolAddressesProvider + */ + constructor(IPoolAddressesProvider provider) { + ADDRESSES_PROVIDER = provider; + address aclAdmin = provider.getACLAdmin(); + require(aclAdmin != address(0), Errors.ACL_ADMIN_CANNOT_BE_ZERO); + _setupRole(DEFAULT_ADMIN_ROLE, aclAdmin); + } + + /// @inheritdoc IACLManager + function setRoleAdmin(bytes32 role, bytes32 adminRole) + external + override + onlyRole(DEFAULT_ADMIN_ROLE) + { + _setRoleAdmin(role, adminRole); + } + + /// @inheritdoc IACLManager + function addPoolAdmin(address admin) external override { + grantRole(POOL_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removePoolAdmin(address admin) external override { + revokeRole(POOL_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isPoolAdmin(address admin) external view override returns (bool) { + return hasRole(POOL_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function addEmergencyAdmin(address admin) external override { + grantRole(EMERGENCY_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removeEmergencyAdmin(address admin) external override { + revokeRole(EMERGENCY_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isEmergencyAdmin(address admin) external view override returns (bool) { + return hasRole(EMERGENCY_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function addRiskAdmin(address admin) external override { + grantRole(RISK_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removeRiskAdmin(address admin) external override { + revokeRole(RISK_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isRiskAdmin(address admin) external view override returns (bool) { + return hasRole(RISK_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function addFlashBorrower(address borrower) external override { + grantRole(FLASH_BORROWER_ROLE, borrower); + } + + /// @inheritdoc IACLManager + function removeFlashBorrower(address borrower) external override { + revokeRole(FLASH_BORROWER_ROLE, borrower); + } + + /// @inheritdoc IACLManager + function isFlashBorrower(address borrower) external view override returns (bool) { + return hasRole(FLASH_BORROWER_ROLE, borrower); + } + + /// @inheritdoc IACLManager + function addBridge(address bridge) external override { + grantRole(BRIDGE_ROLE, bridge); + } + + /// @inheritdoc IACLManager + function removeBridge(address bridge) external override { + revokeRole(BRIDGE_ROLE, bridge); + } + + /// @inheritdoc IACLManager + function isBridge(address bridge) external view override returns (bool) { + return hasRole(BRIDGE_ROLE, bridge); + } + + /// @inheritdoc IACLManager + function addAssetListingAdmin(address admin) external override { + grantRole(ASSET_LISTING_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removeAssetListingAdmin(address admin) external override { + revokeRole(ASSET_LISTING_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isAssetListingAdmin(address admin) external view override returns (bool) { + return hasRole(ASSET_LISTING_ADMIN_ROLE, admin); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol new file mode 100644 index 00000000..073e92f3 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol @@ -0,0 +1,210 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {Ownable} from '../../dependencies/openzeppelin/contracts/Ownable.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {InitializableImmutableAdminUpgradeabilityProxy} from '../libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; + +/** + * @title PoolAddressesProvider + * @author Aave + * @notice Main registry of addresses part of or connected to the protocol, including permissioned roles + * @dev Acts as factory of proxies and admin of those, so with right to change its implementations + * @dev Owned by the Aave Governance + **/ +contract PoolAddressesProvider is Ownable, IPoolAddressesProvider { + // Identifier of the Aave Market + string private _marketId; + + // Map of registered addresses (identifier => registeredAddress) + mapping(bytes32 => address) private _addresses; + + // Main identifiers + bytes32 private constant POOL = 'POOL'; + bytes32 private constant POOL_CONFIGURATOR = 'POOL_CONFIGURATOR'; + bytes32 private constant PRICE_ORACLE = 'PRICE_ORACLE'; + bytes32 private constant ACL_MANAGER = 'ACL_MANAGER'; + bytes32 private constant ACL_ADMIN = 'ACL_ADMIN'; + bytes32 private constant PRICE_ORACLE_SENTINEL = 'PRICE_ORACLE_SENTINEL'; + bytes32 private constant DATA_PROVIDER = 'DATA_PROVIDER'; + + /** + * @dev Constructor. + * @param marketId The identifier of the market. + * @param owner The owner address of this contract. + */ + constructor(string memory marketId, address owner) { + _setMarketId(marketId); + transferOwnership(owner); + } + + /// @inheritdoc IPoolAddressesProvider + function getMarketId() external view override returns (string memory) { + return _marketId; + } + + /// @inheritdoc IPoolAddressesProvider + function setMarketId(string memory newMarketId) external override onlyOwner { + _setMarketId(newMarketId); + } + + /// @inheritdoc IPoolAddressesProvider + function getAddress(bytes32 id) public view override returns (address) { + return _addresses[id]; + } + + /// @inheritdoc IPoolAddressesProvider + function setAddress(bytes32 id, address newAddress) external override onlyOwner { + address oldAddress = _addresses[id]; + _addresses[id] = newAddress; + emit AddressSet(id, oldAddress, newAddress); + } + + /// @inheritdoc IPoolAddressesProvider + function setAddressAsProxy(bytes32 id, address newImplementationAddress) + external + override + onlyOwner + { + address proxyAddress = _addresses[id]; + address oldImplementationAddress = _getProxyImplementation(id); + _updateImpl(id, newImplementationAddress); + emit AddressSetAsProxy(id, proxyAddress, oldImplementationAddress, newImplementationAddress); + } + + /// @inheritdoc IPoolAddressesProvider + function getPool() external view override returns (address) { + return getAddress(POOL); + } + + /// @inheritdoc IPoolAddressesProvider + function setPoolImpl(address newPoolImpl) external override onlyOwner { + address oldPoolImpl = _getProxyImplementation(POOL); + _updateImpl(POOL, newPoolImpl); + emit PoolUpdated(oldPoolImpl, newPoolImpl); + } + + /// @inheritdoc IPoolAddressesProvider + function getPoolConfigurator() external view override returns (address) { + return getAddress(POOL_CONFIGURATOR); + } + + /// @inheritdoc IPoolAddressesProvider + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external override onlyOwner { + address oldPoolConfiguratorImpl = _getProxyImplementation(POOL_CONFIGURATOR); + _updateImpl(POOL_CONFIGURATOR, newPoolConfiguratorImpl); + emit PoolConfiguratorUpdated(oldPoolConfiguratorImpl, newPoolConfiguratorImpl); + } + + /// @inheritdoc IPoolAddressesProvider + function getPriceOracle() external view override returns (address) { + return getAddress(PRICE_ORACLE); + } + + /// @inheritdoc IPoolAddressesProvider + function setPriceOracle(address newPriceOracle) external override onlyOwner { + address oldPriceOracle = _addresses[PRICE_ORACLE]; + _addresses[PRICE_ORACLE] = newPriceOracle; + emit PriceOracleUpdated(oldPriceOracle, newPriceOracle); + } + + /// @inheritdoc IPoolAddressesProvider + function getACLManager() external view override returns (address) { + return getAddress(ACL_MANAGER); + } + + /// @inheritdoc IPoolAddressesProvider + function setACLManager(address newAclManager) external override onlyOwner { + address oldAclManager = _addresses[ACL_MANAGER]; + _addresses[ACL_MANAGER] = newAclManager; + emit ACLManagerUpdated(oldAclManager, newAclManager); + } + + /// @inheritdoc IPoolAddressesProvider + function getACLAdmin() external view override returns (address) { + return getAddress(ACL_ADMIN); + } + + /// @inheritdoc IPoolAddressesProvider + function setACLAdmin(address newAclAdmin) external override onlyOwner { + address oldAclAdmin = _addresses[ACL_ADMIN]; + _addresses[ACL_ADMIN] = newAclAdmin; + emit ACLAdminUpdated(oldAclAdmin, newAclAdmin); + } + + /// @inheritdoc IPoolAddressesProvider + function getPriceOracleSentinel() external view override returns (address) { + return getAddress(PRICE_ORACLE_SENTINEL); + } + + /// @inheritdoc IPoolAddressesProvider + function setPriceOracleSentinel(address newPriceOracleSentinel) external override onlyOwner { + address oldPriceOracleSentinel = _addresses[PRICE_ORACLE_SENTINEL]; + _addresses[PRICE_ORACLE_SENTINEL] = newPriceOracleSentinel; + emit PriceOracleSentinelUpdated(oldPriceOracleSentinel, newPriceOracleSentinel); + } + + /// @inheritdoc IPoolAddressesProvider + function getPoolDataProvider() external view override returns (address) { + return getAddress(DATA_PROVIDER); + } + + /// @inheritdoc IPoolAddressesProvider + function setPoolDataProvider(address newDataProvider) external override onlyOwner { + address oldDataProvider = _addresses[DATA_PROVIDER]; + _addresses[DATA_PROVIDER] = newDataProvider; + emit PoolDataProviderUpdated(oldDataProvider, newDataProvider); + } + + /** + * @notice Internal function to update the implementation of a specific proxied component of the protocol. + * @dev If there is no proxy registered with the given identifier, it creates the proxy setting `newAddress` + * as implementation and calls the initialize() function on the proxy + * @dev If there is already a proxy registered, it just updates the implementation to `newAddress` and + * calls the initialize() function via upgradeToAndCall() in the proxy + * @param id The id of the proxy to be updated + * @param newAddress The address of the new implementation + **/ + function _updateImpl(bytes32 id, address newAddress) internal { + address proxyAddress = _addresses[id]; + InitializableImmutableAdminUpgradeabilityProxy proxy; + bytes memory params = abi.encodeWithSignature('initialize(address)', address(this)); + + if (proxyAddress == address(0)) { + proxy = new InitializableImmutableAdminUpgradeabilityProxy(address(this)); + _addresses[id] = proxyAddress = address(proxy); + proxy.initialize(newAddress, params); + emit ProxyCreated(id, proxyAddress, newAddress); + } else { + proxy = InitializableImmutableAdminUpgradeabilityProxy(payable(proxyAddress)); + proxy.upgradeToAndCall(newAddress, params); + } + } + + /** + * @notice Updates the identifier of the Aave market. + * @param newMarketId The new id of the market + **/ + function _setMarketId(string memory newMarketId) internal { + string memory oldMarketId = _marketId; + _marketId = newMarketId; + emit MarketIdSet(oldMarketId, newMarketId); + } + + /** + * @notice Returns the the implementation contract of the proxy contract by its identifier. + * @dev It returns ZERO if there is no registered address with the given id + * @dev It reverts if the registered address with the given id is not `InitializableImmutableAdminUpgradeabilityProxy` + * @param id The id + * @return The address of the implementation contract + */ + function _getProxyImplementation(bytes32 id) internal returns (address) { + address proxyAddress = _addresses[id]; + if (proxyAddress == address(0)) { + return address(0); + } else { + address payable payableProxyAddress = payable(proxyAddress); + return InitializableImmutableAdminUpgradeabilityProxy(payableProxyAddress).implementation(); + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol new file mode 100644 index 00000000..f5cb3d37 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {Ownable} from '../../dependencies/openzeppelin/contracts/Ownable.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; +import {IPoolAddressesProviderRegistry} from '../../interfaces/IPoolAddressesProviderRegistry.sol'; + +/** + * @title PoolAddressesProviderRegistry + * @author Aave + * @notice Main registry of PoolAddressesProvider of Aave markets. + * @dev Used for indexing purposes of Aave protocol's markets. The id assigned to a PoolAddressesProvider refers to the + * market it is connected with, for example with `1` for the Aave main market and `2` for the next created. + **/ +contract PoolAddressesProviderRegistry is Ownable, IPoolAddressesProviderRegistry { + // Map of address provider ids (addressesProvider => id) + mapping(address => uint256) private _addressesProviderToId; + // Map of id to address provider (id => addressesProvider) + mapping(uint256 => address) private _idToAddressesProvider; + // List of addresses providers + address[] private _addressesProvidersList; + // Map of address provider list indexes (addressesProvider => indexInList) + mapping(address => uint256) private _addressesProvidersIndexes; + + /** + * @dev Constructor. + * @param owner The owner address of this contract. + */ + constructor(address owner) { + transferOwnership(owner); + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function getAddressesProvidersList() external view override returns (address[] memory) { + return _addressesProvidersList; + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function registerAddressesProvider(address provider, uint256 id) external override onlyOwner { + require(id != 0, Errors.INVALID_ADDRESSES_PROVIDER_ID); + require(_idToAddressesProvider[id] == address(0), Errors.INVALID_ADDRESSES_PROVIDER_ID); + require(_addressesProviderToId[provider] == 0, Errors.ADDRESSES_PROVIDER_ALREADY_ADDED); + + _addressesProviderToId[provider] = id; + _idToAddressesProvider[id] = provider; + + _addToAddressesProvidersList(provider); + emit AddressesProviderRegistered(provider, id); + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function unregisterAddressesProvider(address provider) external override onlyOwner { + require(_addressesProviderToId[provider] != 0, Errors.ADDRESSES_PROVIDER_NOT_REGISTERED); + uint256 oldId = _addressesProviderToId[provider]; + _idToAddressesProvider[oldId] = address(0); + _addressesProviderToId[provider] = 0; + + _removeFromAddressesProvidersList(provider); + + emit AddressesProviderUnregistered(provider, oldId); + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function getAddressesProviderIdByAddress(address addressesProvider) + external + view + override + returns (uint256) + { + return _addressesProviderToId[addressesProvider]; + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function getAddressesProviderAddressById(uint256 id) external view override returns (address) { + return _idToAddressesProvider[id]; + } + + /** + * @notice Adds the addresses provider address to the list. + * @param provider The address of the PoolAddressesProvider + */ + function _addToAddressesProvidersList(address provider) internal { + _addressesProvidersIndexes[provider] = _addressesProvidersList.length; + _addressesProvidersList.push(provider); + } + + /** + * @notice Removes the addresses provider address from the list. + * @param provider The address of the PoolAddressesProvider + */ + function _removeFromAddressesProvidersList(address provider) internal { + uint256 index = _addressesProvidersIndexes[provider]; + + _addressesProvidersIndexes[provider] = 0; + + // Swap the index of the last addresses provider in the list with the index of the provider to remove + uint256 lastIndex = _addressesProvidersList.length - 1; + if (index < lastIndex) { + address lastProvider = _addressesProvidersList[lastIndex]; + _addressesProvidersList[index] = lastProvider; + _addressesProvidersIndexes[lastProvider] = index; + } + _addressesProvidersList.pop(); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..87550c2e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {BaseUpgradeabilityProxy} from '../../../dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol'; + +/** + * @title BaseImmutableAdminUpgradeabilityProxy + * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern + * @notice This contract combines an upgradeability proxy with an authorization + * mechanism for administrative tasks. + * @dev The admin role is stored in an immutable, which helps saving transactions costs + * All external functions in this contract must be guarded by the + * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity + * feature proposal that would enable this to be done automatically. + */ +contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + address internal immutable _admin; + + /** + * @dev Constructor. + * @param admin The address of the admin + */ + constructor(address admin) { + _admin = admin; + } + + modifier ifAdmin() { + if (msg.sender == _admin) { + _; + } else { + _fallback(); + } + } + + /** + * @notice Return the admin address + * @return The address of the proxy admin. + */ + function admin() external ifAdmin returns (address) { + return _admin; + } + + /** + * @notice Return the implementation address + * @return The address of the implementation. + */ + function implementation() external ifAdmin returns (address) { + return _implementation(); + } + + /** + * @notice Upgrade the backing implementation of the proxy. + * @dev Only the admin can call this function. + * @param newImplementation The address of the new implementation. + */ + function upgradeTo(address newImplementation) external ifAdmin { + _upgradeTo(newImplementation); + } + + /** + * @notice Upgrade the backing implementation of the proxy and call a function + * on the new implementation. + * @dev This is useful to initialize the proxied contract. + * @param newImplementation The address of the new implementation. + * @param data Data to send as msg.data in the low level call. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + */ + function upgradeToAndCall(address newImplementation, bytes calldata data) + external + payable + ifAdmin + { + _upgradeTo(newImplementation); + (bool success, ) = newImplementation.delegatecall(data); + require(success); + } + + /** + * @notice Only fall back when the sender is not the admin. + */ + function _willFallback() internal virtual override { + require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); + super._willFallback(); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..655e5f9e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {InitializableUpgradeabilityProxy} from '../../../dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol'; +import {Proxy} from '../../../dependencies/openzeppelin/upgradeability/Proxy.sol'; +import {BaseImmutableAdminUpgradeabilityProxy} from './BaseImmutableAdminUpgradeabilityProxy.sol'; + +/** + * @title InitializableAdminUpgradeabilityProxy + * @author Aave + * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function + */ +contract InitializableImmutableAdminUpgradeabilityProxy is + BaseImmutableAdminUpgradeabilityProxy, + InitializableUpgradeabilityProxy +{ + /** + * @dev Constructor. + * @param admin The address of the admin + */ + constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { + // Intentionally left blank + } + + /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy + function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { + BaseImmutableAdminUpgradeabilityProxy._willFallback(); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol new file mode 100644 index 00000000..570c319e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + **/ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + **/ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..ed38c5c3 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,633 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant STABLE_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant EMODE_CATEGORY_MASK = 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant STABLE_BORROWING_ENABLED_START_BIT_POSITION = 59; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + /// @dev bit 63 reserved + + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + uint256 internal constant EMODE_CATEGORY_START_BIT_POSITION = 168; + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_EMODE_CATEGORY = 255; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + **/ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + **/ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + **/ + function setLiquidationThreshold(DataTypes.ReserveConfigurationMap memory self, uint256 threshold) + internal + pure + { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + **/ + function getLiquidationThreshold(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + **/ + function setLiquidationBonus(DataTypes.ReserveConfigurationMap memory self, uint256 bonus) + internal + pure + { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + **/ + function getLiquidationBonus(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + **/ + function setDecimals(DataTypes.ReserveConfigurationMap memory self, uint256 decimals) + internal + pure + { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + **/ + function getDecimals(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + **/ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + **/ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + **/ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + **/ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + **/ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + **/ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + **/ + function setBorrowableInIsolation(DataTypes.ReserveConfigurationMap memory self, bool borrowable) + internal + pure + { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + **/ + function getBorrowableInIsolation(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (bool) + { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + **/ + function setSiloedBorrowing(DataTypes.ReserveConfigurationMap memory self, bool siloed) + internal + pure + { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + **/ + function getSiloedBorrowing(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (bool) + { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + **/ + function setBorrowingEnabled(DataTypes.ReserveConfigurationMap memory self, bool enabled) + internal + pure + { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + **/ + function getBorrowingEnabled(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (bool) + { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables stable rate borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the stable rate borrowing needs to be enabled, false otherwise + **/ + function setStableRateBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & STABLE_BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << STABLE_BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the stable rate borrowing state of the reserve + * @param self The reserve configuration + * @return The stable rate borrowing state + **/ + function getStableRateBorrowingEnabled(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (bool) + { + return (self.data & ~STABLE_BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + **/ + function setReserveFactor(DataTypes.ReserveConfigurationMap memory self, uint256 reserveFactor) + internal + pure + { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + **/ + function getReserveFactor(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + **/ + function setBorrowCap(DataTypes.ReserveConfigurationMap memory self, uint256 borrowCap) + internal + pure + { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + **/ + function getBorrowCap(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + **/ + function setSupplyCap(DataTypes.ReserveConfigurationMap memory self, uint256 supplyCap) + internal + pure + { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + **/ + function getSupplyCap(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + **/ + function setDebtCeiling(DataTypes.ReserveConfigurationMap memory self, uint256 ceiling) + internal + pure + { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + **/ + function getDebtCeiling(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + **/ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + **/ + function getLiquidationProtocolFee(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + **/ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + **/ + function getUnbackedMintCap(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the eMode asset category + * @param self The reserve configuration + * @param category The asset category when the user selects the eMode + **/ + function setEModeCategory(DataTypes.ReserveConfigurationMap memory self, uint256 category) + internal + pure + { + require(category <= MAX_VALID_EMODE_CATEGORY, Errors.INVALID_EMODE_CATEGORY); + + self.data = (self.data & EMODE_CATEGORY_MASK) | (category << EMODE_CATEGORY_START_BIT_POSITION); + } + + /** + * @dev Gets the eMode asset category + * @param self The reserve configuration + * @return The eMode category for the asset + **/ + function getEModeCategory(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing stableRateBorrowing enabled + * @return The state flag representing paused + **/ + function getFlags(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns ( + bool, + bool, + bool, + bool, + bool + ) + { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~STABLE_BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + * @return The state param representing eMode category + **/ + function getParams(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns ( + uint256, + uint256, + uint256, + uint256, + uint256, + uint256 + ) + { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION, + (dataLocal & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + **/ + function getCaps(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256, uint256) + { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..cc9df478 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,251 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + **/ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + **/ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + **/ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + **/ + function isBorrowing(DataTypes.UserConfigurationMap memory self, uint256 reserveIndex) + internal + pure + returns (bool) + { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + **/ + function isUsingAsCollateral(DataTypes.UserConfigurationMap memory self, uint256 reserveIndex) + internal + pure + returns (bool) + { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + **/ + function isUsingAsCollateralOne(DataTypes.UserConfigurationMap memory self) + internal + pure + returns (bool) + { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + **/ + function isUsingAsCollateralAny(DataTypes.UserConfigurationMap memory self) + internal + pure + returns (bool) + { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + **/ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + **/ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + **/ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) + internal + view + returns ( + bool, + address, + uint256 + ) + { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask(DataTypes.UserConfigurationMap memory self, uint256 mask) + internal + pure + returns (uint256) + { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..640e4632 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' + string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/helpers/Helpers.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/helpers/Helpers.sol new file mode 100644 index 00000000..180d72a4 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/helpers/Helpers.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title Helpers library + * @author Aave + */ +library Helpers { + /** + * @notice Fetches the user current stable and variable debt balances + * @param user The user address + * @param reserveCache The reserve cache data object + * @return The stable debt balance + * @return The variable debt balance + **/ + function getUserCurrentDebt(address user, DataTypes.ReserveCache memory reserveCache) + internal + view + returns (uint256, uint256) + { + return ( + IERC20(reserveCache.stableDebtTokenAddress).balanceOf(user), + IERC20(reserveCache.variableDebtTokenAddress).balanceOf(user) + ); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol new file mode 100644 index 00000000..0559305f --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol @@ -0,0 +1,349 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IStableDebtToken} from '../../../interfaces/IStableDebtToken.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {Helpers} from '../helpers/Helpers.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {IsolationModeLogic} from './IsolationModeLogic.sol'; + +/** + * @title BorrowLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to borrowing + */ +library BorrowLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + event RebalanceStableBorrowRate(address indexed reserve, address indexed user); + event SwapBorrowRateMode( + address indexed reserve, + address indexed user, + DataTypes.InterestRateMode interestRateMode + ); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the + * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the + * isolated debt. + * @dev Emits the `Borrow()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the borrow function + */ + function executeBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteBorrowParams memory params + ) public { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ( + bool isolationModeActive, + address isolationModeCollateralAddress, + uint256 isolationModeDebtCeiling + ) = userConfig.getIsolationModeState(reservesData, reservesList); + + ValidationLogic.validateBorrow( + reservesData, + reservesList, + eModeCategories, + DataTypes.ValidateBorrowParams({ + reserveCache: reserveCache, + userConfig: userConfig, + asset: params.asset, + userAddress: params.onBehalfOf, + amount: params.amount, + interestRateMode: params.interestRateMode, + maxStableLoanPercent: params.maxStableRateBorrowSizePercent, + reservesCount: params.reservesCount, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory, + priceOracleSentinel: params.priceOracleSentinel, + isolationModeActive: isolationModeActive, + isolationModeCollateralAddress: isolationModeCollateralAddress, + isolationModeDebtCeiling: isolationModeDebtCeiling + }) + ); + + uint256 currentStableRate = 0; + bool isFirstBorrowing = false; + + if (params.interestRateMode == DataTypes.InterestRateMode.STABLE) { + currentStableRate = reserve.currentStableBorrowRate; + + ( + isFirstBorrowing, + reserveCache.nextTotalStableDebt, + reserveCache.nextAvgStableBorrowRate + ) = IStableDebtToken(reserveCache.stableDebtTokenAddress).mint( + params.user, + params.onBehalfOf, + params.amount, + currentStableRate + ); + } else { + (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); + } + + if (isFirstBorrowing) { + userConfig.setBorrowing(reserve.id, true); + } + + if (isolationModeActive) { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt += (params.amount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + + reserve.updateInterestRates( + reserveCache, + params.asset, + 0, + params.releaseUnderlying ? params.amount : 0 + ); + + if (params.releaseUnderlying) { + IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); + } + + emit Borrow( + params.asset, + params.user, + params.onBehalfOf, + params.amount, + params.interestRateMode, + params.interestRateMode == DataTypes.InterestRateMode.STABLE + ? currentStableRate + : reserve.currentVariableBorrowRate, + params.referralCode + ); + } + + /** + * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the + * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also + * reduces the isolated debt. + * @dev Emits the `Repay()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the repay function + * @return The actual amount being repaid + */ + function executeRepay( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteRepayParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + + (uint256 stableDebt, uint256 variableDebt) = Helpers.getUserCurrentDebt( + params.onBehalfOf, + reserveCache + ); + + ValidationLogic.validateRepay( + reserveCache, + params.amount, + params.interestRateMode, + params.onBehalfOf, + stableDebt, + variableDebt + ); + + uint256 paybackAmount = params.interestRateMode == DataTypes.InterestRateMode.STABLE + ? stableDebt + : variableDebt; + + // Allows a user to repay with aTokens without leaving dust from interest. + if (params.useATokens && params.amount == type(uint256).max) { + params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); + } + + if (params.amount < paybackAmount) { + paybackAmount = params.amount; + } + + if (params.interestRateMode == DataTypes.InterestRateMode.STABLE) { + (reserveCache.nextTotalStableDebt, reserveCache.nextAvgStableBorrowRate) = IStableDebtToken( + reserveCache.stableDebtTokenAddress + ).burn(params.onBehalfOf, paybackAmount); + } else { + reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); + } + + reserve.updateInterestRates( + reserveCache, + params.asset, + params.useATokens ? 0 : paybackAmount, + 0 + ); + + if (stableDebt + variableDebt - paybackAmount == 0) { + userConfig.setBorrowing(reserve.id, false); + } + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + reserveCache, + paybackAmount + ); + + if (params.useATokens) { + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + reserveCache.aTokenAddress, + paybackAmount, + reserveCache.nextLiquidityIndex + ); + } else { + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); + IAToken(reserveCache.aTokenAddress).handleRepayment(msg.sender, paybackAmount); + } + + emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); + + return paybackAmount; + } + + /** + * @notice Implements the rebalance stable borrow rate feature. In case of liquidity crunches on the protocol, stable + * rate borrows might need to be rebalanced to bring back equilibrium between the borrow and supply APYs. + * @dev The rules that define if a position can be rebalanced are implemented in `ValidationLogic.validateRebalanceStableBorrowRate()` + * @dev Emits the `RebalanceStableBorrowRate()` event + * @param reserve The state of the reserve of the asset being repaid + * @param asset The asset of the position being rebalanced + * @param user The user being rebalanced + */ + function executeRebalanceStableBorrowRate( + DataTypes.ReserveData storage reserve, + address asset, + address user + ) external { + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + + ValidationLogic.validateRebalanceStableBorrowRate(reserve, reserveCache, asset); + + IStableDebtToken stableDebtToken = IStableDebtToken(reserveCache.stableDebtTokenAddress); + uint256 stableDebt = IERC20(address(stableDebtToken)).balanceOf(user); + + stableDebtToken.burn(user, stableDebt); + + (, reserveCache.nextTotalStableDebt, reserveCache.nextAvgStableBorrowRate) = stableDebtToken + .mint(user, user, stableDebt, reserve.currentStableBorrowRate); + + reserve.updateInterestRates(reserveCache, asset, 0, 0); + + emit RebalanceStableBorrowRate(asset, user); + } + + /** + * @notice Implements the swap borrow rate feature. Borrowers can swap from variable to stable positions at any time. + * @dev Emits the `Swap()` event + * @param reserve The of the reserve of the asset being repaid + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param asset The asset of the position being swapped + * @param interestRateMode The current interest rate mode of the position being swapped + */ + function executeSwapBorrowRateMode( + DataTypes.ReserveData storage reserve, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + DataTypes.InterestRateMode interestRateMode + ) external { + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + (uint256 stableDebt, uint256 variableDebt) = Helpers.getUserCurrentDebt( + msg.sender, + reserveCache + ); + + ValidationLogic.validateSwapRateMode( + reserve, + reserveCache, + userConfig, + stableDebt, + variableDebt, + interestRateMode + ); + + if (interestRateMode == DataTypes.InterestRateMode.STABLE) { + (reserveCache.nextTotalStableDebt, reserveCache.nextAvgStableBorrowRate) = IStableDebtToken( + reserveCache.stableDebtTokenAddress + ).burn(msg.sender, stableDebt); + + (, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).mint(msg.sender, msg.sender, stableDebt, reserveCache.nextVariableBorrowIndex); + } else { + reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).burn(msg.sender, variableDebt, reserveCache.nextVariableBorrowIndex); + + (, reserveCache.nextTotalStableDebt, reserveCache.nextAvgStableBorrowRate) = IStableDebtToken( + reserveCache.stableDebtTokenAddress + ).mint(msg.sender, msg.sender, variableDebt, reserve.currentStableBorrowRate); + } + + reserve.updateInterestRates(reserveCache, asset, 0, 0); + + emit SwapBorrowRateMode(asset, msg.sender, interestRateMode); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol new file mode 100644 index 00000000..d5f1ce9e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +library BridgeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. + * @dev Essentially a supply without transferring the underlying. + * @dev Emits the `MintUnbacked` event + * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param asset The address of the underlying asset to mint aTokens of + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function executeMintUnbacked( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, amount); + + uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); + uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); + + uint256 unbacked = reserve.unbacked += amount.toUint128(); + + require(unbacked <= unbackedMintCap * (10**reserveDecimals), Errors.UNBACKED_MINT_CAP_EXCEEDED); + + reserve.updateInterestRates(reserveCache, asset, 0, 0); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + onBehalfOf, + amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); + } + } + + emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); + } + + /** + * @notice Back the current unbacked with `amount` and pay `fee`. + * @dev Emits the `BackUnbacked` event + * @param reserve The reserve to back unbacked for + * @param asset The address of the underlying asset to repay + * @param amount The amount to back + * @param fee The amount paid in fees + * @param protocolFeeBps The fraction of fees in basis points paid to the protocol + **/ + function executeBackUnbacked( + DataTypes.ReserveData storage reserve, + address asset, + uint256 amount, + uint256 fee, + uint256 protocolFeeBps + ) external { + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; + + uint256 feeToProtocol = fee.percentMul(protocolFeeBps); + uint256 feeToLP = fee - feeToProtocol; + uint256 added = backingAmount + fee; + + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply(), + feeToLP + ); + + reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + + reserve.unbacked -= backingAmount.toUint128(); + reserve.updateInterestRates(reserveCache, asset, added, 0); + + IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); + + emit BackUnbacked(asset, msg.sender, backingAmount, fee); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol new file mode 100644 index 00000000..5ef53e03 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol @@ -0,0 +1,322 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +/** + * @title CalldataLogic library + * @author Aave + * @notice Library to decode calldata, used to optimize calldata size in L2Pool for transaction cost reduction + */ +library CalldataLogic { + /** + * @notice Decodes compressed supply params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed supply params + * @return The address of the underlying reserve + * @return The amount to supply + * @return The referralCode + */ + function decodeSupplyParams(mapping(uint256 => address) storage reservesList, bytes32 args) + internal + view + returns ( + address, + uint256, + uint16 + ) + { + uint16 assetId; + uint256 amount; + uint16 referralCode; + + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + referralCode := and(shr(144, args), 0xFFFF) + } + return (reservesList[assetId], amount, referralCode); + } + + /** + * @notice Decodes compressed supply params to standard params along with permit params + * @param reservesList The addresses of all the active reserves + * @param args The packed supply with permit params + * @return The address of the underlying reserve + * @return The amount to supply + * @return The referralCode + * @return The deadline of the permit + * @return The V value of the permit signature + */ + function decodeSupplyWithPermitParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) + internal + view + returns ( + address, + uint256, + uint16, + uint256, + uint8 + ) + { + uint256 deadline; + uint8 permitV; + + assembly { + deadline := and(shr(160, args), 0xFFFFFFFF) + permitV := and(shr(192, args), 0xFF) + } + (address asset, uint256 amount, uint16 referralCode) = decodeSupplyParams(reservesList, args); + + return (asset, amount, referralCode, deadline, permitV); + } + + /** + * @notice Decodes compressed withdraw params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed withdraw params + * @return The address of the underlying reserve + * @return The amount to withdraw + */ + function decodeWithdrawParams(mapping(uint256 => address) storage reservesList, bytes32 args) + internal + view + returns (address, uint256) + { + uint16 assetId; + uint256 amount; + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + } + if (amount == type(uint128).max) { + amount = type(uint256).max; + } + return (reservesList[assetId], amount); + } + + /** + * @notice Decodes compressed borrow params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed borrow params + * @return The address of the underlying reserve + * @return The amount to borrow + * @return The interestRateMode, 1 for stable or 2 for variable debt + * @return The referralCode + */ + function decodeBorrowParams(mapping(uint256 => address) storage reservesList, bytes32 args) + internal + view + returns ( + address, + uint256, + uint256, + uint16 + ) + { + uint16 assetId; + uint256 amount; + uint256 interestRateMode; + uint16 referralCode; + + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + interestRateMode := and(shr(144, args), 0xFF) + referralCode := and(shr(152, args), 0xFFFF) + } + + return (reservesList[assetId], amount, interestRateMode, referralCode); + } + + /** + * @notice Decodes compressed repay params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed repay params + * @return The address of the underlying reserve + * @return The amount to repay + * @return The interestRateMode, 1 for stable or 2 for variable debt + */ + function decodeRepayParams(mapping(uint256 => address) storage reservesList, bytes32 args) + internal + view + returns ( + address, + uint256, + uint256 + ) + { + uint16 assetId; + uint256 amount; + uint256 interestRateMode; + + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + interestRateMode := and(shr(144, args), 0xFF) + } + + if (amount == type(uint128).max) { + amount = type(uint256).max; + } + + return (reservesList[assetId], amount, interestRateMode); + } + + /** + * @notice Decodes compressed repay params to standard params along with permit params + * @param reservesList The addresses of all the active reserves + * @param args The packed repay with permit params + * @return The address of the underlying reserve + * @return The amount to repay + * @return The interestRateMode, 1 for stable or 2 for variable debt + * @return The deadline of the permit + * @return The V value of the permit signature + */ + function decodeRepayWithPermitParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) + internal + view + returns ( + address, + uint256, + uint256, + uint256, + uint8 + ) + { + uint256 deadline; + uint8 permitV; + + (address asset, uint256 amount, uint256 interestRateMode) = decodeRepayParams( + reservesList, + args + ); + + assembly { + deadline := and(shr(152, args), 0xFFFFFFFF) + permitV := and(shr(184, args), 0xFF) + } + + return (asset, amount, interestRateMode, deadline, permitV); + } + + /** + * @notice Decodes compressed swap borrow rate mode params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed swap borrow rate mode params + * @return The address of the underlying reserve + * @return The interest rate mode, 1 for stable 2 for variable debt + */ + function decodeSwapBorrowRateModeParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256) { + uint16 assetId; + uint256 interestRateMode; + + assembly { + assetId := and(args, 0xFFFF) + interestRateMode := and(shr(16, args), 0xFF) + } + + return (reservesList[assetId], interestRateMode); + } + + /** + * @notice Decodes compressed rebalance stable borrow rate params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed rabalance stable borrow rate params + * @return The address of the underlying reserve + * @return The address of the user to rebalance + */ + function decodeRebalanceStableBorrowRateParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, address) { + uint16 assetId; + address user; + assembly { + assetId := and(args, 0xFFFF) + user := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + } + return (reservesList[assetId], user); + } + + /** + * @notice Decodes compressed set user use reserve as collateral params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed set user use reserve as collateral params + * @return The address of the underlying reserve + * @return True if to set using as collateral, false otherwise + */ + function decodeSetUserUseReserveAsCollateralParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, bool) { + uint16 assetId; + bool useAsCollateral; + assembly { + assetId := and(args, 0xFFFF) + useAsCollateral := and(shr(16, args), 0x1) + } + return (reservesList[assetId], useAsCollateral); + } + + /** + * @notice Decodes compressed liquidation call params to standard params + * @param reservesList The addresses of all the active reserves + * @param args1 The first half of packed liquidation call params + * @param args2 The second half of the packed liquidation call params + * @return The address of the underlying collateral asset + * @return The address of the underlying debt asset + * @return The address of the user to liquidate + * @return The amount of debt to cover + * @return True if receiving aTokens, false otherwise + */ + function decodeLiquidationCallParams( + mapping(uint256 => address) storage reservesList, + bytes32 args1, + bytes32 args2 + ) + internal + view + returns ( + address, + address, + address, + uint256, + bool + ) + { + uint16 collateralAssetId; + uint16 debtAssetId; + address user; + uint256 debtToCover; + bool receiveAToken; + + assembly { + collateralAssetId := and(args1, 0xFFFF) + debtAssetId := and(shr(16, args1), 0xFFFF) + user := and(shr(32, args1), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + + debtToCover := and(args2, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + receiveAToken := and(shr(128, args2), 0x1) + } + + if (debtToCover == type(uint128).max) { + debtToCover = type(uint256).max; + } + + return ( + reservesList[collateralAssetId], + reservesList[debtAssetId], + user, + debtToCover, + receiveAToken + ); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ConfiguratorLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ConfiguratorLogic.sol new file mode 100644 index 00000000..c29afa07 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ConfiguratorLogic.sol @@ -0,0 +1,268 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IPool} from '../../../interfaces/IPool.sol'; +import {IInitializableAToken} from '../../../interfaces/IInitializableAToken.sol'; +import {IInitializableDebtToken} from '../../../interfaces/IInitializableDebtToken.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {InitializableImmutableAdminUpgradeabilityProxy} from '../aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ConfiguratorInputTypes} from '../types/ConfiguratorInputTypes.sol'; + +/** + * @title ConfiguratorLogic library + * @author Aave + * @notice Implements the functions to initialize reserves and update aTokens and debtTokens + */ +library ConfiguratorLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPoolConfigurator` for descriptions + event ReserveInitialized( + address indexed asset, + address indexed aToken, + address stableDebtToken, + address variableDebtToken, + address interestRateStrategyAddress + ); + event ATokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + event StableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + event VariableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @notice Initialize a reserve by creating and initializing aToken, stable debt token and variable debt token + * @dev Emits the `ReserveInitialized` event + * @param pool The Pool in which the reserve will be initialized + * @param input The needed parameters for the initialization + */ + function executeInitReserve(IPool pool, ConfiguratorInputTypes.InitReserveInput calldata input) + public + { + address aTokenProxyAddress = _initTokenWithProxy( + input.aTokenImpl, + abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + pool, + input.treasury, + input.underlyingAsset, + input.incentivesController, + input.underlyingAssetDecimals, + input.aTokenName, + input.aTokenSymbol, + input.params + ) + ); + + address stableDebtTokenProxyAddress = _initTokenWithProxy( + input.stableDebtTokenImpl, + abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + pool, + input.underlyingAsset, + input.incentivesController, + input.underlyingAssetDecimals, + input.stableDebtTokenName, + input.stableDebtTokenSymbol, + input.params + ) + ); + + address variableDebtTokenProxyAddress = _initTokenWithProxy( + input.variableDebtTokenImpl, + abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + pool, + input.underlyingAsset, + input.incentivesController, + input.underlyingAssetDecimals, + input.variableDebtTokenName, + input.variableDebtTokenSymbol, + input.params + ) + ); + + pool.initReserve( + input.underlyingAsset, + aTokenProxyAddress, + stableDebtTokenProxyAddress, + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + + DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); + + currentConfig.setDecimals(input.underlyingAssetDecimals); + + currentConfig.setActive(true); + currentConfig.setPaused(false); + currentConfig.setFrozen(false); + + pool.setConfiguration(input.underlyingAsset, currentConfig); + + emit ReserveInitialized( + input.underlyingAsset, + aTokenProxyAddress, + stableDebtTokenProxyAddress, + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + } + + /** + * @notice Updates the aToken implementation and initializes it + * @dev Emits the `ATokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the aToken + * @param input The parameters needed for the initialize call + */ + function executeUpdateAToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateATokenInput calldata input + ) public { + DataTypes.ReserveData memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + cachedPool, + input.treasury, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); + + emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); + } + + /** + * @notice Updates the stable debt token implementation and initializes it + * @dev Emits the `StableDebtTokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the stable debt token + * @param input The parameters needed for the initialize call + */ + function executeUpdateStableDebtToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) public { + DataTypes.ReserveData memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + cachedPool, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation( + reserveData.stableDebtTokenAddress, + input.implementation, + encodedCall + ); + + emit StableDebtTokenUpgraded( + input.asset, + reserveData.stableDebtTokenAddress, + input.implementation + ); + } + + /** + * @notice Updates the variable debt token implementation and initializes it + * @dev Emits the `VariableDebtTokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the variable debt token + * @param input The parameters needed for the initialize call + */ + function executeUpdateVariableDebtToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) public { + DataTypes.ReserveData memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + cachedPool, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation( + reserveData.variableDebtTokenAddress, + input.implementation, + encodedCall + ); + + emit VariableDebtTokenUpgraded( + input.asset, + reserveData.variableDebtTokenAddress, + input.implementation + ); + } + + /** + * @notice Creates a new proxy and initializes the implementation + * @param implementation The address of the implementation + * @param initParams The parameters that is passed to the implementation to initialize + * @return The address of initialized proxy + */ + function _initTokenWithProxy(address implementation, bytes memory initParams) + internal + returns (address) + { + InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( + address(this) + ); + + proxy.initialize(implementation, initParams); + + return address(proxy); + } + + /** + * @notice Upgrades the implementation and makes call to the proxy + * @dev The call is used to initialize the new implementation. + * @param proxyAddress The address of the proxy + * @param implementation The address of the new implementation + * @param initParams The parameters to the call after the upgrade + */ + function _upgradeTokenImplementation( + address proxyAddress, + address implementation, + bytes memory initParams + ) internal { + InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( + payable(proxyAddress) + ); + + proxy.upgradeToAndCall(implementation, initParams); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..e329828b --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + ValidationLogic.validateSetUserEMode( + reservesData, + reservesList, + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + uint8 prevCategoryId = usersEModeCategory[msg.sender]; + usersEModeCategory[msg.sender] = params.categoryId; + + if (prevCategoryId != 0) { + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + } + emit UserEModeSet(msg.sender, params.categoryId); + } + + /** + * @notice Gets the eMode configuration and calculates the eMode asset price if a custom oracle is configured + * @dev The eMode asset price returned is 0 if no oracle is specified + * @param category The user eMode category + * @param oracle The price oracle + * @return The eMode ltv + * @return The eMode liquidation threshold + * @return The eMode asset price + **/ + function getEModeConfiguration( + DataTypes.EModeCategory storage category, + IPriceOracleGetter oracle + ) + internal + view + returns ( + uint256, + uint256, + uint256 + ) + { + uint256 eModeAssetPrice = 0; + address eModePriceSource = category.priceSource; + + if (eModePriceSource != address(0)) { + eModeAssetPrice = oracle.getAssetPrice(eModePriceSource); + } + + return (category.ltv, category.liquidationThreshold, eModeAssetPrice); + } + + /** + * @notice Checks if eMode is active for a user and if yes, if the asset belongs to the eMode category chosen + * @param eModeUserCategory The user eMode category + * @param eModeAssetCategory The asset eMode category + * @return True if eMode is active and the asset belongs to the eMode category chosen by the user, false otherwise + **/ + function isInEModeCategory(uint256 eModeUserCategory, uint256 eModeAssetCategory) + internal + pure + returns (bool) + { + return (eModeUserCategory != 0 && eModeAssetCategory == eModeUserCategory); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol new file mode 100644 index 00000000..fa800e32 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol @@ -0,0 +1,262 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IFlashLoanReceiver} from '../../../flashloan/interfaces/IFlashLoanReceiver.sol'; +import {IFlashLoanSimpleReceiver} from '../../../flashloan/interfaces/IFlashLoanSimpleReceiver.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {BorrowLogic} from './BorrowLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title FlashLoanLogic library + * @author Aave + * @notice Implements the logic for the flash loans + */ +library FlashLoanLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + + // See `IPool` for descriptions + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + // Helper struct for internal variables used in the `executeFlashLoan` function + struct FlashLoanLocalVars { + IFlashLoanReceiver receiver; + uint256 i; + address currentAsset; + uint256 currentAmount; + uint256[] totalPremiums; + uint256 flashloanPremiumTotal; + uint256 flashloanPremiumToProtocol; + } + + /** + * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction + * as long as the amount taken plus fee is returned or debt is opened. + * @dev For authorized flashborrowers the fee is waived + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the flashloan function + */ + function executeFlashLoan( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.FlashloanParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); + + FlashLoanLocalVars memory vars; + + vars.totalPremiums = new uint256[](params.assets.length); + + vars.receiver = IFlashLoanReceiver(params.receiverAddress); + (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower + ? (0, 0) + : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); + + for (vars.i = 0; vars.i < params.assets.length; vars.i++) { + vars.currentAmount = params.amounts[vars.i]; + vars.totalPremiums[vars.i] = vars.currentAmount.percentMul(vars.flashloanPremiumTotal); + IAToken(reservesData[params.assets[vars.i]].aTokenAddress).transferUnderlyingTo( + params.receiverAddress, + vars.currentAmount + ); + } + + require( + vars.receiver.executeOperation( + params.assets, + params.amounts, + vars.totalPremiums, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + for (vars.i = 0; vars.i < params.assets.length; vars.i++) { + vars.currentAsset = params.assets[vars.i]; + vars.currentAmount = params.amounts[vars.i]; + + if ( + DataTypes.InterestRateMode(params.interestRateModes[vars.i]) == + DataTypes.InterestRateMode.NONE + ) { + _handleFlashLoanRepayment( + reservesData[vars.currentAsset], + DataTypes.FlashLoanRepaymentParams({ + asset: vars.currentAsset, + receiverAddress: params.receiverAddress, + amount: vars.currentAmount, + totalPremium: vars.totalPremiums[vars.i], + flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } else { + // If the user chose to not return the funds, the system checks if there is enough collateral and + // eventually opens a debt position + BorrowLogic.executeBorrow( + reservesData, + reservesList, + eModeCategories, + userConfig, + DataTypes.ExecuteBorrowParams({ + asset: vars.currentAsset, + user: msg.sender, + onBehalfOf: params.onBehalfOf, + amount: vars.currentAmount, + interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[vars.i]), + referralCode: params.referralCode, + releaseUnderlying: false, + maxStableRateBorrowSizePercent: params.maxStableRateBorrowSizePercent, + reservesCount: params.reservesCount, + oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), + userEModeCategory: params.userEModeCategory, + priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) + .getPriceOracleSentinel() + }) + ); + // no premium is paid when taking on the flashloan as debt + emit FlashLoan( + params.receiverAddress, + msg.sender, + vars.currentAsset, + vars.currentAmount, + DataTypes.InterestRateMode(params.interestRateModes[vars.i]), + 0, + params.referralCode + ); + } + } + } + + /** + * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one + * transaction as long as the amount taken plus fee is returned. + * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the simple flashloan function + */ + function executeFlashLoanSimple( + DataTypes.ReserveData storage reserve, + DataTypes.FlashloanSimpleParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloanSimple(reserve); + + IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); + uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); + IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); + + require( + receiver.executeOperation( + params.asset, + params.amount, + totalPremium, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + _handleFlashLoanRepayment( + reserve, + DataTypes.FlashLoanRepaymentParams({ + asset: params.asset, + receiverAddress: params.receiverAddress, + amount: params.amount, + totalPremium: totalPremium, + flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } + + /** + * @notice Handles repayment of flashloaned assets + premium + * @dev Will pull the amount + premium from the receiver, so must have approved pool + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the repayment function + */ + function _handleFlashLoanRepayment( + DataTypes.ReserveData storage reserve, + DataTypes.FlashLoanRepaymentParams memory params + ) internal { + uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); + uint256 premiumToLP = params.totalPremium - premiumToProtocol; + uint256 amountPlusPremium = params.amount + params.totalPremium; + + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply(), + premiumToLP + ); + + reserve.accruedToTreasury += premiumToProtocol + .rayDiv(reserveCache.nextLiquidityIndex) + .toUint128(); + + reserve.updateInterestRates(reserveCache, params.asset, amountPlusPremium, 0); + + IERC20(params.asset).safeTransferFrom( + params.receiverAddress, + reserveCache.aTokenAddress, + amountPlusPremium + ); + + IAToken(reserveCache.aTokenAddress).handleRepayment(params.receiverAddress, amountPlusPremium); + + emit FlashLoan( + params.receiverAddress, + msg.sender, + params.asset, + params.amount, + DataTypes.InterestRateMode(0), + params.totalPremium, + params.referralCode + ); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..a03fc3ca --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,280 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeAssetPrice; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + uint256 eModeAssetCategory; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + **/ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) + internal + view + returns ( + uint256, + uint256, + uint256, + uint256, + uint256, + bool + ) + { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + (vars.eModeLtv, vars.eModeLiqThreshold, vars.eModeAssetPrice) = EModeLogic + .getEModeConfiguration( + eModeCategories[params.userEModeCategory], + IPriceOracleGetter(params.oracle) + ); + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + ( + vars.ltv, + vars.liquidationThreshold, + , + vars.decimals, + , + vars.eModeAssetCategory + ) = currentReserve.configuration.getParams(); + + unchecked { + vars.assetUnit = 10**vars.decimals; + } + + vars.assetPrice = vars.eModeAssetPrice != 0 && + params.userEModeCategory == vars.eModeAssetCategory + ? vars.eModeAssetPrice + : IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = EModeLogic.isInEModeCategory( + params.userEModeCategory, + vars.eModeAssetCategory + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + **/ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency < totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the stable and variable debt tokens for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + **/ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt != 0) { + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()); + } + + userTotalDebt = userTotalDebt + IERC20(reserve.stableDebtTokenAddress).balanceOf(user); + + userTotalDebt = assetPrice * userTotalDebt; + + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + **/ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/IsolationModeLogic.sol new file mode 100644 index 00000000..e2995c16 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/IsolationModeLogic.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/LiquidationLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/LiquidationLogic.sol new file mode 100644 index 00000000..7d91d336 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -0,0 +1,538 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts//IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {PercentageMath} from '../../libraries/math/PercentageMath.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Helpers} from '../../libraries/helpers/Helpers.sol'; +import {DataTypes} from '../../libraries/types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {IsolationModeLogic} from './IsolationModeLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; +import {UserConfiguration} from '../../libraries/configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../../libraries/configuration/ReserveConfiguration.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IStableDebtToken} from '../../../interfaces/IStableDebtToken.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; + +/** + * @title LiquidationLogic library + * @author Aave + * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations + **/ +library LiquidationLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Default percentage of borrower's debt to be repaid in a liquidation. + * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 0.5e4 results in 50.00% + */ + uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; + + /** + * @dev Maximum percentage of borrower's debt to be repaid in a liquidation + * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 1e4 results in 100.00% + */ + uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; + + /** + * @dev This constant represents below which health factor value it is possible to liquidate + * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. + * A value of 0.95e18 results in 0.95 + */ + uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; + + struct LiquidationCallLocalVars { + uint256 userCollateralBalance; + uint256 userVariableDebt; + uint256 userTotalDebt; + uint256 actualDebtToLiquidate; + uint256 actualCollateralToLiquidate; + uint256 liquidationBonus; + uint256 healthFactor; + uint256 liquidationProtocolFeeAmount; + address collateralPriceSource; + address debtPriceSource; + IAToken collateralAToken; + DataTypes.ReserveCache debtReserveCache; + } + + /** + * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) + * covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportional amount of the `collateralAsset` plus a bonus to cover market risk + * @dev Emits the `LiquidationCall()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params The additional parameters needed to execute the liquidation function + **/ + function executeLiquidationCall( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ExecuteLiquidationCallParams memory params + ) external { + LiquidationCallLocalVars memory vars; + + DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; + DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; + DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; + vars.debtReserveCache = debtReserve.cache(); + debtReserve.updateState(vars.debtReserveCache); + + (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: params.reservesCount, + user: params.user, + oracle: params.priceOracle, + userEModeCategory: params.userEModeCategory + }) + ); + + (vars.userVariableDebt, vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( + vars.debtReserveCache, + params, + vars.healthFactor + ); + + ValidationLogic.validateLiquidationCall( + userConfig, + collateralReserve, + DataTypes.ValidateLiquidationCallParams({ + debtReserveCache: vars.debtReserveCache, + totalDebt: vars.userTotalDebt, + healthFactor: vars.healthFactor, + priceOracleSentinel: params.priceOracleSentinel + }) + ); + + ( + vars.collateralAToken, + vars.collateralPriceSource, + vars.debtPriceSource, + vars.liquidationBonus + ) = _getConfigurationData(eModeCategories, collateralReserve, params); + + vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); + + ( + vars.actualCollateralToLiquidate, + vars.actualDebtToLiquidate, + vars.liquidationProtocolFeeAmount + ) = _calculateAvailableCollateralToLiquidate( + collateralReserve, + vars.debtReserveCache, + vars.collateralPriceSource, + vars.debtPriceSource, + vars.actualDebtToLiquidate, + vars.userCollateralBalance, + vars.liquidationBonus, + IPriceOracleGetter(params.priceOracle) + ); + + if (vars.userTotalDebt == vars.actualDebtToLiquidate) { + userConfig.setBorrowing(debtReserve.id, false); + } + + _burnDebtTokens(params, vars); + + debtReserve.updateInterestRates( + vars.debtReserveCache, + params.debtAsset, + vars.actualDebtToLiquidate, + 0 + ); + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + vars.debtReserveCache, + vars.actualDebtToLiquidate + ); + + if (params.receiveAToken) { + _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); + } else { + _burnCollateralATokens(collateralReserve, params, vars); + } + + // Transfer fee to treasury if it is non-zero + if (vars.liquidationProtocolFeeAmount != 0) { + vars.collateralAToken.transferOnLiquidation( + params.user, + vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), + vars.liquidationProtocolFeeAmount + ); + } + + // If the collateral being liquidated is equal to the user balance, + // we set the currency as not being used as collateral anymore + if (vars.actualCollateralToLiquidate == vars.userCollateralBalance) { + userConfig.setUsingAsCollateral(collateralReserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); + } + + // Transfers the debt asset being repaid to the aToken, where the liquidity is kept + IERC20(params.debtAsset).safeTransferFrom( + msg.sender, + vars.debtReserveCache.aTokenAddress, + vars.actualDebtToLiquidate + ); + + IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( + msg.sender, + vars.actualDebtToLiquidate + ); + + emit LiquidationCall( + params.collateralAsset, + params.debtAsset, + params.user, + vars.actualDebtToLiquidate, + vars.actualCollateralToLiquidate, + msg.sender, + params.receiveAToken + ); + } + + /** + * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. + * @dev The function also updates the state and the interest rate of the collateral reserve. + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _burnCollateralATokens( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); + collateralReserve.updateState(collateralReserveCache); + collateralReserve.updateInterestRates( + collateralReserveCache, + params.collateralAsset, + 0, + vars.actualCollateralToLiquidate + ); + + // Burn the equivalent amount of aToken, sending the underlying to the liquidator + vars.collateralAToken.burn( + params.user, + msg.sender, + vars.actualCollateralToLiquidate, + collateralReserveCache.nextLiquidityIndex + ); + } + + /** + * @notice Liquidates the user aTokens by transferring them to the liquidator. + * @dev The function also checks the state of the liquidator and activates the aToken as collateral + * as in standard transfers if the isolation mode constraints are respected. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _liquidateATokens( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); + vars.collateralAToken.transferOnLiquidation( + params.user, + msg.sender, + vars.actualCollateralToLiquidate + ); + + if (liquidatorPreviousATokenBalance == 0) { + DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; + if ( + ValidationLogic.validateUseAsCollateral( + reservesData, + reservesList, + liquidatorConfig, + collateralReserve.configuration + ) + ) { + liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); + } + } + } + + /** + * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. + * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. + * @param params The additional parameters needed to execute the liquidation function + * @param vars the executeLiquidationCall() function local vars + */ + function _burnDebtTokens( + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + if (vars.userVariableDebt >= vars.actualDebtToLiquidate) { + vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( + vars.debtReserveCache.variableDebtTokenAddress + ).burn( + params.user, + vars.actualDebtToLiquidate, + vars.debtReserveCache.nextVariableBorrowIndex + ); + } else { + // If the user doesn't have variable debt, no need to try to burn variable debt tokens + if (vars.userVariableDebt != 0) { + vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( + vars.debtReserveCache.variableDebtTokenAddress + ).burn(params.user, vars.userVariableDebt, vars.debtReserveCache.nextVariableBorrowIndex); + } + ( + vars.debtReserveCache.nextTotalStableDebt, + vars.debtReserveCache.nextAvgStableBorrowRate + ) = IStableDebtToken(vars.debtReserveCache.stableDebtTokenAddress).burn( + params.user, + vars.actualDebtToLiquidate - vars.userVariableDebt + ); + } + } + + /** + * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor + * and corresponding close factor. + * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR + * @param debtReserveCache The reserve cache data object of the debt reserve + * @param params The additional parameters needed to execute the liquidation function + * @param healthFactor The health factor of the position + * @return The variable debt of the user + * @return The total debt of the user + * @return The actual debt to liquidate as a function of the closeFactor + */ + function _calculateDebt( + DataTypes.ReserveCache memory debtReserveCache, + DataTypes.ExecuteLiquidationCallParams memory params, + uint256 healthFactor + ) + internal + view + returns ( + uint256, + uint256, + uint256 + ) + { + (uint256 userStableDebt, uint256 userVariableDebt) = Helpers.getUserCurrentDebt( + params.user, + debtReserveCache + ); + + uint256 userTotalDebt = userStableDebt + userVariableDebt; + + uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD + ? DEFAULT_LIQUIDATION_CLOSE_FACTOR + : MAX_LIQUIDATION_CLOSE_FACTOR; + + uint256 maxLiquidatableDebt = userTotalDebt.percentMul(closeFactor); + + uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt + ? maxLiquidatableDebt + : params.debtToCover; + + return (userVariableDebt, userTotalDebt, actualDebtToLiquidate); + } + + /** + * @notice Returns the configuration data for the debt and the collateral reserves. + * @param eModeCategories The configuration of all the efficiency mode categories + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @return The collateral aToken + * @return The address to use as price source for the collateral + * @return The address to use as price source for the debt + * @return The liquidation bonus to apply to the collateral + */ + function _getConfigurationData( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params + ) + internal + view + returns ( + IAToken, + address, + address, + uint256 + ) + { + IAToken collateralAToken = IAToken(collateralReserve.aTokenAddress); + uint256 liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); + + address collateralPriceSource = params.collateralAsset; + address debtPriceSource = params.debtAsset; + + if (params.userEModeCategory != 0) { + address eModePriceSource = eModeCategories[params.userEModeCategory].priceSource; + + if ( + EModeLogic.isInEModeCategory( + params.userEModeCategory, + collateralReserve.configuration.getEModeCategory() + ) + ) { + liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; + + if (eModePriceSource != address(0)) { + collateralPriceSource = eModePriceSource; + } + } + + // when in eMode, debt will always be in the same eMode category, can skip matching category check + if (eModePriceSource != address(0)) { + debtPriceSource = eModePriceSource; + } + } + + return (collateralAToken, collateralPriceSource, debtPriceSource, liquidationBonus); + } + + struct AvailableCollateralToLiquidateLocalVars { + uint256 collateralPrice; + uint256 debtAssetPrice; + uint256 maxCollateralToLiquidate; + uint256 baseCollateral; + uint256 bonusCollateral; + uint256 debtAssetDecimals; + uint256 collateralDecimals; + uint256 collateralAssetUnit; + uint256 debtAssetUnit; + uint256 collateralAmount; + uint256 debtAmountNeeded; + uint256 liquidationProtocolFeePercentage; + uint256 liquidationProtocolFee; + } + + /** + * @notice Calculates how much of a specific collateral can be liquidated, given + * a certain amount of debt asset. + * @dev This function needs to be called after all the checks to validate the liquidation have been performed, + * otherwise it might fail. + * @param collateralReserve The data of the collateral reserve + * @param debtReserveCache The cached data of the debt reserve + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated + * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation + * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) + * @return The amount to repay with the liquidation + * @return The fee taken from the liquidation bonus amount to be paid to the protocol + **/ + function _calculateAvailableCollateralToLiquidate( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveCache memory debtReserveCache, + address collateralAsset, + address debtAsset, + uint256 debtToCover, + uint256 userCollateralBalance, + uint256 liquidationBonus, + IPriceOracleGetter oracle + ) + internal + view + returns ( + uint256, + uint256, + uint256 + ) + { + AvailableCollateralToLiquidateLocalVars memory vars; + + vars.collateralPrice = oracle.getAssetPrice(collateralAsset); + vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); + + vars.collateralDecimals = collateralReserve.configuration.getDecimals(); + vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); + + unchecked { + vars.collateralAssetUnit = 10**vars.collateralDecimals; + vars.debtAssetUnit = 10**vars.debtAssetDecimals; + } + + vars.liquidationProtocolFeePercentage = collateralReserve + .configuration + .getLiquidationProtocolFee(); + + // This is the base collateral to liquidate based on the given debt to cover + vars.baseCollateral = + ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / + (vars.collateralPrice * vars.debtAssetUnit); + + vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); + + if (vars.maxCollateralToLiquidate > userCollateralBalance) { + vars.collateralAmount = userCollateralBalance; + vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / + (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); + } else { + vars.collateralAmount = vars.maxCollateralToLiquidate; + vars.debtAmountNeeded = debtToCover; + } + + if (vars.liquidationProtocolFeePercentage != 0) { + vars.bonusCollateral = + vars.collateralAmount - + vars.collateralAmount.percentDiv(liquidationBonus); + + vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( + vars.liquidationProtocolFeePercentage + ); + + return ( + vars.collateralAmount - vars.liquidationProtocolFee, + vars.debtAmountNeeded, + vars.liquidationProtocolFee + ); + } else { + return (vars.collateralAmount, vars.debtAmountNeeded, 0); + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/PoolLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/PoolLogic.sol new file mode 100644 index 00000000..954066fd --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/PoolLogic.sol @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; + +/** + * @title PoolLogic library + * @author Aave + * @notice Implements the logic for Pool specific functions + */ +library PoolLogic { + using GPv2SafeERC20 for IERC20; + using WadRayMath for uint256; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice Initialize an asset reserve and add the reserve to the list of reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param params Additional parameters needed for initiation + * @return true if appended, false if inserted at existing empty spot + **/ + function executeInitReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.InitReserveParams memory params + ) external returns (bool) { + require(Address.isContract(params.asset), Errors.NOT_CONTRACT); + reservesData[params.asset].init( + params.aTokenAddress, + params.stableDebtAddress, + params.variableDebtAddress, + params.interestRateStrategyAddress + ); + + bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || + reservesList[0] == params.asset; + require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); + + for (uint16 i = 0; i < params.reservesCount; i++) { + if (reservesList[i] == address(0)) { + reservesData[params.asset].id = i; + reservesList[i] = params.asset; + return false; + } + } + + require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); + reservesData[params.asset].id = params.reservesCount; + reservesList[params.reservesCount] = params.asset; + return true; + } + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function executeRescueTokens( + address token, + address to, + uint256 amount + ) external { + IERC20(token).safeTransfer(to, amount); + } + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param reservesData The state of all the reserves + * @param assets The list of reserves for which the minting needs to be executed + **/ + function executeMintToTreasury( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] calldata assets + ) external { + for (uint256 i = 0; i < assets.length; i++) { + address assetAddress = assets[i]; + + DataTypes.ReserveData storage reserve = reservesData[assetAddress]; + + // this cover both inactive reserves and invalid reserves since the flag will be 0 for both + if (!reserve.configuration.getActive()) { + continue; + } + + uint256 accruedToTreasury = reserve.accruedToTreasury; + + if (accruedToTreasury != 0) { + reserve.accruedToTreasury = 0; + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); + IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); + + emit MintedToTreasury(assetAddress, amountToMint); + } + } + } + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function executeResetIsolationModeTotalDebt( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset + ) external { + require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); + reservesData[asset].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(asset, 0); + } + + /** + * @notice Drop a reserve + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param asset The address of the underlying asset of the reserve + **/ + function executeDropReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + address asset + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + ValidationLogic.validateDropReserve(reservesList, reserve, asset); + reservesList[reservesData[asset].id] = address(0); + delete reservesData[asset]; + } + + /** + * @notice Returns the user account data across all the reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the calculation + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + **/ + function executeGetUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ) + { + ( + totalCollateralBase, + totalDebtBase, + ltv, + currentLiquidationThreshold, + healthFactor, + + ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); + + availableBorrowsBase = GenericLogic.calculateAvailableBorrows( + totalCollateralBase, + totalDebtBase, + ltv + ); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..a946c381 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,362 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IStableDebtToken} from '../../../interfaces/IStableDebtToken.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + **/ + function getNormalizedIncome(DataTypes.ReserveData storage reserve) + internal + view + returns (uint256) + { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + **/ + function getNormalizedDebt(DataTypes.ReserveData storage reserve) + internal + view + returns (uint256) + { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + **/ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + **/ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param stableDebtTokenAddress The address of the overlying stable debt token contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + **/ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.stableDebtTokenAddress = stableDebtTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + struct UpdateInterestRatesLocalVars { + uint256 nextLiquidityRate; + uint256 nextStableRate; + uint256 nextVariableRate; + uint256 totalVariableDebt; + } + + /** + * @notice Updates the reserve current stable borrow rate, the current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + **/ + function updateInterestRates( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + UpdateInterestRatesLocalVars memory vars; + + vars.totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + ( + vars.nextLiquidityRate, + vars.nextStableRate, + vars.nextVariableRate + ) = IReserveInterestRateStrategy(reserve.interestRateStrategyAddress).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserveCache.reserveConfiguration.getUnbackedMintCap() != 0 + ? reserve.unbacked + : 0, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalStableDebt: reserveCache.nextTotalStableDebt, + totalVariableDebt: vars.totalVariableDebt, + averageStableBorrowRate: reserveCache.nextAvgStableBorrowRate, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + aToken: reserveCache.aTokenAddress + }) + ); + + reserve.currentLiquidityRate = vars.nextLiquidityRate.toUint128(); + reserve.currentStableBorrowRate = vars.nextStableRate.toUint128(); + reserve.currentVariableBorrowRate = vars.nextVariableRate.toUint128(); + + emit ReserveDataUpdated( + reserveAddress, + vars.nextLiquidityRate, + vars.nextStableRate, + vars.nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + struct AccrueToTreasuryLocalVars { + uint256 prevTotalStableDebt; + uint256 prevTotalVariableDebt; + uint256 currTotalVariableDebt; + uint256 cumulatedStableInterest; + uint256 totalDebtAccrued; + uint256 amountToMint; + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + **/ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + AccrueToTreasuryLocalVars memory vars; + + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + vars.prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + vars.currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //calculate the stable debt until the last timestamp update + vars.cumulatedStableInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currAvgStableBorrowRate, + reserveCache.stableDebtLastUpdateTimestamp, + reserveCache.reserveLastUpdateTimestamp + ); + + vars.prevTotalStableDebt = reserveCache.currPrincipalStableDebt.rayMul( + vars.cumulatedStableInterest + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + vars.totalDebtAccrued = + vars.currTotalVariableDebt + + reserveCache.currTotalStableDebt - + vars.prevTotalVariableDebt - + vars.prevTotalStableDebt; + + vars.amountToMint = vars.totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (vars.amountToMint != 0) { + reserve.accruedToTreasury += vars + .amountToMint + .rayDiv(reserveCache.nextLiquidityIndex) + .toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + **/ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + reserveCache.nextLiquidityIndex = reserveCache.currLiquidityIndex; + reserveCache.nextVariableBorrowIndex = reserveCache.currVariableBorrowIndex; + + //only cumulating if there is any income being produced + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + + //as the liquidity rate might come only from stable rate loans, we need to ensure + //that there is actual variable debt before accumulating + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache(DataTypes.ReserveData storage reserve) + internal + view + returns (DataTypes.ReserveCache memory) + { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserve.variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.stableDebtTokenAddress = reserve.stableDebtTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + ( + reserveCache.currPrincipalStableDebt, + reserveCache.currTotalStableDebt, + reserveCache.currAvgStableBorrowRate, + reserveCache.stableDebtLastUpdateTimestamp + ) = IStableDebtToken(reserveCache.stableDebtTokenAddress).getSupplyData(); + + // by default the actions are considered as not affecting the debt balances. + // if the action involves mint/burn of debt, the cache needs to be updated + reserveCache.nextTotalStableDebt = reserveCache.currTotalStableDebt; + reserveCache.nextAvgStableBorrowRate = reserveCache.currAvgStableBorrowRate; + + return reserveCache; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol new file mode 100644 index 00000000..98ad8e8f --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol @@ -0,0 +1,290 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; + +/** + * @title SupplyLogic library + * @author Aave + * @notice Implements the base logic for supply/withdraw + */ +library SupplyLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. + * @dev Emits the `Supply()` event. + * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as + * collateral. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the supply function + */ + function executeSupply( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSupplyParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, params.amount); + + reserve.updateInterestRates(reserveCache, params.asset, params.amount, 0); + + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + params.onBehalfOf, + params.amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); + } + } + + emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); + } + + /** + * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset + * previously supplied in the Aave protocol. + * @dev Emits the `Withdraw()` event. + * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the withdraw function + * @return The actual amount withdrawn + */ + function executeWithdraw( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteWithdrawParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( + reserveCache.nextLiquidityIndex + ); + + uint256 amountToWithdraw = params.amount; + + if (params.amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + + ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); + + reserve.updateInterestRates(reserveCache, params.asset, 0, amountToWithdraw); + + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + params.to, + amountToWithdraw, + reserveCache.nextLiquidityIndex + ); + + if (userConfig.isUsingAsCollateral(reserve.id)) { + if (userConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + params.asset, + msg.sender, + params.reservesCount, + params.oracle, + params.userEModeCategory + ); + } + + if (amountToWithdraw == userBalance) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + } + + emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); + + return amountToWithdraw; + } + + /** + * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid + * collateralization constraints violation. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as + * collateral. + * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param params The additional parameters needed to execute the finalizeTransfer function + */ + function executeFinalizeTransfer( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.FinalizeTransferParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + + ValidationLogic.validateTransfer(reserve); + + uint256 reserveId = reserve.id; + + if (params.from != params.to && params.amount != 0) { + DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; + + if (fromConfig.isUsingAsCollateral(reserveId)) { + if (fromConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + usersConfig[params.from], + params.asset, + params.from, + params.reservesCount, + params.oracle, + params.fromEModeCategory + ); + } + if (params.balanceFromBefore == params.amount) { + fromConfig.setUsingAsCollateral(reserveId, false); + emit ReserveUsedAsCollateralDisabled(params.asset, params.from); + } + } + + if (params.balanceToBefore == 0) { + DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; + if ( + ValidationLogic.validateUseAsCollateral( + reservesData, + reservesList, + toConfig, + reserve.configuration + ) + ) { + toConfig.setUsingAsCollateral(reserveId, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.to); + } + } + } + } + + /** + * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as + * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor + * checks to ensure collateralization. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. + * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The users configuration mapping that track the supplied/borrowed assets + * @param asset The address of the asset being configured as collateral + * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise + * @param reservesCount The number of initialized reserves + * @param priceOracle The address of the price oracle + * @param userEModeCategory The eMode category chosen by the user + */ + function executeUseReserveAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + bool useAsCollateral, + uint256 reservesCount, + address priceOracle, + uint8 userEModeCategory + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); + + ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); + + if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; + + if (useAsCollateral) { + require( + ValidationLogic.validateUseAsCollateral(reservesData, reservesList, userConfig, reserveCache.reserveConfiguration), + Errors.USER_IN_ISOLATION_MODE + ); + + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, msg.sender); + } else { + userConfig.setUsingAsCollateral(reserve.id, false); + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + asset, + msg.sender, + reservesCount, + priceOracle, + userEModeCategory + ); + + emit ReserveUsedAsCollateralDisabled(asset, msg.sender); + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..fb2eda0c --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,726 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IStableDebtToken} from '../../../interfaces/IStableDebtToken.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply(DataTypes.ReserveCache memory reserveCache, uint256 amount) + internal + view + { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , , bool isPaused) = reserveCache + .reserveConfiguration + .getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + (IAToken(reserveCache.aTokenAddress).scaledTotalSupply().rayMul( + reserveCache.nextLiquidityIndex + ) + amount) <= + supplyCap * (10**reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address eModePriceSource; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool stableRateBorrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + ( + vars.isActive, + vars.isFrozen, + vars.borrowingEnabled, + vars.stableRateBorrowingEnabled, + vars.isPaused + ) = params.reserveCache.reserveConfiguration.getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE || + params.interestRateMode == DataTypes.InterestRateMode.STABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10**vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = + params.reserveCache.currTotalStableDebt + + vars.totalSupplyVariableDebt + + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / 10**(vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + params.reserveCache.reserveConfiguration.getEModeCategory() == params.userEModeCategory, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + vars.eModePriceSource = eModeCategories[params.userEModeCategory].priceSource; + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice( + vars.eModePriceSource != address(0) ? vars.eModePriceSource : params.asset + ) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + /** + * Following conditions need to be met if the user is borrowing at a stable rate: + * 1. Reserve must be enabled for stable rate borrowing + * 2. Users cannot borrow from the reserve if their collateral is (mostly) the same currency + * they are borrowing, to prevent abuses. + * 3. Users will be able to borrow only a portion of the total available liquidity + **/ + + if (params.interestRateMode == DataTypes.InterestRateMode.STABLE) { + //check if the borrow mode is stable and if stable rate borrowing is enabled on this reserve + + require(vars.stableRateBorrowingEnabled, Errors.STABLE_BORROWING_NOT_ENABLED); + + require( + !params.userConfig.isUsingAsCollateral(reservesData[params.asset].id) || + params.reserveCache.reserveConfiguration.getLtv() == 0 || + params.amount > IERC20(params.reserveCache.aTokenAddress).balanceOf(params.userAddress), + Errors.COLLATERAL_SAME_AS_BORROWING_CURRENCY + ); + + vars.availableLiquidity = IERC20(params.asset).balanceOf(params.reserveCache.aTokenAddress); + + //calculate the max available loan size in stable rate mode as a percentage of the + //available liquidity + uint256 maxLoanSizeStable = vars.availableLiquidity.percentMul(params.maxStableLoanPercent); + + require(params.amount <= maxLoanSizeStable, Errors.AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE); + } + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param interestRateMode The interest rate mode of the debt being repaid + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param stableDebt The borrow balance of the user + * @param variableDebt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 stableDebt, + uint256 variableDebt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + uint256 variableDebtPreviousIndex = IScaledBalanceToken(reserveCache.variableDebtTokenAddress) + .getPreviousIndex(onBehalfOf); + + uint40 stableRatePreviousTimestamp = IStableDebtToken(reserveCache.stableDebtTokenAddress) + .getUserLastUpdated(onBehalfOf); + + require( + (stableRatePreviousTimestamp < uint40(block.timestamp) && + interestRateMode == DataTypes.InterestRateMode.STABLE) || + (variableDebtPreviousIndex < reserveCache.nextVariableBorrowIndex && + interestRateMode == DataTypes.InterestRateMode.VARIABLE), + Errors.SAME_BLOCK_BORROW_REPAY + ); + + require( + (stableDebt != 0 && interestRateMode == DataTypes.InterestRateMode.STABLE) || + (variableDebt != 0 && interestRateMode == DataTypes.InterestRateMode.VARIABLE), + Errors.NO_DEBT_OF_SELECTED_TYPE + ); + } + + /** + * @notice Validates a swap of borrow rate mode. + * @param reserve The reserve state on which the user is swapping the rate + * @param reserveCache The cached data of the reserve + * @param userConfig The user reserves configuration + * @param stableDebt The stable debt of the user + * @param variableDebt The variable debt of the user + * @param currentRateMode The rate mode of the debt being swapped + */ + function validateSwapRateMode( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + DataTypes.UserConfigurationMap storage userConfig, + uint256 stableDebt, + uint256 variableDebt, + DataTypes.InterestRateMode currentRateMode + ) internal view { + (bool isActive, bool isFrozen, , bool stableRateEnabled, bool isPaused) = reserveCache + .reserveConfiguration + .getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + + if (currentRateMode == DataTypes.InterestRateMode.STABLE) { + require(stableDebt != 0, Errors.NO_OUTSTANDING_STABLE_DEBT); + } else if (currentRateMode == DataTypes.InterestRateMode.VARIABLE) { + require(variableDebt != 0, Errors.NO_OUTSTANDING_VARIABLE_DEBT); + /** + * user wants to swap to stable, before swapping we need to ensure that + * 1. stable borrow rate is enabled on the reserve + * 2. user is not trying to abuse the reserve by supplying + * more collateral than he is borrowing, artificially lowering + * the interest rate, borrowing at variable, and switching to stable + **/ + require(stableRateEnabled, Errors.STABLE_BORROWING_NOT_ENABLED); + + require( + !userConfig.isUsingAsCollateral(reserve.id) || + reserveCache.reserveConfiguration.getLtv() == 0 || + stableDebt + variableDebt > IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender), + Errors.COLLATERAL_SAME_AS_BORROWING_CURRENCY + ); + } else { + revert(Errors.INVALID_INTEREST_RATE_MODE_SELECTED); + } + } + + /** + * @notice Validates a stable borrow rate rebalance action. + * @dev Rebalancing is accepted when depositors are earning <= 90% of their earnings in pure supply/demand market (variable rate only) + * For this to be the case, there has to be quite large stable debt with an interest rate below the current variable rate. + * @param reserve The reserve state on which the user is getting rebalanced + * @param reserveCache The cached state of the reserve + * @param reserveAddress The address of the reserve + */ + function validateRebalanceStableBorrowRate( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress + ) internal view { + (bool isActive, , , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + uint256 totalDebt = IERC20(reserveCache.stableDebtTokenAddress).totalSupply() + + IERC20(reserveCache.variableDebtTokenAddress).totalSupply(); + + (uint256 liquidityRateVariableDebtOnly, , ) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: 0, + liquidityTaken: 0, + totalStableDebt: 0, + totalVariableDebt: totalDebt, + averageStableBorrowRate: 0, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + aToken: reserveCache.aTokenAddress + }) + ); + + require( + reserveCache.currLiquidityRate <= + liquidityRateVariableDebtOnly.percentMul(REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD), + Errors.INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET + ); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + DataTypes.ReserveConfigurationMap memory configuration = reservesData[assets[i]] + .configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple(DataTypes.ReserveData storage reserve) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + **/ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require(IERC20(reserve.stableDebtTokenAddress).totalSupply() == 0, Errors.STABLE_DEBT_NOT_ZERO); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require(IERC20(reserve.aTokenAddress).totalSupply() == 0, Errors.ATOKEN_SUPPLY_NOT_ZERO); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + **/ + function validateSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategories[categoryId].liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + //eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + DataTypes.ReserveConfigurationMap memory configuration = reservesData[reservesList[i]] + .configuration; + require( + configuration.getEModeCategory() == categoryId, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + } + } + } + } + } + + /** + * @notice Validates if an asset can be activated as collateral in the following actions: supply, transfer, + * set as collateral, mint unbacked, and liquidate + * @dev This is used to ensure that the constraints for isolated assets are respected by all the actions that + * generate transfers of aTokens + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + **/ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..bd6e0838 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + **/ + function calculateLinearInterest(uint256 rate, uint40 lastUpdateTimestamp) + internal + view + returns (uint256) + { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + **/ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + **/ + function calculateCompoundedInterest(uint256 rate, uint40 lastUpdateTimestamp) + internal + view + returns (uint256) + { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..5306105b --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + **/ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + **/ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + **/ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..dbe1a40d --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + **/ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + **/ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + **/ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + **/ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + **/ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + **/ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + **/ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol new file mode 100644 index 00000000..61de06a3 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +library ConfiguratorInputTypes { + struct InitReserveInput { + address aTokenImpl; + address stableDebtTokenImpl; + address variableDebtTokenImpl; + uint8 underlyingAssetDecimals; + address interestRateStrategyAddress; + address underlyingAsset; + address treasury; + address incentivesController; + string aTokenName; + string aTokenSymbol; + string variableDebtTokenName; + string variableDebtTokenSymbol; + string stableDebtTokenName; + string stableDebtTokenSymbol; + bytes params; + } + + struct UpdateATokenInput { + address asset; + address treasury; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } + + struct UpdateDebtTokenInput { + address asset; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..7113a0a5 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,268 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +library DataTypes { + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + //the current stable borrow rate. Expressed in ray + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + //stableDebtToken address + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62-63: reserved + //bit 64-79: reserve factor + //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167 liquidation protocol fee + //bit 168-175 eMode category + //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // each eMode category may or may not have a custom oracle to override the individual assets price oracles + address priceSource; + string label; + } + + enum InterestRateMode { + NONE, + STABLE, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currPrincipalStableDebt; + uint256 currAvgStableBorrowRate; + uint256 currTotalStableDebt; + uint256 nextAvgStableBorrowRate; + uint256 nextTotalStableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address stableDebtTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + uint40 stableDebtLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address addressesProvider; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 maxStableLoanPercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalStableDebt; + uint256 totalVariableDebt; + uint256 averageStableBorrowRate; + uint256 reserveFactor; + address reserve; + address aToken; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address stableDebtAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol new file mode 100644 index 00000000..7d082a96 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol @@ -0,0 +1,299 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {WadRayMath} from '../libraries/math/WadRayMath.sol'; +import {PercentageMath} from '../libraries/math/PercentageMath.sol'; +import {DataTypes} from '../libraries/types/DataTypes.sol'; +import {IReserveInterestRateStrategy} from '../../interfaces/IReserveInterestRateStrategy.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; + +/** + * @title DefaultReserveInterestRateStrategy contract + * @author Aave + * @notice Implements the calculation of the interest rates depending on the reserve state + * @dev The model of interest rate is based on 2 slopes, one before the `OPTIMAL_USAGE_RATIO` + * point of usage and another from that one to 100%. + * - An instance of this same contract, can't be used across different Aave markets, due to the caching + * of the PoolAddressesProvider + **/ +contract DefaultReserveInterestRateStrategy is IReserveInterestRateStrategy { + using WadRayMath for uint256; + using PercentageMath for uint256; + + /** + * @dev This constant represents the usage ratio at which the pool aims to obtain most competitive borrow rates. + * Expressed in ray + **/ + uint256 public immutable OPTIMAL_USAGE_RATIO; + + /** + * @dev This constant represents the optimal stable debt to total debt ratio of the reserve. + * Expressed in ray + */ + uint256 public immutable OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO; + + /** + * @dev This constant represents the excess usage ratio above the optimal. It's always equal to + * 1-optimal usage ratio. Added as a constant here for gas optimizations. + * Expressed in ray + **/ + uint256 public immutable MAX_EXCESS_USAGE_RATIO; + + /** + * @dev This constant represents the excess stable debt ratio above the optimal. It's always equal to + * 1-optimal stable to total debt ratio. Added as a constant here for gas optimizations. + * Expressed in ray + **/ + uint256 public immutable MAX_EXCESS_STABLE_TO_TOTAL_DEBT_RATIO; + + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + // Base variable borrow rate when usage rate = 0. Expressed in ray + uint256 internal immutable _baseVariableBorrowRate; + + // Slope of the variable interest curve when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO. Expressed in ray + uint256 internal immutable _variableRateSlope1; + + // Slope of the variable interest curve when usage ratio > OPTIMAL_USAGE_RATIO. Expressed in ray + uint256 internal immutable _variableRateSlope2; + + // Slope of the stable interest curve when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO. Expressed in ray + uint256 internal immutable _stableRateSlope1; + + // Slope of the stable interest curve when usage ratio > OPTIMAL_USAGE_RATIO. Expressed in ray + uint256 internal immutable _stableRateSlope2; + + // Premium on top of `_variableRateSlope1` for base stable borrowing rate + uint256 internal immutable _baseStableRateOffset; + + // Additional premium applied to stable rate when stable debt surpass `OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO` + uint256 internal immutable _stableRateExcessOffset; + + /** + * @dev Constructor. + * @param provider The address of the PoolAddressesProvider contract + * @param optimalUsageRatio The optimal usage ratio + * @param baseVariableBorrowRate The base variable borrow rate + * @param variableRateSlope1 The variable rate slope below optimal usage ratio + * @param variableRateSlope2 The variable rate slope above optimal usage ratio + * @param stableRateSlope1 The stable rate slope below optimal usage ratio + * @param stableRateSlope2 The stable rate slope above optimal usage ratio + * @param baseStableRateOffset The premium on top of variable rate for base stable borrowing rate + * @param stableRateExcessOffset The premium on top of stable rate when there stable debt surpass the threshold + * @param optimalStableToTotalDebtRatio The optimal stable debt to total debt ratio of the reserve + */ + constructor( + IPoolAddressesProvider provider, + uint256 optimalUsageRatio, + uint256 baseVariableBorrowRate, + uint256 variableRateSlope1, + uint256 variableRateSlope2, + uint256 stableRateSlope1, + uint256 stableRateSlope2, + uint256 baseStableRateOffset, + uint256 stableRateExcessOffset, + uint256 optimalStableToTotalDebtRatio + ) { + require(WadRayMath.RAY >= optimalUsageRatio, Errors.INVALID_OPTIMAL_USAGE_RATIO); + require( + WadRayMath.RAY >= optimalStableToTotalDebtRatio, + Errors.INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO + ); + OPTIMAL_USAGE_RATIO = optimalUsageRatio; + MAX_EXCESS_USAGE_RATIO = WadRayMath.RAY - optimalUsageRatio; + OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = optimalStableToTotalDebtRatio; + MAX_EXCESS_STABLE_TO_TOTAL_DEBT_RATIO = WadRayMath.RAY - optimalStableToTotalDebtRatio; + ADDRESSES_PROVIDER = provider; + _baseVariableBorrowRate = baseVariableBorrowRate; + _variableRateSlope1 = variableRateSlope1; + _variableRateSlope2 = variableRateSlope2; + _stableRateSlope1 = stableRateSlope1; + _stableRateSlope2 = stableRateSlope2; + _baseStableRateOffset = baseStableRateOffset; + _stableRateExcessOffset = stableRateExcessOffset; + } + + /** + * @notice Returns the variable rate slope below optimal usage ratio + * @dev Its the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO + * @return The variable rate slope + **/ + function getVariableRateSlope1() external view returns (uint256) { + return _variableRateSlope1; + } + + /** + * @notice Returns the variable rate slope above optimal usage ratio + * @dev Its the variable rate when usage ratio > OPTIMAL_USAGE_RATIO + * @return The variable rate slope + **/ + function getVariableRateSlope2() external view returns (uint256) { + return _variableRateSlope2; + } + + /** + * @notice Returns the stable rate slope below optimal usage ratio + * @dev Its the stable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO + * @return The stable rate slope + **/ + function getStableRateSlope1() external view returns (uint256) { + return _stableRateSlope1; + } + + /** + * @notice Returns the stable rate slope above optimal usage ratio + * @dev Its the variable rate when usage ratio > OPTIMAL_USAGE_RATIO + * @return The stable rate slope + **/ + function getStableRateSlope2() external view returns (uint256) { + return _stableRateSlope2; + } + + /** + * @notice Returns the stable rate excess offset + * @dev An additional premium applied to the stable when stable debt > OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO + * @return The stable rate excess offset + */ + function getStableRateExcessOffset() external view returns (uint256) { + return _stableRateExcessOffset; + } + + /** + * @notice Returns the base stable borrow rate + * @return The base stable borrow rate + **/ + function getBaseStableBorrowRate() public view returns (uint256) { + return _variableRateSlope1 + _baseStableRateOffset; + } + + /// @inheritdoc IReserveInterestRateStrategy + function getBaseVariableBorrowRate() external view override returns (uint256) { + return _baseVariableBorrowRate; + } + + /// @inheritdoc IReserveInterestRateStrategy + function getMaxVariableBorrowRate() external view override returns (uint256) { + return _baseVariableBorrowRate + _variableRateSlope1 + _variableRateSlope2; + } + + struct CalcInterestRatesLocalVars { + uint256 availableLiquidity; + uint256 totalDebt; + uint256 currentVariableBorrowRate; + uint256 currentStableBorrowRate; + uint256 currentLiquidityRate; + uint256 borrowUsageRatio; + uint256 supplyUsageRatio; + uint256 stableToTotalDebtRatio; + uint256 availableLiquidityPlusDebt; + } + + /// @inheritdoc IReserveInterestRateStrategy + function calculateInterestRates(DataTypes.CalculateInterestRatesParams calldata params) + external + view + override + returns ( + uint256, + uint256, + uint256 + ) + { + CalcInterestRatesLocalVars memory vars; + + vars.totalDebt = params.totalStableDebt + params.totalVariableDebt; + + vars.currentLiquidityRate = 0; + vars.currentVariableBorrowRate = _baseVariableBorrowRate; + vars.currentStableBorrowRate = getBaseStableBorrowRate(); + + if (vars.totalDebt != 0) { + vars.stableToTotalDebtRatio = params.totalStableDebt.rayDiv(vars.totalDebt); + vars.availableLiquidity = + IERC20(params.reserve).balanceOf(params.aToken) + + params.liquidityAdded - + params.liquidityTaken; + + vars.availableLiquidityPlusDebt = vars.availableLiquidity + vars.totalDebt; + vars.borrowUsageRatio = vars.totalDebt.rayDiv(vars.availableLiquidityPlusDebt); + vars.supplyUsageRatio = vars.totalDebt.rayDiv( + vars.availableLiquidityPlusDebt + params.unbacked + ); + } + + if (vars.borrowUsageRatio > OPTIMAL_USAGE_RATIO) { + uint256 excessBorrowUsageRatio = (vars.borrowUsageRatio - OPTIMAL_USAGE_RATIO).rayDiv( + MAX_EXCESS_USAGE_RATIO + ); + + vars.currentStableBorrowRate += + _stableRateSlope1 + + _stableRateSlope2.rayMul(excessBorrowUsageRatio); + + vars.currentVariableBorrowRate += + _variableRateSlope1 + + _variableRateSlope2.rayMul(excessBorrowUsageRatio); + } else { + vars.currentStableBorrowRate += _stableRateSlope1.rayMul(vars.borrowUsageRatio).rayDiv( + OPTIMAL_USAGE_RATIO + ); + + vars.currentVariableBorrowRate += _variableRateSlope1.rayMul(vars.borrowUsageRatio).rayDiv( + OPTIMAL_USAGE_RATIO + ); + } + + if (vars.stableToTotalDebtRatio > OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO) { + uint256 excessStableDebtRatio = (vars.stableToTotalDebtRatio - + OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO).rayDiv(MAX_EXCESS_STABLE_TO_TOTAL_DEBT_RATIO); + vars.currentStableBorrowRate += _stableRateExcessOffset.rayMul(excessStableDebtRatio); + } + + vars.currentLiquidityRate = _getOverallBorrowRate( + params.totalStableDebt, + params.totalVariableDebt, + vars.currentVariableBorrowRate, + params.averageStableBorrowRate + ).rayMul(vars.supplyUsageRatio).percentMul( + PercentageMath.PERCENTAGE_FACTOR - params.reserveFactor + ); + + return ( + vars.currentLiquidityRate, + vars.currentStableBorrowRate, + vars.currentVariableBorrowRate + ); + } + + /** + * @dev Calculates the overall borrow rate as the weighted average between the total variable debt and total stable + * debt + * @param totalStableDebt The total borrowed from the reserve at a stable rate + * @param totalVariableDebt The total borrowed from the reserve at a variable rate + * @param currentVariableBorrowRate The current variable borrow rate of the reserve + * @param currentAverageStableBorrowRate The current weighted average of all the stable rate loans + * @return The weighted averaged borrow rate + **/ + function _getOverallBorrowRate( + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 currentVariableBorrowRate, + uint256 currentAverageStableBorrowRate + ) internal pure returns (uint256) { + uint256 totalDebt = totalStableDebt + totalVariableDebt; + + if (totalDebt == 0) return 0; + + uint256 weightedVariableRate = totalVariableDebt.wadToRay().rayMul(currentVariableBorrowRate); + + uint256 weightedStableRate = totalStableDebt.wadToRay().rayMul(currentAverageStableBorrowRate); + + uint256 overallBorrowRate = (weightedVariableRate + weightedStableRate).rayDiv( + totalDebt.wadToRay() + ); + + return overallBorrowRate; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/L2Pool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/L2Pool.sol new file mode 100644 index 00000000..0e2b5a1c --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/L2Pool.sol @@ -0,0 +1,135 @@ +pragma solidity ^0.8.10; + +import {Pool} from './Pool.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {IL2Pool} from '../../interfaces/IL2Pool.sol'; +import {CalldataLogic} from '../libraries/logic/CalldataLogic.sol'; + +/** + * @title L2Pool + * @author Aave + * @notice Calldata optimized extension of the Pool contract allowing users to pass compact calldata representation + * to reduce transaction costs on rollups. + */ +contract L2Pool is Pool, IL2Pool { + /** + * @dev Constructor. + * @param provider The address of the PoolAddressesProvider contract + */ + constructor(IPoolAddressesProvider provider) Pool(provider) { + // Intentionally left blank + } + + /// @inheritdoc IL2Pool + function supply(bytes32 args) external override { + (address asset, uint256 amount, uint16 referralCode) = CalldataLogic.decodeSupplyParams( + _reservesList, + args + ); + + supply(asset, amount, msg.sender, referralCode); + } + + /// @inheritdoc IL2Pool + function supplyWithPermit( + bytes32 args, + bytes32 r, + bytes32 s + ) external override { + (address asset, uint256 amount, uint16 referralCode, uint256 deadline, uint8 v) = CalldataLogic + .decodeSupplyWithPermitParams(_reservesList, args); + + supplyWithPermit(asset, amount, msg.sender, referralCode, deadline, v, r, s); + } + + /// @inheritdoc IL2Pool + function withdraw(bytes32 args) external override { + (address asset, uint256 amount) = CalldataLogic.decodeWithdrawParams(_reservesList, args); + + withdraw(asset, amount, msg.sender); + } + + /// @inheritdoc IL2Pool + function borrow(bytes32 args) external override { + (address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode) = CalldataLogic + .decodeBorrowParams(_reservesList, args); + + borrow(asset, amount, interestRateMode, referralCode, msg.sender); + } + + /// @inheritdoc IL2Pool + function repay(bytes32 args) external override returns (uint256) { + (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( + _reservesList, + args + ); + + return repay(asset, amount, interestRateMode, msg.sender); + } + + /// @inheritdoc IL2Pool + function repayWithPermit( + bytes32 args, + bytes32 r, + bytes32 s + ) external override returns (uint256) { + ( + address asset, + uint256 amount, + uint256 interestRateMode, + uint256 deadline, + uint8 v + ) = CalldataLogic.decodeRepayWithPermitParams(_reservesList, args); + + return repayWithPermit(asset, amount, interestRateMode, msg.sender, deadline, v, r, s); + } + + /// @inheritdoc IL2Pool + function repayWithATokens(bytes32 args) external override returns (uint256) { + (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( + _reservesList, + args + ); + + return repayWithATokens(asset, amount, interestRateMode); + } + + /// @inheritdoc IL2Pool + function swapBorrowRateMode(bytes32 args) external override { + (address asset, uint256 interestRateMode) = CalldataLogic.decodeSwapBorrowRateModeParams( + _reservesList, + args + ); + swapBorrowRateMode(asset, interestRateMode); + } + + /// @inheritdoc IL2Pool + function rebalanceStableBorrowRate(bytes32 args) external override { + (address asset, address user) = CalldataLogic.decodeRebalanceStableBorrowRateParams( + _reservesList, + args + ); + rebalanceStableBorrowRate(asset, user); + } + + /// @inheritdoc IL2Pool + function setUserUseReserveAsCollateral(bytes32 args) external override { + (address asset, bool useAsCollateral) = CalldataLogic.decodeSetUserUseReserveAsCollateralParams( + _reservesList, + args + ); + setUserUseReserveAsCollateral(asset, useAsCollateral); + } + + /// @inheritdoc IL2Pool + function liquidationCall(bytes32 args1, bytes32 args2) external override { + ( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) = CalldataLogic.decodeLiquidationCallParams(_reservesList, args1, args2); + liquidationCall(collateralAsset, debtAsset, user, debtToCover, receiveAToken); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/Pool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/Pool.sol new file mode 100644 index 00000000..b89b3b60 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/Pool.sol @@ -0,0 +1,773 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {VersionedInitializable} from '../libraries/aave-upgradeability/VersionedInitializable.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; +import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; +import {PoolLogic} from '../libraries/logic/PoolLogic.sol'; +import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; +import {EModeLogic} from '../libraries/logic/EModeLogic.sol'; +import {SupplyLogic} from '../libraries/logic/SupplyLogic.sol'; +import {FlashLoanLogic} from '../libraries/logic/FlashLoanLogic.sol'; +import {BorrowLogic} from '../libraries/logic/BorrowLogic.sol'; +import {LiquidationLogic} from '../libraries/logic/LiquidationLogic.sol'; +import {DataTypes} from '../libraries/types/DataTypes.sol'; +import {BridgeLogic} from '../libraries/logic/BridgeLogic.sol'; +import {IERC20WithPermit} from '../../interfaces/IERC20WithPermit.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../interfaces/IPool.sol'; +import {IACLManager} from '../../interfaces/IACLManager.sol'; +import {PoolStorage} from './PoolStorage.sol'; + +/** + * @title Pool contract + * @author Aave + * @notice Main point of interaction with an Aave protocol's market + * - Users can: + * # Supply + * # Withdraw + * # Borrow + * # Repay + * # Swap their loans between variable and stable rate + * # Enable/disable their supplied assets as collateral rebalance stable rate borrow positions + * # Liquidate positions + * # Execute Flash Loans + * @dev To be covered by a proxy contract, owned by the PoolAddressesProvider of the specific market + * @dev All admin functions are callable by the PoolConfigurator contract defined also in the + * PoolAddressesProvider + **/ +contract Pool is VersionedInitializable, PoolStorage, IPool { + using ReserveLogic for DataTypes.ReserveData; + + uint256 public constant POOL_REVISION = 0x1; + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @dev Only pool configurator can call functions marked by this modifier. + **/ + modifier onlyPoolConfigurator() { + _onlyPoolConfigurator(); + _; + } + + /** + * @dev Only pool admin can call functions marked by this modifier. + **/ + modifier onlyPoolAdmin() { + _onlyPoolAdmin(); + _; + } + + /** + * @dev Only bridge can call functions marked by this modifier. + **/ + modifier onlyBridge() { + _onlyBridge(); + _; + } + + function _onlyPoolConfigurator() internal view virtual { + require( + ADDRESSES_PROVIDER.getPoolConfigurator() == msg.sender, + Errors.CALLER_NOT_POOL_CONFIGURATOR + ); + } + + function _onlyPoolAdmin() internal view virtual { + require( + IACLManager(ADDRESSES_PROVIDER.getACLManager()).isPoolAdmin(msg.sender), + Errors.CALLER_NOT_POOL_ADMIN + ); + } + + function _onlyBridge() internal view virtual { + require( + IACLManager(ADDRESSES_PROVIDER.getACLManager()).isBridge(msg.sender), + Errors.CALLER_NOT_BRIDGE + ); + } + + function getRevision() internal pure virtual override returns (uint256) { + return POOL_REVISION; + } + + /** + * @dev Constructor. + * @param provider The address of the PoolAddressesProvider contract + */ + constructor(IPoolAddressesProvider provider) { + ADDRESSES_PROVIDER = provider; + } + + /** + * @notice Initializes the Pool. + * @dev Function is invoked by the proxy contract when the Pool contract is added to the + * PoolAddressesProvider of the market. + * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations + * @param provider The address of the PoolAddressesProvider + **/ + function initialize(IPoolAddressesProvider provider) external virtual initializer { + require(provider == ADDRESSES_PROVIDER, Errors.INVALID_ADDRESSES_PROVIDER); + _maxStableRateBorrowSizePercent = 0.25e4; + _flashLoanPremiumTotal = 0.0009e4; + _flashLoanPremiumToProtocol = 0; + } + + /// @inheritdoc IPool + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external virtual override onlyBridge { + BridgeLogic.executeMintUnbacked( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + asset, + amount, + onBehalfOf, + referralCode + ); + } + + /// @inheritdoc IPool + function backUnbacked( + address asset, + uint256 amount, + uint256 fee + ) external virtual override onlyBridge { + BridgeLogic.executeBackUnbacked(_reserves[asset], asset, amount, fee, _bridgeProtocolFee); + } + + /// @inheritdoc IPool + function supply( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) public virtual override { + SupplyLogic.executeSupply( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteSupplyParams({ + asset: asset, + amount: amount, + onBehalfOf: onBehalfOf, + referralCode: referralCode + }) + ); + } + + /// @inheritdoc IPool + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) public virtual override { + IERC20WithPermit(asset).permit( + msg.sender, + address(this), + amount, + deadline, + permitV, + permitR, + permitS + ); + SupplyLogic.executeSupply( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteSupplyParams({ + asset: asset, + amount: amount, + onBehalfOf: onBehalfOf, + referralCode: referralCode + }) + ); + } + + /// @inheritdoc IPool + function withdraw( + address asset, + uint256 amount, + address to + ) public virtual override returns (uint256) { + return + SupplyLogic.executeWithdraw( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[msg.sender], + DataTypes.ExecuteWithdrawParams({ + asset: asset, + amount: amount, + to: to, + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[msg.sender] + }) + ); + } + + /// @inheritdoc IPool + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) public virtual override { + BorrowLogic.executeBorrow( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[onBehalfOf], + DataTypes.ExecuteBorrowParams({ + asset: asset, + user: msg.sender, + onBehalfOf: onBehalfOf, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + referralCode: referralCode, + releaseUnderlying: true, + maxStableRateBorrowSizePercent: _maxStableRateBorrowSizePercent, + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[onBehalfOf], + priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() + }) + ); + } + + /// @inheritdoc IPool + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) public virtual override returns (uint256) { + return + BorrowLogic.executeRepay( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteRepayParams({ + asset: asset, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + onBehalfOf: onBehalfOf, + useATokens: false + }) + ); + } + + /// @inheritdoc IPool + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) public virtual override returns (uint256) { + { + IERC20WithPermit(asset).permit( + msg.sender, + address(this), + amount, + deadline, + permitV, + permitR, + permitS + ); + } + { + DataTypes.ExecuteRepayParams memory params = DataTypes.ExecuteRepayParams({ + asset: asset, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + onBehalfOf: onBehalfOf, + useATokens: false + }); + return BorrowLogic.executeRepay(_reserves, _reservesList, _usersConfig[onBehalfOf], params); + } + } + + /// @inheritdoc IPool + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) public virtual override returns (uint256) { + return + BorrowLogic.executeRepay( + _reserves, + _reservesList, + _usersConfig[msg.sender], + DataTypes.ExecuteRepayParams({ + asset: asset, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + onBehalfOf: msg.sender, + useATokens: true + }) + ); + } + + /// @inheritdoc IPool + function swapBorrowRateMode(address asset, uint256 interestRateMode) public virtual override { + BorrowLogic.executeSwapBorrowRateMode( + _reserves[asset], + _usersConfig[msg.sender], + asset, + DataTypes.InterestRateMode(interestRateMode) + ); + } + + /// @inheritdoc IPool + function rebalanceStableBorrowRate(address asset, address user) public virtual override { + BorrowLogic.executeRebalanceStableBorrowRate(_reserves[asset], asset, user); + } + + /// @inheritdoc IPool + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) + public + virtual + override + { + SupplyLogic.executeUseReserveAsCollateral( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[msg.sender], + asset, + useAsCollateral, + _reservesCount, + ADDRESSES_PROVIDER.getPriceOracle(), + _usersEModeCategory[msg.sender] + ); + } + + /// @inheritdoc IPool + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) public virtual override { + LiquidationLogic.executeLiquidationCall( + _reserves, + _reservesList, + _usersConfig, + _eModeCategories, + DataTypes.ExecuteLiquidationCallParams({ + reservesCount: _reservesCount, + debtToCover: debtToCover, + collateralAsset: collateralAsset, + debtAsset: debtAsset, + user: user, + receiveAToken: receiveAToken, + priceOracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[user], + priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() + }) + ); + } + + /// @inheritdoc IPool + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) public virtual override { + DataTypes.FlashloanParams memory flashParams = DataTypes.FlashloanParams({ + receiverAddress: receiverAddress, + assets: assets, + amounts: amounts, + interestRateModes: interestRateModes, + onBehalfOf: onBehalfOf, + params: params, + referralCode: referralCode, + flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, + flashLoanPremiumTotal: _flashLoanPremiumTotal, + maxStableRateBorrowSizePercent: _maxStableRateBorrowSizePercent, + reservesCount: _reservesCount, + addressesProvider: address(ADDRESSES_PROVIDER), + userEModeCategory: _usersEModeCategory[onBehalfOf], + isAuthorizedFlashBorrower: IACLManager(ADDRESSES_PROVIDER.getACLManager()).isFlashBorrower( + msg.sender + ) + }); + + FlashLoanLogic.executeFlashLoan( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[onBehalfOf], + flashParams + ); + } + + /// @inheritdoc IPool + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) public virtual override { + DataTypes.FlashloanSimpleParams memory flashParams = DataTypes.FlashloanSimpleParams({ + receiverAddress: receiverAddress, + asset: asset, + amount: amount, + params: params, + referralCode: referralCode, + flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, + flashLoanPremiumTotal: _flashLoanPremiumTotal + }); + FlashLoanLogic.executeFlashLoanSimple(_reserves[asset], flashParams); + } + + /// @inheritdoc IPool + function mintToTreasury(address[] calldata assets) external virtual override { + PoolLogic.executeMintToTreasury(_reserves, assets); + } + + /// @inheritdoc IPool + function getReserveData(address asset) + external + view + virtual + override + returns (DataTypes.ReserveData memory) + { + return _reserves[asset]; + } + + /// @inheritdoc IPool + function getUserAccountData(address user) + external + view + virtual + override + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ) + { + return + PoolLogic.executeGetUserAccountData( + _reserves, + _reservesList, + _eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: _usersConfig[user], + reservesCount: _reservesCount, + user: user, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[user] + }) + ); + } + + /// @inheritdoc IPool + function getConfiguration(address asset) + external + view + virtual + override + returns (DataTypes.ReserveConfigurationMap memory) + { + return _reserves[asset].configuration; + } + + /// @inheritdoc IPool + function getUserConfiguration(address user) + external + view + virtual + override + returns (DataTypes.UserConfigurationMap memory) + { + return _usersConfig[user]; + } + + /// @inheritdoc IPool + function getReserveNormalizedIncome(address asset) + external + view + virtual + override + returns (uint256) + { + return _reserves[asset].getNormalizedIncome(); + } + + /// @inheritdoc IPool + function getReserveNormalizedVariableDebt(address asset) + external + view + virtual + override + returns (uint256) + { + return _reserves[asset].getNormalizedDebt(); + } + + /// @inheritdoc IPool + function getReservesList() external view virtual override returns (address[] memory) { + uint256 reservesListCount = _reservesCount; + uint256 droppedReservesCount = 0; + address[] memory reservesList = new address[](reservesListCount); + + for (uint256 i = 0; i < reservesListCount; i++) { + if (_reservesList[i] != address(0)) { + reservesList[i - droppedReservesCount] = _reservesList[i]; + } else { + droppedReservesCount++; + } + } + + // Reduces the length of the reserves array by `droppedReservesCount` + assembly { + mstore(reservesList, sub(reservesListCount, droppedReservesCount)) + } + return reservesList; + } + + /// @inheritdoc IPool + function getReserveAddressById(uint16 id) external view returns (address) { + return _reservesList[id]; + } + + /// @inheritdoc IPool + function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() public view virtual override returns (uint256) { + return _maxStableRateBorrowSizePercent; + } + + /// @inheritdoc IPool + function BRIDGE_PROTOCOL_FEE() public view virtual override returns (uint256) { + return _bridgeProtocolFee; + } + + /// @inheritdoc IPool + function FLASHLOAN_PREMIUM_TOTAL() public view virtual override returns (uint128) { + return _flashLoanPremiumTotal; + } + + /// @inheritdoc IPool + function FLASHLOAN_PREMIUM_TO_PROTOCOL() public view virtual override returns (uint128) { + return _flashLoanPremiumToProtocol; + } + + /// @inheritdoc IPool + function MAX_NUMBER_RESERVES() public view virtual override returns (uint16) { + return ReserveConfiguration.MAX_RESERVES_COUNT; + } + + /// @inheritdoc IPool + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external virtual override { + require(msg.sender == _reserves[asset].aTokenAddress, Errors.CALLER_NOT_ATOKEN); + SupplyLogic.executeFinalizeTransfer( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig, + DataTypes.FinalizeTransferParams({ + asset: asset, + from: from, + to: to, + amount: amount, + balanceFromBefore: balanceFromBefore, + balanceToBefore: balanceToBefore, + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + fromEModeCategory: _usersEModeCategory[from] + }) + ); + } + + /// @inheritdoc IPool + function initReserve( + address asset, + address aTokenAddress, + address stableDebtAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external virtual override onlyPoolConfigurator { + if ( + PoolLogic.executeInitReserve( + _reserves, + _reservesList, + DataTypes.InitReserveParams({ + asset: asset, + aTokenAddress: aTokenAddress, + stableDebtAddress: stableDebtAddress, + variableDebtAddress: variableDebtAddress, + interestRateStrategyAddress: interestRateStrategyAddress, + reservesCount: _reservesCount, + maxNumberReserves: MAX_NUMBER_RESERVES() + }) + ) + ) { + _reservesCount++; + } + } + + /// @inheritdoc IPool + function dropReserve(address asset) external virtual override onlyPoolConfigurator { + PoolLogic.executeDropReserve(_reserves, _reservesList, asset); + } + + /// @inheritdoc IPool + function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress) + external + virtual + override + onlyPoolConfigurator + { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + _reserves[asset].interestRateStrategyAddress = rateStrategyAddress; + } + + /// @inheritdoc IPool + function setConfiguration(address asset, DataTypes.ReserveConfigurationMap calldata configuration) + external + virtual + override + onlyPoolConfigurator + { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + _reserves[asset].configuration = configuration; + } + + /// @inheritdoc IPool + function updateBridgeProtocolFee(uint256 protocolFee) + external + virtual + override + onlyPoolConfigurator + { + _bridgeProtocolFee = protocolFee; + } + + /// @inheritdoc IPool + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external virtual override onlyPoolConfigurator { + _flashLoanPremiumTotal = flashLoanPremiumTotal; + _flashLoanPremiumToProtocol = flashLoanPremiumToProtocol; + } + + /// @inheritdoc IPool + function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory category) + external + virtual + override + onlyPoolConfigurator + { + // category 0 is reserved for volatile heterogeneous assets and it's always disabled + require(id != 0, Errors.EMODE_CATEGORY_RESERVED); + _eModeCategories[id] = category; + } + + /// @inheritdoc IPool + function getEModeCategoryData(uint8 id) + external + view + virtual + override + returns (DataTypes.EModeCategory memory) + { + return _eModeCategories[id]; + } + + /// @inheritdoc IPool + function setUserEMode(uint8 categoryId) external virtual override { + EModeLogic.executeSetUserEMode( + _reserves, + _reservesList, + _eModeCategories, + _usersEModeCategory, + _usersConfig[msg.sender], + DataTypes.ExecuteSetUserEModeParams({ + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + categoryId: categoryId + }) + ); + } + + /// @inheritdoc IPool + function getUserEMode(address user) external view virtual override returns (uint256) { + return _usersEModeCategory[user]; + } + + /// @inheritdoc IPool + function resetIsolationModeTotalDebt(address asset) + external + virtual + override + onlyPoolConfigurator + { + PoolLogic.executeResetIsolationModeTotalDebt(_reserves, asset); + } + + /// @inheritdoc IPool + function rescueTokens( + address token, + address to, + uint256 amount + ) external virtual override onlyPoolAdmin { + PoolLogic.executeRescueTokens(token, to, amount); + } + + /// @inheritdoc IPool + /// @dev Deprecated: maintained for compatibility purposes + function deposit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external virtual override { + SupplyLogic.executeSupply( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteSupplyParams({ + asset: asset, + amount: amount, + onBehalfOf: onBehalfOf, + referralCode: referralCode + }) + ); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol new file mode 100644 index 00000000..b99610c2 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol @@ -0,0 +1,528 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {VersionedInitializable} from '../libraries/aave-upgradeability/VersionedInitializable.sol'; +import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; +import {PercentageMath} from '../libraries/math/PercentageMath.sol'; +import {DataTypes} from '../libraries/types/DataTypes.sol'; +import {ConfiguratorLogic} from '../libraries/logic/ConfiguratorLogic.sol'; +import {ConfiguratorInputTypes} from '../libraries/types/ConfiguratorInputTypes.sol'; +import {IPoolConfigurator} from '../../interfaces/IPoolConfigurator.sol'; +import {IPool} from '../../interfaces/IPool.sol'; +import {IACLManager} from '../../interfaces/IACLManager.sol'; +import {IPoolDataProvider} from '../../interfaces/IPoolDataProvider.sol'; + +/** + * @title PoolConfigurator + * @author Aave + * @dev Implements the configuration methods for the Aave protocol + **/ +contract PoolConfigurator is VersionedInitializable, IPoolConfigurator { + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + IPoolAddressesProvider internal _addressesProvider; + IPool internal _pool; + + /** + * @dev Only pool admin can call functions marked by this modifier. + **/ + modifier onlyPoolAdmin() { + _onlyPoolAdmin(); + _; + } + + /** + * @dev Only emergency admin can call functions marked by this modifier. + **/ + modifier onlyEmergencyAdmin() { + _onlyEmergencyAdmin(); + _; + } + + /** + * @dev Only emergency or pool admin can call functions marked by this modifier. + **/ + modifier onlyEmergencyOrPoolAdmin() { + _onlyPoolOrEmergencyAdmin(); + _; + } + + /** + * @dev Only asset listing or pool admin can call functions marked by this modifier. + **/ + modifier onlyAssetListingOrPoolAdmins() { + _onlyAssetListingOrPoolAdmins(); + _; + } + + /** + * @dev Only risk or pool admin can call functions marked by this modifier. + **/ + modifier onlyRiskOrPoolAdmins() { + _onlyRiskOrPoolAdmins(); + _; + } + + uint256 public constant CONFIGURATOR_REVISION = 0x1; + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure virtual override returns (uint256) { + return CONFIGURATOR_REVISION; + } + + function initialize(IPoolAddressesProvider provider) public initializer { + _addressesProvider = provider; + _pool = IPool(_addressesProvider.getPool()); + } + + /// @inheritdoc IPoolConfigurator + function initReserves(ConfiguratorInputTypes.InitReserveInput[] calldata input) + external + override + onlyAssetListingOrPoolAdmins + { + IPool cachedPool = _pool; + for (uint256 i = 0; i < input.length; i++) { + ConfiguratorLogic.executeInitReserve(cachedPool, input[i]); + } + } + + /// @inheritdoc IPoolConfigurator + function dropReserve(address asset) external override onlyPoolAdmin { + _pool.dropReserve(asset); + emit ReserveDropped(asset); + } + + /// @inheritdoc IPoolConfigurator + function updateAToken(ConfiguratorInputTypes.UpdateATokenInput calldata input) + external + override + onlyPoolAdmin + { + ConfiguratorLogic.executeUpdateAToken(_pool, input); + } + + /// @inheritdoc IPoolConfigurator + function updateStableDebtToken(ConfiguratorInputTypes.UpdateDebtTokenInput calldata input) + external + override + onlyPoolAdmin + { + ConfiguratorLogic.executeUpdateStableDebtToken(_pool, input); + } + + /// @inheritdoc IPoolConfigurator + function updateVariableDebtToken(ConfiguratorInputTypes.UpdateDebtTokenInput calldata input) + external + override + onlyPoolAdmin + { + ConfiguratorLogic.executeUpdateVariableDebtToken(_pool, input); + } + + /// @inheritdoc IPoolConfigurator + function setReserveBorrowing(address asset, bool enabled) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + if (!enabled) { + require(!currentConfig.getStableRateBorrowingEnabled(), Errors.STABLE_BORROWING_ENABLED); + } + currentConfig.setBorrowingEnabled(enabled); + _pool.setConfiguration(asset, currentConfig); + emit ReserveBorrowing(asset, enabled); + } + + /// @inheritdoc IPoolConfigurator + function configureReserveAsCollateral( + address asset, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus + ) external override onlyRiskOrPoolAdmins { + //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_RESERVE_PARAMS); + + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + if (liquidationThreshold != 0) { + //liquidation bonus must be bigger than 100.00%, otherwise the liquidator would receive less + //collateral than needed to cover the debt + require(liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_PARAMS); + + //if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment + //a loan is taken there is enough collateral available to cover the liquidation bonus + require( + liquidationThreshold.percentMul(liquidationBonus) <= PercentageMath.PERCENTAGE_FACTOR, + Errors.INVALID_RESERVE_PARAMS + ); + } else { + require(liquidationBonus == 0, Errors.INVALID_RESERVE_PARAMS); + //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 supplied + _checkNoSuppliers(asset); + } + + currentConfig.setLtv(ltv); + currentConfig.setLiquidationThreshold(liquidationThreshold); + currentConfig.setLiquidationBonus(liquidationBonus); + + _pool.setConfiguration(asset, currentConfig); + + emit CollateralConfigurationChanged(asset, ltv, liquidationThreshold, liquidationBonus); + } + + /// @inheritdoc IPoolConfigurator + function setReserveStableRateBorrowing(address asset, bool enabled) + external + override + onlyRiskOrPoolAdmins + { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + if (enabled) { + require(currentConfig.getBorrowingEnabled(), Errors.BORROWING_NOT_ENABLED); + } + currentConfig.setStableRateBorrowingEnabled(enabled); + _pool.setConfiguration(asset, currentConfig); + emit ReserveStableRateBorrowing(asset, enabled); + } + + /// @inheritdoc IPoolConfigurator + function setReserveActive(address asset, bool active) external override onlyPoolAdmin { + if (!active) _checkNoSuppliers(asset); + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setActive(active); + _pool.setConfiguration(asset, currentConfig); + emit ReserveActive(asset, active); + } + + /// @inheritdoc IPoolConfigurator + function setReserveFreeze(address asset, bool freeze) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setFrozen(freeze); + _pool.setConfiguration(asset, currentConfig); + emit ReserveFrozen(asset, freeze); + } + + /// @inheritdoc IPoolConfigurator + function setBorrowableInIsolation(address asset, bool borrowable) + external + override + onlyRiskOrPoolAdmins + { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setBorrowableInIsolation(borrowable); + _pool.setConfiguration(asset, currentConfig); + emit BorrowableInIsolationChanged(asset, borrowable); + } + + /// @inheritdoc IPoolConfigurator + function setReservePause(address asset, bool paused) public override onlyEmergencyOrPoolAdmin { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setPaused(paused); + _pool.setConfiguration(asset, currentConfig); + emit ReservePaused(asset, paused); + } + + /// @inheritdoc IPoolConfigurator + function setReserveFactor(address asset, uint256 newReserveFactor) + external + override + onlyRiskOrPoolAdmins + { + require(newReserveFactor <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldReserveFactor = currentConfig.getReserveFactor(); + currentConfig.setReserveFactor(newReserveFactor); + _pool.setConfiguration(asset, currentConfig); + emit ReserveFactorChanged(asset, oldReserveFactor, newReserveFactor); + } + + /// @inheritdoc IPoolConfigurator + function setDebtCeiling(address asset, uint256 newDebtCeiling) + external + override + onlyRiskOrPoolAdmins + { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + uint256 oldDebtCeiling = currentConfig.getDebtCeiling(); + if (oldDebtCeiling == 0) { + _checkNoSuppliers(asset); + } + currentConfig.setDebtCeiling(newDebtCeiling); + _pool.setConfiguration(asset, currentConfig); + + if (newDebtCeiling == 0) { + _pool.resetIsolationModeTotalDebt(asset); + } + + emit DebtCeilingChanged(asset, oldDebtCeiling, newDebtCeiling); + } + + /// @inheritdoc IPoolConfigurator + function setSiloedBorrowing(address asset, bool newSiloed) + external + override + onlyRiskOrPoolAdmins + { + if (newSiloed) { + _checkNoBorrowers(asset); + } + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + bool oldSiloed = currentConfig.getSiloedBorrowing(); + + currentConfig.setSiloedBorrowing(newSiloed); + + _pool.setConfiguration(asset, currentConfig); + + emit SiloedBorrowingChanged(asset, oldSiloed, newSiloed); + } + + /// @inheritdoc IPoolConfigurator + function setBorrowCap(address asset, uint256 newBorrowCap) + external + override + onlyRiskOrPoolAdmins + { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldBorrowCap = currentConfig.getBorrowCap(); + currentConfig.setBorrowCap(newBorrowCap); + _pool.setConfiguration(asset, currentConfig); + emit BorrowCapChanged(asset, oldBorrowCap, newBorrowCap); + } + + /// @inheritdoc IPoolConfigurator + function setSupplyCap(address asset, uint256 newSupplyCap) + external + override + onlyRiskOrPoolAdmins + { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldSupplyCap = currentConfig.getSupplyCap(); + currentConfig.setSupplyCap(newSupplyCap); + _pool.setConfiguration(asset, currentConfig); + emit SupplyCapChanged(asset, oldSupplyCap, newSupplyCap); + } + + /// @inheritdoc IPoolConfigurator + function setLiquidationProtocolFee(address asset, uint256 newFee) + external + override + onlyRiskOrPoolAdmins + { + require(newFee <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_LIQUIDATION_PROTOCOL_FEE); + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldFee = currentConfig.getLiquidationProtocolFee(); + currentConfig.setLiquidationProtocolFee(newFee); + _pool.setConfiguration(asset, currentConfig); + emit LiquidationProtocolFeeChanged(asset, oldFee, newFee); + } + + /// @inheritdoc IPoolConfigurator + function setEModeCategory( + uint8 categoryId, + uint16 ltv, + uint16 liquidationThreshold, + uint16 liquidationBonus, + address oracle, + string calldata label + ) external override onlyRiskOrPoolAdmins { + require(ltv != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); + require(liquidationThreshold != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); + + // 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_EMODE_CATEGORY_PARAMS); + require( + liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, + Errors.INVALID_EMODE_CATEGORY_PARAMS + ); + + // if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment + // a loan is taken there is enough collateral available to cover the liquidation bonus + require( + uint256(liquidationThreshold).percentMul(liquidationBonus) <= + PercentageMath.PERCENTAGE_FACTOR, + Errors.INVALID_EMODE_CATEGORY_PARAMS + ); + + address[] memory reserves = _pool.getReservesList(); + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(reserves[i]); + if (categoryId == currentConfig.getEModeCategory()) { + require(ltv > currentConfig.getLtv(), Errors.INVALID_EMODE_CATEGORY_PARAMS); + require( + liquidationThreshold > currentConfig.getLiquidationThreshold(), + Errors.INVALID_EMODE_CATEGORY_PARAMS + ); + } + } + + _pool.configureEModeCategory( + categoryId, + DataTypes.EModeCategory({ + ltv: ltv, + liquidationThreshold: liquidationThreshold, + liquidationBonus: liquidationBonus, + priceSource: oracle, + label: label + }) + ); + emit EModeCategoryAdded(categoryId, ltv, liquidationThreshold, liquidationBonus, oracle, label); + } + + /// @inheritdoc IPoolConfigurator + function setAssetEModeCategory(address asset, uint8 newCategoryId) + external + override + onlyRiskOrPoolAdmins + { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + if (newCategoryId != 0) { + DataTypes.EModeCategory memory categoryData = _pool.getEModeCategoryData(newCategoryId); + require( + categoryData.liquidationThreshold > currentConfig.getLiquidationThreshold(), + Errors.INVALID_EMODE_CATEGORY_ASSIGNMENT + ); + } + uint256 oldCategoryId = currentConfig.getEModeCategory(); + currentConfig.setEModeCategory(newCategoryId); + _pool.setConfiguration(asset, currentConfig); + emit EModeAssetCategoryChanged(asset, uint8(oldCategoryId), newCategoryId); + } + + /// @inheritdoc IPoolConfigurator + function setUnbackedMintCap(address asset, uint256 newUnbackedMintCap) + external + override + onlyRiskOrPoolAdmins + { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldUnbackedMintCap = currentConfig.getUnbackedMintCap(); + currentConfig.setUnbackedMintCap(newUnbackedMintCap); + _pool.setConfiguration(asset, currentConfig); + emit UnbackedMintCapChanged(asset, oldUnbackedMintCap, newUnbackedMintCap); + } + + /// @inheritdoc IPoolConfigurator + function setReserveInterestRateStrategyAddress(address asset, address newRateStrategyAddress) + external + override + onlyRiskOrPoolAdmins + { + DataTypes.ReserveData memory reserve = _pool.getReserveData(asset); + address oldRateStrategyAddress = reserve.interestRateStrategyAddress; + _pool.setReserveInterestRateStrategyAddress(asset, newRateStrategyAddress); + emit ReserveInterestRateStrategyChanged(asset, oldRateStrategyAddress, newRateStrategyAddress); + } + + /// @inheritdoc IPoolConfigurator + function setPoolPause(bool paused) external override onlyEmergencyAdmin { + address[] memory reserves = _pool.getReservesList(); + + for (uint256 i = 0; i < reserves.length; i++) { + if (reserves[i] != address(0)) { + setReservePause(reserves[i], paused); + } + } + } + + /// @inheritdoc IPoolConfigurator + function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external override onlyPoolAdmin { + require( + newBridgeProtocolFee <= PercentageMath.PERCENTAGE_FACTOR, + Errors.BRIDGE_PROTOCOL_FEE_INVALID + ); + uint256 oldBridgeProtocolFee = _pool.BRIDGE_PROTOCOL_FEE(); + _pool.updateBridgeProtocolFee(newBridgeProtocolFee); + emit BridgeProtocolFeeUpdated(oldBridgeProtocolFee, newBridgeProtocolFee); + } + + /// @inheritdoc IPoolConfigurator + function updateFlashloanPremiumTotal(uint128 newFlashloanPremiumTotal) + external + override + onlyPoolAdmin + { + require( + newFlashloanPremiumTotal <= PercentageMath.PERCENTAGE_FACTOR, + Errors.FLASHLOAN_PREMIUM_INVALID + ); + uint128 oldFlashloanPremiumTotal = _pool.FLASHLOAN_PREMIUM_TOTAL(); + _pool.updateFlashloanPremiums(newFlashloanPremiumTotal, _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL()); + emit FlashloanPremiumTotalUpdated(oldFlashloanPremiumTotal, newFlashloanPremiumTotal); + } + + /// @inheritdoc IPoolConfigurator + function updateFlashloanPremiumToProtocol(uint128 newFlashloanPremiumToProtocol) + external + override + onlyPoolAdmin + { + require( + newFlashloanPremiumToProtocol <= PercentageMath.PERCENTAGE_FACTOR, + Errors.FLASHLOAN_PREMIUM_INVALID + ); + uint128 oldFlashloanPremiumToProtocol = _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL(); + _pool.updateFlashloanPremiums(_pool.FLASHLOAN_PREMIUM_TOTAL(), newFlashloanPremiumToProtocol); + emit FlashloanPremiumToProtocolUpdated( + oldFlashloanPremiumToProtocol, + newFlashloanPremiumToProtocol + ); + } + + function _checkNoSuppliers(address asset) internal view { + uint256 totalATokens = IPoolDataProvider(_addressesProvider.getPoolDataProvider()) + .getATokenTotalSupply(asset); + require(totalATokens == 0, Errors.RESERVE_LIQUIDITY_NOT_ZERO); + } + + function _checkNoBorrowers(address asset) internal view { + uint256 totalDebt = IPoolDataProvider(_addressesProvider.getPoolDataProvider()).getTotalDebt( + asset + ); + require(totalDebt == 0, Errors.RESERVE_DEBT_NOT_ZERO); + } + + function _onlyPoolAdmin() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + } + + function _onlyEmergencyAdmin() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isEmergencyAdmin(msg.sender), Errors.CALLER_NOT_EMERGENCY_ADMIN); + } + + function _onlyPoolOrEmergencyAdmin() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isPoolAdmin(msg.sender) || aclManager.isEmergencyAdmin(msg.sender), + Errors.CALLER_NOT_POOL_OR_EMERGENCY_ADMIN + ); + } + + function _onlyAssetListingOrPoolAdmins() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), + Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN + ); + } + + function _onlyRiskOrPoolAdmins() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isRiskAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), + Errors.CALLER_NOT_RISK_OR_POOL_ADMIN + ); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/PoolStorage.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/PoolStorage.sol new file mode 100644 index 00000000..9fac0d96 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/PoolStorage.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {UserConfiguration} from '../libraries/configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; +import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; +import {DataTypes} from '../libraries/types/DataTypes.sol'; + +/** + * @title PoolStorage + * @author Aave + * @notice Contract used as storage of the Pool contract. + * @dev It defines the storage layout of the Pool contract. + */ +contract PoolStorage { + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + // Map of reserves and their data (underlyingAssetOfReserve => reserveData) + mapping(address => DataTypes.ReserveData) internal _reserves; + + // Map of users address and their configuration data (userAddress => userConfiguration) + mapping(address => DataTypes.UserConfigurationMap) internal _usersConfig; + + // List of reserves as a map (reserveId => reserve). + // It is structured as a mapping for gas savings reasons, using the reserve id as index + mapping(uint256 => address) internal _reservesList; + + // List of eMode categories as a map (eModeCategoryId => eModeCategory). + // It is structured as a mapping for gas savings reasons, using the eModeCategoryId as index + mapping(uint8 => DataTypes.EModeCategory) internal _eModeCategories; + + // Map of users address and their eMode category (userAddress => eModeCategoryId) + mapping(address => uint8) internal _usersEModeCategory; + + // Fee of the protocol bridge, expressed in bps + uint256 internal _bridgeProtocolFee; + + // Total FlashLoan Premium, expressed in bps + uint128 internal _flashLoanPremiumTotal; + + // FlashLoan premium paid to protocol treasury, expressed in bps + uint128 internal _flashLoanPremiumToProtocol; + + // Available liquidity that can be borrowed at once at stable rate, expressed in bps + uint64 internal _maxStableRateBorrowSizePercent; + + // Maximum number of active reserves there have been in the protocol. It is the upper bound of the reserves list + uint16 internal _reservesCount; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/AToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/AToken.sol new file mode 100644 index 00000000..2bd122e6 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/AToken.sol @@ -0,0 +1,272 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {VersionedInitializable} from '../libraries/aave-upgradeability/VersionedInitializable.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; +import {WadRayMath} from '../libraries/math/WadRayMath.sol'; +import {IPool} from '../../interfaces/IPool.sol'; +import {IAToken} from '../../interfaces/IAToken.sol'; +import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; +import {IInitializableAToken} from '../../interfaces/IInitializableAToken.sol'; +import {ScaledBalanceTokenBase} from './base/ScaledBalanceTokenBase.sol'; +import {IncentivizedERC20} from './base/IncentivizedERC20.sol'; +import {EIP712Base} from './base/EIP712Base.sol'; + +/** + * @title Aave ERC20 AToken + * @author Aave + * @notice Implementation of the interest bearing token for the Aave protocol + */ +contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, IAToken { + using WadRayMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + + bytes32 public constant PERMIT_TYPEHASH = + keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); + + uint256 public constant ATOKEN_REVISION = 0x1; + + address internal _treasury; + address internal _underlyingAsset; + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure virtual override returns (uint256) { + return ATOKEN_REVISION; + } + + /** + * @dev Constructor. + * @param pool The address of the Pool contract + */ + constructor(IPool pool) + ScaledBalanceTokenBase(pool, 'ATOKEN_IMPL', 'ATOKEN_IMPL', 0) + EIP712Base() + { + // Intentionally left blank + } + + /// @inheritdoc IInitializableAToken + function initialize( + IPool initializingPool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external override initializer { + require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); + _setName(aTokenName); + _setSymbol(aTokenSymbol); + _setDecimals(aTokenDecimals); + + _treasury = treasury; + _underlyingAsset = underlyingAsset; + _incentivesController = incentivesController; + + _domainSeparator = _calculateDomainSeparator(); + + emit Initialized( + underlyingAsset, + address(POOL), + treasury, + address(incentivesController), + aTokenDecimals, + aTokenName, + aTokenSymbol, + params + ); + } + + /// @inheritdoc IAToken + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external virtual override onlyPool returns (bool) { + return _mintScaled(caller, onBehalfOf, amount, index); + } + + /// @inheritdoc IAToken + function burn( + address from, + address receiverOfUnderlying, + uint256 amount, + uint256 index + ) external virtual override onlyPool { + _burnScaled(from, receiverOfUnderlying, amount, index); + if (receiverOfUnderlying != address(this)) { + IERC20(_underlyingAsset).safeTransfer(receiverOfUnderlying, amount); + } + } + + /// @inheritdoc IAToken + function mintToTreasury(uint256 amount, uint256 index) external override onlyPool { + if (amount == 0) { + return; + } + _mintScaled(address(POOL), _treasury, amount, index); + } + + /// @inheritdoc IAToken + function transferOnLiquidation( + address from, + address to, + uint256 value + ) external override onlyPool { + // Being a normal transfer, the Transfer() and BalanceTransfer() are emitted + // so no need to emit a specific event here + _transfer(from, to, value, false); + + emit Transfer(from, to, value); + } + + /// @inheritdoc IERC20 + function balanceOf(address user) + public + view + virtual + override(IncentivizedERC20, IERC20) + returns (uint256) + { + return super.balanceOf(user).rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { + uint256 currentSupplyScaled = super.totalSupply(); + + if (currentSupplyScaled == 0) { + return 0; + } + + return currentSupplyScaled.rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); + } + + /// @inheritdoc IAToken + function RESERVE_TREASURY_ADDRESS() external view override returns (address) { + return _treasury; + } + + /// @inheritdoc IAToken + function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { + return _underlyingAsset; + } + + /// @inheritdoc IAToken + function transferUnderlyingTo(address target, uint256 amount) external virtual override onlyPool { + IERC20(_underlyingAsset).safeTransfer(target, amount); + } + + /// @inheritdoc IAToken + function handleRepayment(address user, uint256 amount) external virtual override onlyPool { + // Intentionally left blank + } + + /// @inheritdoc IAToken + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external override { + require(owner != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + //solium-disable-next-line + require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); + uint256 currentValidNonce = _nonces[owner]; + bytes32 digest = keccak256( + abi.encodePacked( + '\x19\x01', + DOMAIN_SEPARATOR(), + keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentValidNonce, deadline)) + ) + ); + require(owner == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); + _nonces[owner] = currentValidNonce + 1; + _approve(owner, spender, value); + } + + /** + * @notice Transfers the aTokens between two users. Validates the transfer + * (ie checks for valid HF after the transfer) if required + * @param from The source address + * @param to The destination address + * @param amount The amount getting transferred + * @param validate True if the transfer needs to be validated, false otherwise + **/ + function _transfer( + address from, + address to, + uint256 amount, + bool validate + ) internal { + address underlyingAsset = _underlyingAsset; + + uint256 index = POOL.getReserveNormalizedIncome(underlyingAsset); + + uint256 fromBalanceBefore = super.balanceOf(from).rayMul(index); + uint256 toBalanceBefore = super.balanceOf(to).rayMul(index); + + super._transfer(from, to, amount.rayDiv(index).toUint128()); + + if (validate) { + POOL.finalizeTransfer(underlyingAsset, from, to, amount, fromBalanceBefore, toBalanceBefore); + } + + emit BalanceTransfer(from, to, amount, index); + } + + /** + * @notice Overrides the parent _transfer to force validated transfer() and transferFrom() + * @param from The source address + * @param to The destination address + * @param amount The amount getting transferred + **/ + function _transfer( + address from, + address to, + uint128 amount + ) internal override { + _transfer(from, to, amount, true); + } + + /** + * @dev Overrides the base function to fully implement IAToken + * @dev see `IncentivizedERC20.DOMAIN_SEPARATOR()` for more detailed documentation + */ + function DOMAIN_SEPARATOR() public view override(IAToken, EIP712Base) returns (bytes32) { + return super.DOMAIN_SEPARATOR(); + } + + /** + * @dev Overrides the base function to fully implement IAToken + * @dev see `IncentivizedERC20.nonces()` for more detailed documentation + */ + function nonces(address owner) public view override(IAToken, EIP712Base) returns (uint256) { + return super.nonces(owner); + } + + /// @inheritdoc EIP712Base + function _EIP712BaseId() internal view override returns (string memory) { + return name(); + } + + /// @inheritdoc IAToken + function rescueTokens( + address token, + address to, + uint256 amount + ) external override onlyPoolAdmin { + require(token != _underlyingAsset, Errors.UNDERLYING_CANNOT_BE_RESCUED); + IERC20(token).safeTransfer(to, amount); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol new file mode 100644 index 00000000..51a5f201 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IPool} from '../../interfaces/IPool.sol'; +import {IDelegationToken} from '../../interfaces/IDelegationToken.sol'; +import {AToken} from './AToken.sol'; + +/** + * @title DelegationAwareAToken + * @author Aave + * @notice AToken enabled to delegate voting power of the underlying asset to a different address + * @dev The underlying asset needs to be compatible with the COMP delegation interface + */ +contract DelegationAwareAToken is AToken { + /** + * @dev Emitted when underlying voting power is delegated + * @param delegatee The address of the delegatee + */ + event DelegateUnderlyingTo(address indexed delegatee); + + /** + * @dev Constructor. + * @param pool The address of the Pool contract + */ + constructor(IPool pool) AToken(pool) { + // Intentionally left blank + } + + /** + * @notice Delegates voting power of the underlying asset to a `delegatee` address + * @param delegatee The address that will receive the delegation + **/ + function delegateUnderlyingTo(address delegatee) external onlyPoolAdmin { + IDelegationToken(_underlyingAsset).delegate(delegatee); + emit DelegateUnderlyingTo(delegatee); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol new file mode 100644 index 00000000..c37358ba --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol @@ -0,0 +1,430 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {VersionedInitializable} from '../libraries/aave-upgradeability/VersionedInitializable.sol'; +import {MathUtils} from '../libraries/math/MathUtils.sol'; +import {WadRayMath} from '../libraries/math/WadRayMath.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; +import {IInitializableDebtToken} from '../../interfaces/IInitializableDebtToken.sol'; +import {IStableDebtToken} from '../../interfaces/IStableDebtToken.sol'; +import {IPool} from '../../interfaces/IPool.sol'; +import {EIP712Base} from './base/EIP712Base.sol'; +import {DebtTokenBase} from './base/DebtTokenBase.sol'; +import {IncentivizedERC20} from './base/IncentivizedERC20.sol'; +import {SafeCast} from '../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title StableDebtToken + * @author Aave + * @notice Implements a stable debt token to track the borrowing positions of users + * at stable rate mode + * @dev Transfer and approve functionalities are disabled since its a non-transferable token + **/ +contract StableDebtToken is DebtTokenBase, IncentivizedERC20, IStableDebtToken { + using WadRayMath for uint256; + using SafeCast for uint256; + + uint256 public constant DEBT_TOKEN_REVISION = 0x1; + + // Map of users address and the timestamp of their last update (userAddress => lastUpdateTimestamp) + mapping(address => uint40) internal _timestamps; + + uint128 internal _avgStableRate; + + // Timestamp of the last update of the total supply + uint40 internal _totalSupplyTimestamp; + + /** + * @dev Constructor. + * @param pool The address of the Pool contract + */ + constructor(IPool pool) + DebtTokenBase() + IncentivizedERC20(pool, 'STABLE_DEBT_TOKEN_IMPL', 'STABLE_DEBT_TOKEN_IMPL', 0) + { + // Intentionally left blank + } + + /// @inheritdoc IInitializableDebtToken + function initialize( + IPool initializingPool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external override initializer { + require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); + _setName(debtTokenName); + _setSymbol(debtTokenSymbol); + _setDecimals(debtTokenDecimals); + + _underlyingAsset = underlyingAsset; + _incentivesController = incentivesController; + + _domainSeparator = _calculateDomainSeparator(); + + emit Initialized( + underlyingAsset, + address(POOL), + address(incentivesController), + debtTokenDecimals, + debtTokenName, + debtTokenSymbol, + params + ); + } + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure virtual override returns (uint256) { + return DEBT_TOKEN_REVISION; + } + + /// @inheritdoc IStableDebtToken + function getAverageStableRate() external view virtual override returns (uint256) { + return _avgStableRate; + } + + /// @inheritdoc IStableDebtToken + function getUserLastUpdated(address user) external view virtual override returns (uint40) { + return _timestamps[user]; + } + + /// @inheritdoc IStableDebtToken + function getUserStableRate(address user) external view virtual override returns (uint256) { + return _userState[user].additionalData; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + uint256 accountBalance = super.balanceOf(account); + uint256 stableRate = _userState[account].additionalData; + if (accountBalance == 0) { + return 0; + } + uint256 cumulatedInterest = MathUtils.calculateCompoundedInterest( + stableRate, + _timestamps[account] + ); + return accountBalance.rayMul(cumulatedInterest); + } + + struct MintLocalVars { + uint256 previousSupply; + uint256 nextSupply; + uint256 amountInRay; + uint256 currentStableRate; + uint256 nextStableRate; + uint256 currentAvgStableRate; + } + + /// @inheritdoc IStableDebtToken + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 rate + ) + external + virtual + override + onlyPool + returns ( + bool, + uint256, + uint256 + ) + { + MintLocalVars memory vars; + + if (user != onBehalfOf) { + _decreaseBorrowAllowance(onBehalfOf, user, amount); + } + + (, uint256 currentBalance, uint256 balanceIncrease) = _calculateBalanceIncrease(onBehalfOf); + + vars.previousSupply = totalSupply(); + vars.currentAvgStableRate = _avgStableRate; + vars.nextSupply = _totalSupply = vars.previousSupply + amount; + + vars.amountInRay = amount.wadToRay(); + + vars.currentStableRate = _userState[onBehalfOf].additionalData; + vars.nextStableRate = (vars.currentStableRate.rayMul(currentBalance.wadToRay()) + + vars.amountInRay.rayMul(rate)).rayDiv((currentBalance + amount).wadToRay()); + + _userState[onBehalfOf].additionalData = vars.nextStableRate.toUint128(); + + //solium-disable-next-line + _totalSupplyTimestamp = _timestamps[onBehalfOf] = uint40(block.timestamp); + + // Calculates the updated average stable rate + vars.currentAvgStableRate = _avgStableRate = ( + (vars.currentAvgStableRate.rayMul(vars.previousSupply.wadToRay()) + + rate.rayMul(vars.amountInRay)).rayDiv(vars.nextSupply.wadToRay()) + ).toUint128(); + + uint256 amountToMint = amount + balanceIncrease; + _mint(onBehalfOf, amountToMint, vars.previousSupply); + + emit Transfer(address(0), onBehalfOf, amountToMint); + emit Mint( + user, + onBehalfOf, + amountToMint, + currentBalance, + balanceIncrease, + vars.nextStableRate, + vars.currentAvgStableRate, + vars.nextSupply + ); + + return (currentBalance == 0, vars.nextSupply, vars.currentAvgStableRate); + } + + /// @inheritdoc IStableDebtToken + function burn(address from, uint256 amount) + external + virtual + override + onlyPool + returns (uint256, uint256) + { + (, uint256 currentBalance, uint256 balanceIncrease) = _calculateBalanceIncrease(from); + + uint256 previousSupply = totalSupply(); + uint256 nextAvgStableRate = 0; + uint256 nextSupply = 0; + uint256 userStableRate = _userState[from].additionalData; + + // Since the total supply and each single user debt accrue separately, + // there might be accumulation errors so that the last borrower repaying + // might actually try to repay more than the available debt supply. + // In this case we simply set the total supply and the avg stable rate to 0 + if (previousSupply <= amount) { + _avgStableRate = 0; + _totalSupply = 0; + } else { + nextSupply = _totalSupply = previousSupply - amount; + uint256 firstTerm = uint256(_avgStableRate).rayMul(previousSupply.wadToRay()); + uint256 secondTerm = userStableRate.rayMul(amount.wadToRay()); + + // For the same reason described above, when the last user is repaying it might + // happen that user rate * user balance > avg rate * total supply. In that case, + // we simply set the avg rate to 0 + if (secondTerm >= firstTerm) { + nextAvgStableRate = _totalSupply = _avgStableRate = 0; + } else { + nextAvgStableRate = _avgStableRate = ( + (firstTerm - secondTerm).rayDiv(nextSupply.wadToRay()) + ).toUint128(); + } + } + + if (amount == currentBalance) { + _userState[from].additionalData = 0; + _timestamps[from] = 0; + } else { + //solium-disable-next-line + _timestamps[from] = uint40(block.timestamp); + } + //solium-disable-next-line + _totalSupplyTimestamp = uint40(block.timestamp); + + if (balanceIncrease > amount) { + uint256 amountToMint = balanceIncrease - amount; + _mint(from, amountToMint, previousSupply); + emit Transfer(address(0), from, amountToMint); + emit Mint( + from, + from, + amountToMint, + currentBalance, + balanceIncrease, + userStableRate, + nextAvgStableRate, + nextSupply + ); + } else { + uint256 amountToBurn = amount - balanceIncrease; + _burn(from, amountToBurn, previousSupply); + emit Transfer(from, address(0), amountToBurn); + emit Burn(from, amountToBurn, currentBalance, balanceIncrease, nextAvgStableRate, nextSupply); + } + + return (nextSupply, nextAvgStableRate); + } + + /** + * @notice Calculates the increase in balance since the last user interaction + * @param user The address of the user for which the interest is being accumulated + * @return The previous principal balance + * @return The new principal balance + * @return The balance increase + **/ + function _calculateBalanceIncrease(address user) + internal + view + returns ( + uint256, + uint256, + uint256 + ) + { + uint256 previousPrincipalBalance = super.balanceOf(user); + + if (previousPrincipalBalance == 0) { + return (0, 0, 0); + } + + uint256 newPrincipalBalance = balanceOf(user); + + return ( + previousPrincipalBalance, + newPrincipalBalance, + newPrincipalBalance - previousPrincipalBalance + ); + } + + /// @inheritdoc IStableDebtToken + function getSupplyData() + external + view + override + returns ( + uint256, + uint256, + uint256, + uint40 + ) + { + uint256 avgRate = _avgStableRate; + return (super.totalSupply(), _calcTotalSupply(avgRate), avgRate, _totalSupplyTimestamp); + } + + /// @inheritdoc IStableDebtToken + function getTotalSupplyAndAvgRate() external view override returns (uint256, uint256) { + uint256 avgRate = _avgStableRate; + return (_calcTotalSupply(avgRate), avgRate); + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _calcTotalSupply(_avgStableRate); + } + + /// @inheritdoc IStableDebtToken + function getTotalSupplyLastUpdated() external view override returns (uint40) { + return _totalSupplyTimestamp; + } + + /// @inheritdoc IStableDebtToken + function principalBalanceOf(address user) external view virtual override returns (uint256) { + return super.balanceOf(user); + } + + /// @inheritdoc IStableDebtToken + function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { + return _underlyingAsset; + } + + /** + * @notice Calculates the total supply + * @param avgRate The average rate at which the total supply increases + * @return The debt balance of the user since the last burn/mint action + **/ + function _calcTotalSupply(uint256 avgRate) internal view returns (uint256) { + uint256 principalSupply = super.totalSupply(); + + if (principalSupply == 0) { + return 0; + } + + uint256 cumulatedInterest = MathUtils.calculateCompoundedInterest( + avgRate, + _totalSupplyTimestamp + ); + + return principalSupply.rayMul(cumulatedInterest); + } + + /** + * @notice Mints stable debt tokens to a user + * @param account The account receiving the debt tokens + * @param amount The amount being minted + * @param oldTotalSupply The total supply before the minting event + **/ + function _mint( + address account, + uint256 amount, + uint256 oldTotalSupply + ) internal { + uint128 castAmount = amount.toUint128(); + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance + castAmount; + + if (address(_incentivesController) != address(0)) { + _incentivesController.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } + + /** + * @notice Burns stable debt tokens of a user + * @param account The user getting his debt burned + * @param amount The amount being burned + * @param oldTotalSupply The total supply before the burning event + **/ + function _burn( + address account, + uint256 amount, + uint256 oldTotalSupply + ) internal { + uint128 castAmount = amount.toUint128(); + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance - castAmount; + + if (address(_incentivesController) != address(0)) { + _incentivesController.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } + + /// @inheritdoc EIP712Base + function _EIP712BaseId() internal view override returns (string memory) { + return name(); + } + + /** + * @dev Being non transferrable, the debt token does not implement any of the + * standard ERC20 functions for transfer and allowance. + **/ + function transfer(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function allowance(address, address) external view virtual override returns (uint256) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function approve(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function transferFrom( + address, + address, + uint256 + ) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function increaseAllowance(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function decreaseAllowance(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol new file mode 100644 index 00000000..6b73f4b5 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol @@ -0,0 +1,157 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {SafeCast} from '../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {VersionedInitializable} from '../libraries/aave-upgradeability/VersionedInitializable.sol'; +import {WadRayMath} from '../libraries/math/WadRayMath.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; +import {IPool} from '../../interfaces/IPool.sol'; +import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; +import {IInitializableDebtToken} from '../../interfaces/IInitializableDebtToken.sol'; +import {IVariableDebtToken} from '../../interfaces/IVariableDebtToken.sol'; +import {EIP712Base} from './base/EIP712Base.sol'; +import {DebtTokenBase} from './base/DebtTokenBase.sol'; +import {ScaledBalanceTokenBase} from './base/ScaledBalanceTokenBase.sol'; + +/** + * @title VariableDebtToken + * @author Aave + * @notice Implements a variable debt token to track the borrowing positions of users + * at variable rate mode + * @dev Transfer and approve functionalities are disabled since its a non-transferable token + **/ +contract VariableDebtToken is DebtTokenBase, ScaledBalanceTokenBase, IVariableDebtToken { + using WadRayMath for uint256; + using SafeCast for uint256; + + uint256 public constant DEBT_TOKEN_REVISION = 0x1; + + /** + * @dev Constructor. + * @param pool The address of the Pool contract + */ + constructor(IPool pool) + DebtTokenBase() + ScaledBalanceTokenBase(pool, 'VARIABLE_DEBT_TOKEN_IMPL', 'VARIABLE_DEBT_TOKEN_IMPL', 0) + { + // Intentionally left blank + } + + /// @inheritdoc IInitializableDebtToken + function initialize( + IPool initializingPool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external override initializer { + require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); + _setName(debtTokenName); + _setSymbol(debtTokenSymbol); + _setDecimals(debtTokenDecimals); + + _underlyingAsset = underlyingAsset; + _incentivesController = incentivesController; + + _domainSeparator = _calculateDomainSeparator(); + + emit Initialized( + underlyingAsset, + address(POOL), + address(incentivesController), + debtTokenDecimals, + debtTokenName, + debtTokenSymbol, + params + ); + } + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure virtual override returns (uint256) { + return DEBT_TOKEN_REVISION; + } + + /// @inheritdoc IERC20 + function balanceOf(address user) public view virtual override returns (uint256) { + uint256 scaledBalance = super.balanceOf(user); + + if (scaledBalance == 0) { + return 0; + } + + return scaledBalance.rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); + } + + /// @inheritdoc IVariableDebtToken + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external virtual override onlyPool returns (bool, uint256) { + if (user != onBehalfOf) { + _decreaseBorrowAllowance(onBehalfOf, user, amount); + } + return (_mintScaled(user, onBehalfOf, amount, index), scaledTotalSupply()); + } + + /// @inheritdoc IVariableDebtToken + function burn( + address from, + uint256 amount, + uint256 index + ) external virtual override onlyPool returns (uint256) { + _burnScaled(from, address(0), amount, index); + return scaledTotalSupply(); + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return super.totalSupply().rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); + } + + /// @inheritdoc EIP712Base + function _EIP712BaseId() internal view override returns (string memory) { + return name(); + } + + /** + * @dev Being non transferrable, the debt token does not implement any of the + * standard ERC20 functions for transfer and allowance. + **/ + function transfer(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function allowance(address, address) external view virtual override returns (uint256) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function approve(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function transferFrom( + address, + address, + uint256 + ) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function increaseAllowance(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function decreaseAllowance(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + /// @inheritdoc IVariableDebtToken + function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { + return _underlyingAsset; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/DebtTokenBase.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/DebtTokenBase.sol new file mode 100644 index 00000000..3e5ac909 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/DebtTokenBase.sol @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {VersionedInitializable} from '../../libraries/aave-upgradeability/VersionedInitializable.sol'; +import {ICreditDelegationToken} from '../../../interfaces/ICreditDelegationToken.sol'; +import {EIP712Base} from './EIP712Base.sol'; + +/** + * @title DebtTokenBase + * @author Aave + * @notice Base contract for different types of debt tokens, like StableDebtToken or VariableDebtToken + */ +abstract contract DebtTokenBase is + VersionedInitializable, + EIP712Base, + Context, + ICreditDelegationToken +{ + // Map of borrow allowances (delegator => delegatee => borrowAllowanceAmount) + mapping(address => mapping(address => uint256)) internal _borrowAllowances; + + // Credit Delegation Typehash + bytes32 public constant DELEGATION_WITH_SIG_TYPEHASH = + keccak256('DelegationWithSig(address delegatee,uint256 value,uint256 nonce,uint256 deadline)'); + + address internal _underlyingAsset; + + /** + * @dev Constructor. + */ + constructor() EIP712Base() { + // Intentionally left blank + } + + /// @inheritdoc ICreditDelegationToken + function approveDelegation(address delegatee, uint256 amount) external override { + _approveDelegation(_msgSender(), delegatee, amount); + } + + /// @inheritdoc ICreditDelegationToken + function delegationWithSig( + address delegator, + address delegatee, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external { + require(delegator != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + //solium-disable-next-line + require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); + uint256 currentValidNonce = _nonces[delegator]; + bytes32 digest = keccak256( + abi.encodePacked( + '\x19\x01', + DOMAIN_SEPARATOR(), + keccak256( + abi.encode(DELEGATION_WITH_SIG_TYPEHASH, delegatee, value, currentValidNonce, deadline) + ) + ) + ); + require(delegator == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); + _nonces[delegator] = currentValidNonce + 1; + _approveDelegation(delegator, delegatee, value); + } + + /// @inheritdoc ICreditDelegationToken + function borrowAllowance(address fromUser, address toUser) + external + view + override + returns (uint256) + { + return _borrowAllowances[fromUser][toUser]; + } + + /** + * @notice Updates the borrow allowance of a user on the specific debt token. + * @param delegator The address delegating the borrowing power + * @param delegatee The address receiving the delegated borrowing power + * @param amount The allowance amount being delegated. + **/ + function _approveDelegation( + address delegator, + address delegatee, + uint256 amount + ) internal { + _borrowAllowances[delegator][delegatee] = amount; + emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, amount); + } + + /** + * @notice Decreases the borrow allowance of a user on the specific debt token. + * @param delegator The address delegating the borrowing power + * @param delegatee The address receiving the delegated borrowing power + * @param amount The amount to subtract from the current allowance + **/ + function _decreaseBorrowAllowance( + address delegator, + address delegatee, + uint256 amount + ) internal { + uint256 newAllowance = _borrowAllowances[delegator][delegatee] - amount; + + _borrowAllowances[delegator][delegatee] = newAllowance; + + emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, newAllowance); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/EIP712Base.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/EIP712Base.sol new file mode 100644 index 00000000..bb161193 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/EIP712Base.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +/** + * @title EIP712Base + * @author Aave + * @notice Base contract implementation of EIP712. + */ +abstract contract EIP712Base { + bytes public constant EIP712_REVISION = bytes('1'); + bytes32 internal constant EIP712_DOMAIN = + keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); + + // Map of address nonces (address => nonce) + mapping(address => uint256) internal _nonces; + + bytes32 internal _domainSeparator; + uint256 internal immutable _chainId; + + /** + * @dev Constructor. + */ + constructor() { + _chainId = block.chainid; + } + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { + if (block.chainid == _chainId) { + return _domainSeparator; + } + return _calculateDomainSeparator(); + } + + /** + * @notice Returns the nonce value for address specified as parameter + * @param owner The address for which the nonce is being returned + * @return The nonce value for the input address` + */ + function nonces(address owner) public view virtual returns (uint256) { + return _nonces[owner]; + } + + /** + * @notice Compute the current domain separator + * @return The domain separator for the token + */ + function _calculateDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + EIP712_DOMAIN, + keccak256(bytes(_EIP712BaseId())), + keccak256(EIP712_REVISION), + block.chainid, + address(this) + ) + ); + } + + /** + * @notice Returns the user readable name of signing domain (e.g. token name) + * @return The name of the signing domain + */ + function _EIP712BaseId() internal view virtual returns (string memory); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4c0d83c1 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,253 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + **/ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + **/ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + **/ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. StableDebtTokens use + * this field to store the user's stable rate. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name; + _symbol = symbol; + _decimals = decimals; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + **/ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + **/ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance(address owner, address spender) + external + view + virtual + override + returns (uint256) + { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + **/ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + **/ + function decreaseAllowance(address spender, uint256 subtractedValue) + external + virtual + returns (bool) + { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer( + address sender, + address recipient, + uint128 amount + ) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + emit Transfer(sender, recipient, amount); + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve( + address owner, + address spender, + uint256 amount + ) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol new file mode 100644 index 00000000..51eba347 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IncentivizedERC20} from './IncentivizedERC20.sol'; + +/** + * @title MintableIncentivizedERC20 + * @author Aave + * @notice Implements mint and burn functions for IncentivizedERC20 + **/ +abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) IncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /** + * @notice Mints tokens to an account and apply incentives if defined + * @param account The address receiving tokens + * @param amount The amount of tokens to mint + */ + function _mint(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply + amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } + + /** + * @notice Burns tokens from an account and apply incentives if defined + * @param account The account whose tokens are burnt + * @param amount The amount of tokens to burn + */ + function _burn(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply - amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance - amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol new file mode 100644 index 00000000..1b0cc690 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {MintableIncentivizedERC20} from './MintableIncentivizedERC20.sol'; + +/** + * @title ScaledBalanceTokenBase + * @author Aave + * @notice Basic ERC20 implementation of scaled balance token + **/ +abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) MintableIncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /// @inheritdoc IScaledBalanceToken + function scaledBalanceOf(address user) external view override returns (uint256) { + return super.balanceOf(user); + } + + /// @inheritdoc IScaledBalanceToken + function getScaledUserBalanceAndSupply(address user) + external + view + override + returns (uint256, uint256) + { + return (super.balanceOf(user), super.totalSupply()); + } + + /// @inheritdoc IScaledBalanceToken + function scaledTotalSupply() public view virtual override returns (uint256) { + return super.totalSupply(); + } + + /// @inheritdoc IScaledBalanceToken + function getPreviousIndex(address user) external view virtual override returns (uint256) { + return _userState[user].additionalData; + } + + /** + * @notice Implements the basic logic to mint a scaled balance token. + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the scaled tokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + **/ + function _mintScaled( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) internal returns (bool) { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); + + uint256 scaledBalance = super.balanceOf(onBehalfOf); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[onBehalfOf].additionalData); + + _userState[onBehalfOf].additionalData = index.toUint128(); + + _mint(onBehalfOf, amountScaled.toUint128()); + + uint256 amountToMint = amount + balanceIncrease; + emit Transfer(address(0), onBehalfOf, amountToMint); + emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); + + return (scaledBalance == 0); + } + + /** + * @notice Implements the basic logic to burn a scaled balance token. + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param user The user which debt is burnt + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + **/ + function _burnScaled( + address user, + address target, + uint256 amount, + uint256 index + ) internal { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); + + uint256 scaledBalance = super.balanceOf(user); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[user].additionalData); + + _userState[user].additionalData = index.toUint128(); + + _burn(user, amountScaled.toUint128()); + + if (balanceIncrease > amount) { + uint256 amountToMint = balanceIncrease - amount; + emit Transfer(address(0), user, amountToMint); + emit Mint(user, user, amountToMint, balanceIncrease, index); + } else { + uint256 amountToBurn = amount - balanceIncrease; + emit Transfer(user, address(0), amountToBurn); + emit Burn(user, target, amountToBurn, balanceIncrease, index); + } + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapAdapter.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapAdapter.sol new file mode 100644 index 00000000..f8dda0dc --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapAdapter.sol @@ -0,0 +1,139 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {DataTypes} from '@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol'; +import {FlashLoanReceiverBase} from '@aave/core-v3/contracts/flashloan/base/FlashLoanReceiverBase.sol'; +import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {IERC20WithPermit} from '@aave/core-v3/contracts/interfaces/IERC20WithPermit.sol'; +import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; +import {IPriceOracleGetter} from '@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol'; +import {SafeMath} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol'; +import {Ownable} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol'; + +/** + * @title BaseParaSwapAdapter + * @notice Utility functions for adapters using ParaSwap + * @author Jason Raymond Bell + */ +abstract contract BaseParaSwapAdapter is FlashLoanReceiverBase, Ownable { + using SafeMath for uint256; + using GPv2SafeERC20 for IERC20; + using GPv2SafeERC20 for IERC20Detailed; + using GPv2SafeERC20 for IERC20WithPermit; + + struct PermitSignature { + uint256 amount; + uint256 deadline; + uint8 v; + bytes32 r; + bytes32 s; + } + + // Max slippage percent allowed + uint256 public constant MAX_SLIPPAGE_PERCENT = 3000; // 30% + + IPriceOracleGetter public immutable ORACLE; + + event Swapped( + address indexed fromAsset, + address indexed toAsset, + uint256 fromAmount, + uint256 receivedAmount + ); + event Bought( + address indexed fromAsset, + address indexed toAsset, + uint256 amountSold, + uint256 receivedAmount + ); + + constructor(IPoolAddressesProvider addressesProvider) FlashLoanReceiverBase(addressesProvider) { + ORACLE = IPriceOracleGetter(addressesProvider.getPriceOracle()); + } + + /** + * @dev Get the price of the asset from the oracle denominated in eth + * @param asset address + * @return eth price for the asset + */ + function _getPrice(address asset) internal view returns (uint256) { + return ORACLE.getAssetPrice(asset); + } + + /** + * @dev Get the decimals of an asset + * @return number of decimals of the asset + */ + function _getDecimals(IERC20Detailed asset) internal view returns (uint8) { + uint8 decimals = asset.decimals(); + // Ensure 10**decimals won't overflow a uint256 + require(decimals <= 77, 'TOO_MANY_DECIMALS_ON_TOKEN'); + return decimals; + } + + /** + * @dev Get the aToken associated to the asset + * @return address of the aToken + */ + function _getReserveData(address asset) internal view returns (DataTypes.ReserveData memory) { + return POOL.getReserveData(asset); + } + + function _pullATokenAndWithdraw( + address reserve, + address user, + uint256 amount, + PermitSignature memory permitSignature + ) internal { + IERC20WithPermit reserveAToken = IERC20WithPermit( + _getReserveData(address(reserve)).aTokenAddress + ); + _pullATokenAndWithdraw(reserve, reserveAToken, user, amount, permitSignature); + } + + /** + * @dev Pull the ATokens from the user + * @param reserve address of the asset + * @param reserveAToken address of the aToken of the reserve + * @param user address + * @param amount of tokens to be transferred to the contract + * @param permitSignature struct containing the permit signature + */ + function _pullATokenAndWithdraw( + address reserve, + IERC20WithPermit reserveAToken, + address user, + uint256 amount, + PermitSignature memory permitSignature + ) internal { + // If deadline is set to zero, assume there is no signature for permit + if (permitSignature.deadline != 0) { + reserveAToken.permit( + user, + address(this), + permitSignature.amount, + permitSignature.deadline, + permitSignature.v, + permitSignature.r, + permitSignature.s + ); + } + + // transfer from user to adapter + reserveAToken.safeTransferFrom(user, address(this), amount); + + // withdraw reserve + require(POOL.withdraw(reserve, amount, address(this)) == amount, 'UNEXPECTED_AMOUNT_WITHDRAWN'); + } + + /** + * @dev Emergency rescue for token stucked on this contract, as failsafe mechanism + * - Funds should never remain in this contract more time than during transactions + * - Only callable by the owner + */ + function rescueTokens(IERC20 token) external onlyOwner { + token.safeTransfer(owner(), token.balanceOf(address(this))); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapBuyAdapter.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapBuyAdapter.sol new file mode 100644 index 00000000..c55f7099 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapBuyAdapter.sol @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {SafeMath} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol'; +import {PercentageMath} from '@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol'; +import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; +import {IERC20Detailed} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {IParaSwapAugustus} from './interfaces/IParaSwapAugustus.sol'; +import {IParaSwapAugustusRegistry} from './interfaces/IParaSwapAugustusRegistry.sol'; +import {BaseParaSwapAdapter} from './BaseParaSwapAdapter.sol'; + +/** + * @title BaseParaSwapBuyAdapter + * @notice Implements the logic for buying tokens on ParaSwap + */ +abstract contract BaseParaSwapBuyAdapter is BaseParaSwapAdapter { + using PercentageMath for uint256; + using SafeMath for uint256; + + IParaSwapAugustusRegistry public immutable AUGUSTUS_REGISTRY; + + constructor(IPoolAddressesProvider addressesProvider, IParaSwapAugustusRegistry augustusRegistry) + BaseParaSwapAdapter(addressesProvider) + { + // Do something on Augustus registry to check the right contract was passed + require(!augustusRegistry.isValidAugustus(address(0)), 'Not a valid Augustus address'); + AUGUSTUS_REGISTRY = augustusRegistry; + } + + /** + * @dev Swaps a token for another using ParaSwap + * @param toAmountOffset Offset of toAmount in Augustus calldata if it should be overwritten, otherwise 0 + * @param paraswapData Data for Paraswap Adapter + * @param assetToSwapFrom Address of the asset to be swapped from + * @param assetToSwapTo Address of the asset to be swapped to + * @param maxAmountToSwap Max amount to be swapped + * @param amountToReceive Amount to be received from the swap + * @return amountSold The amount sold during the swap + */ + function _buyOnParaSwap( + uint256 toAmountOffset, + bytes memory paraswapData, + IERC20Detailed assetToSwapFrom, + IERC20Detailed assetToSwapTo, + uint256 maxAmountToSwap, + uint256 amountToReceive + ) internal returns (uint256 amountSold) { + (bytes memory buyCalldata, IParaSwapAugustus augustus) = abi.decode( + paraswapData, + (bytes, IParaSwapAugustus) + ); + + require(AUGUSTUS_REGISTRY.isValidAugustus(address(augustus)), 'INVALID_AUGUSTUS'); + + { + uint256 fromAssetDecimals = _getDecimals(assetToSwapFrom); + uint256 toAssetDecimals = _getDecimals(assetToSwapTo); + + uint256 fromAssetPrice = _getPrice(address(assetToSwapFrom)); + uint256 toAssetPrice = _getPrice(address(assetToSwapTo)); + + uint256 expectedMaxAmountToSwap = amountToReceive + .mul(toAssetPrice.mul(10**fromAssetDecimals)) + .div(fromAssetPrice.mul(10**toAssetDecimals)) + .percentMul(PercentageMath.PERCENTAGE_FACTOR.add(MAX_SLIPPAGE_PERCENT)); + + require(maxAmountToSwap <= expectedMaxAmountToSwap, 'maxAmountToSwap exceed max slippage'); + } + + uint256 balanceBeforeAssetFrom = assetToSwapFrom.balanceOf(address(this)); + require(balanceBeforeAssetFrom >= maxAmountToSwap, 'INSUFFICIENT_BALANCE_BEFORE_SWAP'); + uint256 balanceBeforeAssetTo = assetToSwapTo.balanceOf(address(this)); + + address tokenTransferProxy = augustus.getTokenTransferProxy(); + assetToSwapFrom.approve(tokenTransferProxy, 0); + assetToSwapFrom.approve(tokenTransferProxy, maxAmountToSwap); + + if (toAmountOffset != 0) { + // Ensure 256 bit (32 bytes) toAmountOffset value is within bounds of the + // calldata, not overlapping with the first 4 bytes (function selector). + require( + toAmountOffset >= 4 && toAmountOffset <= buyCalldata.length.sub(32), + 'TO_AMOUNT_OFFSET_OUT_OF_RANGE' + ); + // Overwrite the toAmount with the correct amount for the buy. + // In memory, buyCalldata consists of a 256 bit length field, followed by + // the actual bytes data, that is why 32 is added to the byte offset. + assembly { + mstore(add(buyCalldata, add(toAmountOffset, 32)), amountToReceive) + } + } + (bool success, ) = address(augustus).call(buyCalldata); + if (!success) { + // Copy revert reason from call + assembly { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + uint256 balanceAfterAssetFrom = assetToSwapFrom.balanceOf(address(this)); + amountSold = balanceBeforeAssetFrom - balanceAfterAssetFrom; + require(amountSold <= maxAmountToSwap, 'WRONG_BALANCE_AFTER_SWAP'); + uint256 amountReceived = assetToSwapTo.balanceOf(address(this)).sub(balanceBeforeAssetTo); + require(amountReceived >= amountToReceive, 'INSUFFICIENT_AMOUNT_RECEIVED'); + + emit Bought(address(assetToSwapFrom), address(assetToSwapTo), amountSold, amountReceived); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapSellAdapter.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapSellAdapter.sol new file mode 100644 index 00000000..7fd31ab2 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapSellAdapter.sol @@ -0,0 +1,107 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {SafeMath} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol'; +import {PercentageMath} from '@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol'; +import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; +import {IERC20Detailed} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {IParaSwapAugustus} from './interfaces/IParaSwapAugustus.sol'; +import {IParaSwapAugustusRegistry} from './interfaces/IParaSwapAugustusRegistry.sol'; +import {BaseParaSwapAdapter} from './BaseParaSwapAdapter.sol'; + +/** + * @title BaseParaSwapSellAdapter + * @notice Implements the logic for selling tokens on ParaSwap + * @author Jason Raymond Bell + */ +abstract contract BaseParaSwapSellAdapter is BaseParaSwapAdapter { + using PercentageMath for uint256; + using SafeMath for uint256; + + IParaSwapAugustusRegistry public immutable AUGUSTUS_REGISTRY; + + constructor(IPoolAddressesProvider addressesProvider, IParaSwapAugustusRegistry augustusRegistry) + BaseParaSwapAdapter(addressesProvider) + { + // Do something on Augustus registry to check the right contract was passed + require(!augustusRegistry.isValidAugustus(address(0))); + AUGUSTUS_REGISTRY = augustusRegistry; + } + + /** + * @dev Swaps a token for another using ParaSwap + * @param fromAmountOffset Offset of fromAmount in Augustus calldata if it should be overwritten, otherwise 0 + * @param swapCalldata Calldata for ParaSwap's AugustusSwapper contract + * @param augustus Address of ParaSwap's AugustusSwapper contract + * @param assetToSwapFrom Address of the asset to be swapped from + * @param assetToSwapTo Address of the asset to be swapped to + * @param amountToSwap Amount to be swapped + * @param minAmountToReceive Minimum amount to be received from the swap + * @return amountReceived The amount received from the swap + */ + function _sellOnParaSwap( + uint256 fromAmountOffset, + bytes memory swapCalldata, + IParaSwapAugustus augustus, + IERC20Detailed assetToSwapFrom, + IERC20Detailed assetToSwapTo, + uint256 amountToSwap, + uint256 minAmountToReceive + ) internal returns (uint256 amountReceived) { + require(AUGUSTUS_REGISTRY.isValidAugustus(address(augustus)), 'INVALID_AUGUSTUS'); + + { + uint256 fromAssetDecimals = _getDecimals(assetToSwapFrom); + uint256 toAssetDecimals = _getDecimals(assetToSwapTo); + + uint256 fromAssetPrice = _getPrice(address(assetToSwapFrom)); + uint256 toAssetPrice = _getPrice(address(assetToSwapTo)); + + uint256 expectedMinAmountOut = amountToSwap + .mul(fromAssetPrice.mul(10**toAssetDecimals)) + .div(toAssetPrice.mul(10**fromAssetDecimals)) + .percentMul(PercentageMath.PERCENTAGE_FACTOR - MAX_SLIPPAGE_PERCENT); + + require(expectedMinAmountOut <= minAmountToReceive, 'MIN_AMOUNT_EXCEEDS_MAX_SLIPPAGE'); + } + + uint256 balanceBeforeAssetFrom = assetToSwapFrom.balanceOf(address(this)); + require(balanceBeforeAssetFrom >= amountToSwap, 'INSUFFICIENT_BALANCE_BEFORE_SWAP'); + uint256 balanceBeforeAssetTo = assetToSwapTo.balanceOf(address(this)); + + address tokenTransferProxy = augustus.getTokenTransferProxy(); + assetToSwapFrom.approve(tokenTransferProxy, 0); + assetToSwapFrom.approve(tokenTransferProxy, amountToSwap); + + if (fromAmountOffset != 0) { + // Ensure 256 bit (32 bytes) fromAmount value is within bounds of the + // calldata, not overlapping with the first 4 bytes (function selector). + require( + fromAmountOffset >= 4 && fromAmountOffset <= swapCalldata.length.sub(32), + 'FROM_AMOUNT_OFFSET_OUT_OF_RANGE' + ); + // Overwrite the fromAmount with the correct amount for the swap. + // In memory, swapCalldata consists of a 256 bit length field, followed by + // the actual bytes data, that is why 32 is added to the byte offset. + assembly { + mstore(add(swapCalldata, add(fromAmountOffset, 32)), amountToSwap) + } + } + (bool success, ) = address(augustus).call(swapCalldata); + if (!success) { + // Copy revert reason from call + assembly { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + require( + assetToSwapFrom.balanceOf(address(this)) == balanceBeforeAssetFrom - amountToSwap, + 'WRONG_BALANCE_AFTER_SWAP' + ); + amountReceived = assetToSwapTo.balanceOf(address(this)).sub(balanceBeforeAssetTo); + require(amountReceived >= minAmountToReceive, 'INSUFFICIENT_AMOUNT_RECEIVED'); + + emit Swapped(address(assetToSwapFrom), address(assetToSwapTo), amountToSwap, amountReceived); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol new file mode 100644 index 00000000..b4aad577 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol @@ -0,0 +1,211 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {IERC20Detailed} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {IERC20WithPermit} from '@aave/core-v3/contracts/interfaces/IERC20WithPermit.sol'; +import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; +import {SafeMath} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol'; +import {BaseParaSwapSellAdapter} from './BaseParaSwapSellAdapter.sol'; +import {IParaSwapAugustusRegistry} from './interfaces/IParaSwapAugustusRegistry.sol'; +import {IParaSwapAugustus} from './interfaces/IParaSwapAugustus.sol'; +import {ReentrancyGuard} from '../../dependencies/openzeppelin/ReentrancyGuard.sol'; + +/** + * @title ParaSwapLiquiditySwapAdapter + * @notice Adapter to swap liquidity using ParaSwap. + * @author Jason Raymond Bell + */ +contract ParaSwapLiquiditySwapAdapter is BaseParaSwapSellAdapter, ReentrancyGuard { + using SafeMath for uint256; + + constructor( + IPoolAddressesProvider addressesProvider, + IParaSwapAugustusRegistry augustusRegistry, + address owner + ) BaseParaSwapSellAdapter(addressesProvider, augustusRegistry) { + transferOwnership(owner); + } + + /** + * @dev Swaps the received reserve amount from the flash loan into the asset specified in the params. + * The received funds from the swap are then deposited into the protocol on behalf of the user. + * The user should give this contract allowance to pull the ATokens in order to withdraw the underlying asset and repay the flash loan. + * @param assets Address of the underlying asset to be swapped from + * @param amounts Amount of the flash loan i.e. maximum amount to swap + * @param premiums Fee of the flash loan + * @param initiator Account that initiated the flash loan + * @param params Additional variadic field to include extra params. Expected parameters: + * address assetToSwapTo Address of the underlying asset to be swapped to and deposited + * uint256 minAmountToReceive Min amount to be received from the swap + * uint256 swapAllBalanceOffset Set to offset of fromAmount in Augustus calldata if wanting to swap all balance, otherwise 0 + * bytes swapCalldata Calldata for ParaSwap's AugustusSwapper contract + * address augustus Address of ParaSwap's AugustusSwapper contract + * PermitSignature permitParams Struct containing the permit signatures, set to all zeroes if not used + */ + function executeOperation( + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata premiums, + address initiator, + bytes calldata params + ) external override nonReentrant returns (bool) { + require(msg.sender == address(POOL), 'CALLER_MUST_BE_POOL'); + require( + assets.length == 1 && amounts.length == 1 && premiums.length == 1, + 'FLASHLOAN_MULTIPLE_ASSETS_NOT_SUPPORTED' + ); + + uint256 flashLoanAmount = amounts[0]; + uint256 premium = premiums[0]; + address initiatorLocal = initiator; + IERC20Detailed assetToSwapFrom = IERC20Detailed(assets[0]); + ( + IERC20Detailed assetToSwapTo, + uint256 minAmountToReceive, + uint256 swapAllBalanceOffset, + bytes memory swapCalldata, + IParaSwapAugustus augustus, + PermitSignature memory permitParams + ) = abi.decode( + params, + (IERC20Detailed, uint256, uint256, bytes, IParaSwapAugustus, PermitSignature) + ); + + _swapLiquidity( + swapAllBalanceOffset, + swapCalldata, + augustus, + permitParams, + flashLoanAmount, + premium, + initiatorLocal, + assetToSwapFrom, + assetToSwapTo, + minAmountToReceive + ); + + return true; + } + + /** + * @dev Swaps an amount of an asset to another and deposits the new asset amount on behalf of the user without using a flash loan. + * This method can be used when the temporary transfer of the collateral asset to this contract does not affect the user position. + * The user should give this contract allowance to pull the ATokens in order to withdraw the underlying asset and perform the swap. + * @param assetToSwapFrom Address of the underlying asset to be swapped from + * @param assetToSwapTo Address of the underlying asset to be swapped to and deposited + * @param amountToSwap Amount to be swapped, or maximum amount when swapping all balance + * @param minAmountToReceive Minimum amount to be received from the swap + * @param swapAllBalanceOffset Set to offset of fromAmount in Augustus calldata if wanting to swap all balance, otherwise 0 + * @param swapCalldata Calldata for ParaSwap's AugustusSwapper contract + * @param augustus Address of ParaSwap's AugustusSwapper contract + * @param permitParams Struct containing the permit signatures, set to all zeroes if not used + */ + function swapAndDeposit( + IERC20Detailed assetToSwapFrom, + IERC20Detailed assetToSwapTo, + uint256 amountToSwap, + uint256 minAmountToReceive, + uint256 swapAllBalanceOffset, + bytes calldata swapCalldata, + IParaSwapAugustus augustus, + PermitSignature calldata permitParams + ) external nonReentrant { + IERC20WithPermit aToken = IERC20WithPermit( + _getReserveData(address(assetToSwapFrom)).aTokenAddress + ); + + if (swapAllBalanceOffset != 0) { + uint256 balance = aToken.balanceOf(msg.sender); + require(balance <= amountToSwap, 'INSUFFICIENT_AMOUNT_TO_SWAP'); + amountToSwap = balance; + } + + _pullATokenAndWithdraw( + address(assetToSwapFrom), + aToken, + msg.sender, + amountToSwap, + permitParams + ); + + uint256 amountReceived = _sellOnParaSwap( + swapAllBalanceOffset, + swapCalldata, + augustus, + assetToSwapFrom, + assetToSwapTo, + amountToSwap, + minAmountToReceive + ); + + assetToSwapTo.approve(address(POOL), 0); + assetToSwapTo.approve(address(POOL), amountReceived); + POOL.deposit(address(assetToSwapTo), amountReceived, msg.sender, 0); + } + + /** + * @dev Swaps an amount of an asset to another and deposits the funds on behalf of the initiator. + * @param swapAllBalanceOffset Set to offset of fromAmount in Augustus calldata if wanting to swap all balance, otherwise 0 + * @param swapCalldata Calldata for ParaSwap's AugustusSwapper contract + * @param augustus Address of ParaSwap's AugustusSwapper contract + * @param permitParams Struct containing the permit signatures, set to all zeroes if not used + * @param flashLoanAmount Amount of the flash loan i.e. maximum amount to swap + * @param premium Fee of the flash loan + * @param initiator Account that initiated the flash loan + * @param assetToSwapFrom Address of the underyling asset to be swapped from + * @param assetToSwapTo Address of the underlying asset to be swapped to and deposited + * @param minAmountToReceive Min amount to be received from the swap + */ + function _swapLiquidity( + uint256 swapAllBalanceOffset, + bytes memory swapCalldata, + IParaSwapAugustus augustus, + PermitSignature memory permitParams, + uint256 flashLoanAmount, + uint256 premium, + address initiator, + IERC20Detailed assetToSwapFrom, + IERC20Detailed assetToSwapTo, + uint256 minAmountToReceive + ) internal { + IERC20WithPermit aToken = IERC20WithPermit( + _getReserveData(address(assetToSwapFrom)).aTokenAddress + ); + uint256 amountToSwap = flashLoanAmount; + + uint256 balance = aToken.balanceOf(initiator); + if (swapAllBalanceOffset != 0) { + uint256 balanceToSwap = balance.sub(premium); + require(balanceToSwap <= amountToSwap, 'INSUFFICIENT_AMOUNT_TO_SWAP'); + amountToSwap = balanceToSwap; + } else { + require(balance >= amountToSwap.add(premium), 'INSUFFICIENT_ATOKEN_BALANCE'); + } + + uint256 amountReceived = _sellOnParaSwap( + swapAllBalanceOffset, + swapCalldata, + augustus, + assetToSwapFrom, + assetToSwapTo, + amountToSwap, + minAmountToReceive + ); + + assetToSwapTo.approve(address(POOL), 0); + assetToSwapTo.approve(address(POOL), amountReceived); + POOL.deposit(address(assetToSwapTo), amountReceived, initiator, 0); + + _pullATokenAndWithdraw( + address(assetToSwapFrom), + aToken, + initiator, + amountToSwap.add(premium), + permitParams + ); + + // Repay flash loan + assetToSwapFrom.approve(address(POOL), 0); + assetToSwapFrom.approve(address(POOL), flashLoanAmount.add(premium)); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol new file mode 100644 index 00000000..e12c6f7b --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol @@ -0,0 +1,229 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {DataTypes} from '@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol'; +import {IERC20Detailed} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20WithPermit} from '@aave/core-v3/contracts/interfaces/IERC20WithPermit.sol'; +import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; +import {SafeMath} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol'; +import {BaseParaSwapBuyAdapter} from './BaseParaSwapBuyAdapter.sol'; +import {IParaSwapAugustusRegistry} from './interfaces/IParaSwapAugustusRegistry.sol'; +import {IParaSwapAugustus} from './interfaces/IParaSwapAugustus.sol'; +import {ReentrancyGuard} from '../../dependencies/openzeppelin/ReentrancyGuard.sol'; + +/** + * @title ParaSwapRepayAdapter + * @notice ParaSwap Adapter to perform a repay of a debt with collateral. + * @author Aave + **/ +contract ParaSwapRepayAdapter is BaseParaSwapBuyAdapter, ReentrancyGuard { + using SafeMath for uint256; + + struct RepayParams { + address collateralAsset; + uint256 collateralAmount; + uint256 rateMode; + PermitSignature permitSignature; + bool useEthPath; + } + + constructor( + IPoolAddressesProvider addressesProvider, + IParaSwapAugustusRegistry augustusRegistry, + address owner + ) BaseParaSwapBuyAdapter(addressesProvider, augustusRegistry) { + transferOwnership(owner); + } + + /** + * @dev Uses the received funds from the flash loan to repay a debt on the protocol on behalf of the user. Then pulls + * the collateral from the user and swaps it to the debt asset to repay the flash loan. + * The user should give this contract allowance to pull the ATokens in order to withdraw the underlying asset, swap it + * and repay the flash loan. + * Supports only one asset on the flash loan. + * @param assets Address of collateral asset(Flash loan asset) + * @param amounts Amount of flash loan taken + * @param premiums Fee of the flash loan + * @param initiator Address of the user + * @param params Additional variadic field to include extra params. Expected parameters: + * IERC20Detailed debtAsset Address of the debt asset + * uint256 debtAmount Amount of debt to be repaid + * uint256 rateMode Rate modes of the debt to be repaid + * uint256 deadline Deadline for the permit signature + * uint256 debtRateMode Rate mode of the debt to be repaid + * bytes paraswapData Paraswap Data + * * bytes buyCallData Call data for augustus + * * IParaSwapAugustus augustus Address of Augustus Swapper + * PermitSignature permitParams Struct containing the permit signatures, set to all zeroes if not used + */ + function executeOperation( + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata premiums, + address initiator, + bytes calldata params + ) external override nonReentrant returns (bool) { + require(msg.sender == address(POOL), 'CALLER_MUST_BE_POOL'); + + require( + assets.length == 1 && amounts.length == 1 && premiums.length == 1, + 'FLASHLOAN_MULTIPLE_ASSETS_NOT_SUPPORTED' + ); + + uint256 collateralAmount = amounts[0]; + uint256 premium = premiums[0]; + address initiatorLocal = initiator; + + IERC20Detailed collateralAsset = IERC20Detailed(assets[0]); + + _swapAndRepay(params, premium, initiatorLocal, collateralAsset, collateralAmount); + + return true; + } + + /** + * @dev Swaps the user collateral for the debt asset and then repay the debt on the protocol on behalf of the user + * without using flash loans. This method can be used when the temporary transfer of the collateral asset to this + * contract does not affect the user position. + * The user should give this contract allowance to pull the ATokens in order to withdraw the underlying asset + * @param collateralAsset Address of asset to be swapped + * @param debtAsset Address of debt asset + * @param collateralAmount max Amount of the collateral to be swapped + * @param debtRepayAmount Amount of the debt to be repaid, or maximum amount when repaying entire debt + * @param debtRateMode Rate mode of the debt to be repaid + * @param buyAllBalanceOffset Set to offset of toAmount in Augustus calldata if wanting to pay entire debt, otherwise 0 + * @param paraswapData Data for Paraswap Adapter + * @param permitSignature struct containing the permit signature + */ + function swapAndRepay( + IERC20Detailed collateralAsset, + IERC20Detailed debtAsset, + uint256 collateralAmount, + uint256 debtRepayAmount, + uint256 debtRateMode, + uint256 buyAllBalanceOffset, + bytes calldata paraswapData, + PermitSignature calldata permitSignature + ) external nonReentrant { + debtRepayAmount = getDebtRepayAmount( + debtAsset, + debtRateMode, + buyAllBalanceOffset, + debtRepayAmount, + msg.sender + ); + + // Pull aTokens from user + _pullATokenAndWithdraw(address(collateralAsset), msg.sender, collateralAmount, permitSignature); + //buy debt asset using collateral asset + uint256 amountSold = _buyOnParaSwap( + buyAllBalanceOffset, + paraswapData, + collateralAsset, + debtAsset, + collateralAmount, + debtRepayAmount + ); + + uint256 collateralBalanceLeft = collateralAmount - amountSold; + + //deposit collateral back in the pool, if left after the swap(buy) + if (collateralBalanceLeft > 0) { + IERC20(collateralAsset).approve(address(POOL), 0); + IERC20(collateralAsset).approve(address(POOL), collateralBalanceLeft); + POOL.deposit(address(collateralAsset), collateralBalanceLeft, msg.sender, 0); + } + + // Repay debt. Approves 0 first to comply with tokens that implement the anti frontrunning approval fix + IERC20(debtAsset).approve(address(POOL), 0); + IERC20(debtAsset).approve(address(POOL), debtRepayAmount); + POOL.repay(address(debtAsset), debtRepayAmount, debtRateMode, msg.sender); + } + + /** + * @dev Perform the repay of the debt, pulls the initiator collateral and swaps to repay the flash loan + * @param premium Fee of the flash loan + * @param initiator Address of the user + * @param collateralAsset Address of token to be swapped + * @param collateralAmount Amount of the reserve to be swapped(flash loan amount) + */ + + function _swapAndRepay( + bytes calldata params, + uint256 premium, + address initiator, + IERC20Detailed collateralAsset, + uint256 collateralAmount + ) private { + ( + IERC20Detailed debtAsset, + uint256 debtRepayAmount, + uint256 buyAllBalanceOffset, + uint256 rateMode, + bytes memory paraswapData, + PermitSignature memory permitSignature + ) = abi.decode(params, (IERC20Detailed, uint256, uint256, uint256, bytes, PermitSignature)); + + debtRepayAmount = getDebtRepayAmount( + debtAsset, + rateMode, + buyAllBalanceOffset, + debtRepayAmount, + initiator + ); + + uint256 amountSold = _buyOnParaSwap( + buyAllBalanceOffset, + paraswapData, + collateralAsset, + debtAsset, + collateralAmount, + debtRepayAmount + ); + + // Repay debt. Approves for 0 first to comply with tokens that implement the anti frontrunning approval fix. + IERC20(debtAsset).approve(address(POOL), 0); + IERC20(debtAsset).approve(address(POOL), debtRepayAmount); + POOL.repay(address(debtAsset), debtRepayAmount, rateMode, initiator); + + uint256 neededForFlashLoanRepay = amountSold.add(premium); + + // Pull aTokens from user + _pullATokenAndWithdraw( + address(collateralAsset), + initiator, + neededForFlashLoanRepay, + permitSignature + ); + + // Repay flashloan. Approves for 0 first to comply with tokens that implement the anti frontrunning approval fix. + IERC20(collateralAsset).approve(address(POOL), 0); + IERC20(collateralAsset).approve(address(POOL), collateralAmount.add(premium)); + } + + function getDebtRepayAmount( + IERC20Detailed debtAsset, + uint256 rateMode, + uint256 buyAllBalanceOffset, + uint256 debtRepayAmount, + address initiator + ) private view returns (uint256) { + DataTypes.ReserveData memory debtReserveData = _getReserveData(address(debtAsset)); + + address debtToken = DataTypes.InterestRateMode(rateMode) == DataTypes.InterestRateMode.STABLE + ? debtReserveData.stableDebtTokenAddress + : debtReserveData.variableDebtTokenAddress; + + uint256 currentDebt = IERC20(debtToken).balanceOf(initiator); + + if (buyAllBalanceOffset != 0) { + require(currentDebt <= debtRepayAmount, 'INSUFFICIENT_AMOUNT_TO_REPAY'); + debtRepayAmount = currentDebt; + } else { + require(debtRepayAmount <= currentDebt, 'INVALID_DEBT_REPAY_AMOUNT'); + } + + return debtRepayAmount; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/interfaces/IParaSwapAugustus.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/interfaces/IParaSwapAugustus.sol new file mode 100644 index 00000000..629f1f6e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/interfaces/IParaSwapAugustus.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +interface IParaSwapAugustus { + function getTokenTransferProxy() external view returns (address); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/interfaces/IParaSwapAugustusRegistry.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/interfaces/IParaSwapAugustusRegistry.sol new file mode 100644 index 00000000..144e06d4 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/interfaces/IParaSwapAugustusRegistry.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +interface IParaSwapAugustusRegistry { + function isValidAugustus(address augustus) external view returns (bool); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/dependencies/openzeppelin/ReentrancyGuard.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/dependencies/openzeppelin/ReentrancyGuard.sol new file mode 100644 index 00000000..3891a8a9 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/dependencies/openzeppelin/ReentrancyGuard.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.10; + +/** + * @dev Contract module that helps prevent reentrant calls to a function. + * + * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier + * available, which can be applied to functions to make sure there are no nested + * (reentrant) calls to them. + * + * Note that because there is a single `nonReentrant` guard, functions marked as + * `nonReentrant` may not call one another. This can be worked around by making + * those functions `private`, and then adding `external` `nonReentrant` entry + * points to them. + * + * TIP: If you would like to learn more about reentrancy and alternative ways + * to protect against it, check out our blog post + * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. + */ +abstract contract ReentrancyGuard { + // Booleans are more expensive than uint256 or any type that takes up a full + // word because each write operation emits an extra SLOAD to first read the + // slot's contents, replace the bits taken up by the boolean, and then write + // back. This is the compiler's defense against contract upgrades and + // pointer aliasing, and it cannot be disabled. + + // The values being non-zero value makes deployment a bit more expensive, + // but in exchange the refund on every call to nonReentrant will be lower in + // amount. Since refunds are capped to a percentage of the total + // transaction's gas, it is best to keep them low in cases like this one, to + // increase the likelihood of the full refund coming into effect. + uint256 private constant _NOT_ENTERED = 1; + uint256 private constant _ENTERED = 2; + + uint256 private _status; + + constructor() { + _status = _NOT_ENTERED; + } + + /** + * @dev Prevents a contract from calling itself, directly or indirectly. + * Calling a `nonReentrant` function from another `nonReentrant` + * function is not supported. It is possible to prevent this from happening + * by making the `nonReentrant` function external, and make it call a + * `private` function that does the actual work. + */ + modifier nonReentrant() { + // On the first call to nonReentrant, _notEntered will be true + require(_status != _ENTERED, 'ReentrancyGuard: reentrant call'); + + // Any calls to nonReentrant after this point will fail + _status = _ENTERED; + + _; + + // By storing the original value once again, a refund is triggered (see + // https://eips.ethereum.org/EIPS/eip-2200) + _status = _NOT_ENTERED; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/libraries/DataTypesHelper.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/libraries/DataTypesHelper.sol new file mode 100644 index 00000000..6b613b66 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/libraries/DataTypesHelper.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; +import {DataTypes} from '@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol'; + +/** + * @title DataTypesHelper + * @author Aave + * @dev Helper library to track user current debt balance, used by WETHGateway + */ +library DataTypesHelper { + /** + * @notice Fetches the user current stable and variable debt balances + * @param user The user address + * @param reserve The reserve data object + * @return The stable debt balance + * @return The variable debt balance + **/ + function getUserCurrentDebt(address user, DataTypes.ReserveData memory reserve) + internal + view + returns (uint256, uint256) + { + return ( + IERC20(reserve.stableDebtTokenAddress).balanceOf(user), + IERC20(reserve.variableDebtTokenAddress).balanceOf(user) + ); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol new file mode 100644 index 00000000..4867e66e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol @@ -0,0 +1,411 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; +import {IRewardsController} from '../rewards/interfaces/IRewardsController.sol'; +import {IUiIncentiveDataProviderV3} from './interfaces/IUiIncentiveDataProviderV3.sol'; +import {IPool} from '@aave/core-v3/contracts/interfaces/IPool.sol'; +import {IncentivizedERC20} from '@aave/core-v3/contracts/protocol/tokenization/base/IncentivizedERC20.sol'; +import {UserConfiguration} from '@aave/core-v3/contracts/protocol/libraries/configuration/UserConfiguration.sol'; +import {DataTypes} from '@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol'; +import {IERC20Detailed} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {IEACAggregatorProxy} from './interfaces/IEACAggregatorProxy.sol'; + +contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { + using UserConfiguration for DataTypes.UserConfigurationMap; + + constructor() {} + + function getFullReservesIncentiveData(IPoolAddressesProvider provider, address user) + external + view + override + returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory) + { + return (_getReservesIncentivesData(provider), _getUserReservesIncentivesData(provider, user)); + } + + function getReservesIncentivesData(IPoolAddressesProvider provider) + external + view + override + returns (AggregatedReserveIncentiveData[] memory) + { + return _getReservesIncentivesData(provider); + } + + function _getReservesIncentivesData(IPoolAddressesProvider provider) + private + view + returns (AggregatedReserveIncentiveData[] memory) + { + IPool pool = IPool(provider.getPool()); + address[] memory reserves = pool.getReservesList(); + AggregatedReserveIncentiveData[] + memory reservesIncentiveData = new AggregatedReserveIncentiveData[](reserves.length); + // Iterate through the reserves to get all the information from the (a/s/v) Tokens + for (uint256 i = 0; i < reserves.length; i++) { + AggregatedReserveIncentiveData memory reserveIncentiveData = reservesIncentiveData[i]; + reserveIncentiveData.underlyingAsset = reserves[i]; + + DataTypes.ReserveData memory baseData = pool.getReserveData(reserves[i]); + + // Get aTokens rewards information + // TODO: check that this is deployed correctly on contract and remove casting + IRewardsController aTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) + ); + RewardInfo[] memory aRewardsInformation; + if (address(aTokenIncentiveController) != address(0)) { + address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( + baseData.aTokenAddress + ); + + aRewardsInformation = new RewardInfo[](aTokenRewardAddresses.length); + for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { + RewardInfo memory rewardInformation; + rewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; + + ( + rewardInformation.tokenIncentivesIndex, + rewardInformation.emissionPerSecond, + rewardInformation.incentivesLastUpdateTimestamp, + rewardInformation.emissionEndTimestamp + ) = aTokenIncentiveController.getRewardsData( + baseData.aTokenAddress, + rewardInformation.rewardTokenAddress + ); + + rewardInformation.precision = aTokenIncentiveController.getAssetDecimals( + baseData.aTokenAddress + ); + rewardInformation.rewardTokenDecimals = IERC20Detailed( + rewardInformation.rewardTokenAddress + ).decimals(); + rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) + .symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + rewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( + rewardInformation.rewardTokenAddress + ); + rewardInformation.priceFeedDecimals = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).decimals(); + rewardInformation.rewardPriceFeed = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).latestAnswer(); + + aRewardsInformation[j] = rewardInformation; + } + } + + reserveIncentiveData.aIncentiveData = IncentiveData( + baseData.aTokenAddress, + address(aTokenIncentiveController), + aRewardsInformation + ); + + // Get vTokens rewards information + IRewardsController vTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) + ); + address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( + baseData.variableDebtTokenAddress + ); + RewardInfo[] memory vRewardsInformation; + + if (address(vTokenIncentiveController) != address(0)) { + vRewardsInformation = new RewardInfo[](vTokenRewardAddresses.length); + for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { + RewardInfo memory rewardInformation; + rewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; + + ( + rewardInformation.tokenIncentivesIndex, + rewardInformation.emissionPerSecond, + rewardInformation.incentivesLastUpdateTimestamp, + rewardInformation.emissionEndTimestamp + ) = vTokenIncentiveController.getRewardsData( + baseData.variableDebtTokenAddress, + rewardInformation.rewardTokenAddress + ); + + rewardInformation.precision = vTokenIncentiveController.getAssetDecimals( + baseData.variableDebtTokenAddress + ); + rewardInformation.rewardTokenDecimals = IERC20Detailed( + rewardInformation.rewardTokenAddress + ).decimals(); + rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) + .symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + rewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( + rewardInformation.rewardTokenAddress + ); + rewardInformation.priceFeedDecimals = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).decimals(); + rewardInformation.rewardPriceFeed = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).latestAnswer(); + + vRewardsInformation[j] = rewardInformation; + } + } + + reserveIncentiveData.vIncentiveData = IncentiveData( + baseData.variableDebtTokenAddress, + address(vTokenIncentiveController), + vRewardsInformation + ); + + // Get sTokens rewards information + IRewardsController sTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.stableDebtTokenAddress).getIncentivesController()) + ); + address[] memory sTokenRewardAddresses = sTokenIncentiveController.getRewardsByAsset( + baseData.stableDebtTokenAddress + ); + RewardInfo[] memory sRewardsInformation; + + if (address(sTokenIncentiveController) != address(0)) { + sRewardsInformation = new RewardInfo[](sTokenRewardAddresses.length); + for (uint256 j = 0; j < sTokenRewardAddresses.length; ++j) { + RewardInfo memory rewardInformation; + rewardInformation.rewardTokenAddress = sTokenRewardAddresses[j]; + + ( + rewardInformation.tokenIncentivesIndex, + rewardInformation.emissionPerSecond, + rewardInformation.incentivesLastUpdateTimestamp, + rewardInformation.emissionEndTimestamp + ) = sTokenIncentiveController.getRewardsData( + baseData.stableDebtTokenAddress, + rewardInformation.rewardTokenAddress + ); + + rewardInformation.precision = sTokenIncentiveController.getAssetDecimals( + baseData.stableDebtTokenAddress + ); + rewardInformation.rewardTokenDecimals = IERC20Detailed( + rewardInformation.rewardTokenAddress + ).decimals(); + rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) + .symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + rewardInformation.rewardOracleAddress = sTokenIncentiveController.getRewardOracle( + rewardInformation.rewardTokenAddress + ); + rewardInformation.priceFeedDecimals = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).decimals(); + rewardInformation.rewardPriceFeed = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).latestAnswer(); + + sRewardsInformation[j] = rewardInformation; + } + } + + reserveIncentiveData.sIncentiveData = IncentiveData( + baseData.stableDebtTokenAddress, + address(sTokenIncentiveController), + sRewardsInformation + ); + } + + return (reservesIncentiveData); + } + + function getUserReservesIncentivesData(IPoolAddressesProvider provider, address user) + external + view + override + returns (UserReserveIncentiveData[] memory) + { + return _getUserReservesIncentivesData(provider, user); + } + + function _getUserReservesIncentivesData(IPoolAddressesProvider provider, address user) + private + view + returns (UserReserveIncentiveData[] memory) + { + IPool pool = IPool(provider.getPool()); + address[] memory reserves = pool.getReservesList(); + + UserReserveIncentiveData[] memory userReservesIncentivesData = new UserReserveIncentiveData[]( + user != address(0) ? reserves.length : 0 + ); + + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveData memory baseData = pool.getReserveData(reserves[i]); + + // user reserve data + userReservesIncentivesData[i].underlyingAsset = reserves[i]; + + IRewardsController aTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) + ); + if (address(aTokenIncentiveController) != address(0)) { + // get all rewards information from the asset + address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( + baseData.aTokenAddress + ); + UserRewardInfo[] memory aUserRewardsInformation = new UserRewardInfo[]( + aTokenRewardAddresses.length + ); + for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { + UserRewardInfo memory userRewardInformation; + userRewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; + + userRewardInformation.tokenIncentivesUserIndex = aTokenIncentiveController + .getUserAssetIndex( + user, + baseData.aTokenAddress, + userRewardInformation.rewardTokenAddress + ); + + userRewardInformation.userUnclaimedRewards = aTokenIncentiveController + .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); + userRewardInformation.rewardTokenDecimals = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).decimals(); + userRewardInformation.rewardTokenSymbol = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + userRewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( + userRewardInformation.rewardTokenAddress + ); + userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).decimals(); + userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).latestAnswer(); + + aUserRewardsInformation[j] = userRewardInformation; + } + + userReservesIncentivesData[i].aTokenIncentivesUserData = UserIncentiveData( + baseData.aTokenAddress, + address(aTokenIncentiveController), + aUserRewardsInformation + ); + } + + // variable debt token + IRewardsController vTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) + ); + if (address(vTokenIncentiveController) != address(0)) { + // get all rewards information from the asset + address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( + baseData.variableDebtTokenAddress + ); + UserRewardInfo[] memory vUserRewardsInformation = new UserRewardInfo[]( + vTokenRewardAddresses.length + ); + for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { + UserRewardInfo memory userRewardInformation; + userRewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; + + userRewardInformation.tokenIncentivesUserIndex = vTokenIncentiveController + .getUserAssetIndex( + user, + baseData.variableDebtTokenAddress, + userRewardInformation.rewardTokenAddress + ); + + userRewardInformation.userUnclaimedRewards = vTokenIncentiveController + .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); + userRewardInformation.rewardTokenDecimals = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).decimals(); + userRewardInformation.rewardTokenSymbol = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + userRewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( + userRewardInformation.rewardTokenAddress + ); + userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).decimals(); + userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).latestAnswer(); + + vUserRewardsInformation[j] = userRewardInformation; + } + + userReservesIncentivesData[i].vTokenIncentivesUserData = UserIncentiveData( + baseData.variableDebtTokenAddress, + address(aTokenIncentiveController), + vUserRewardsInformation + ); + } + + // stable debt toekn + IRewardsController sTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.stableDebtTokenAddress).getIncentivesController()) + ); + if (address(sTokenIncentiveController) != address(0)) { + // get all rewards information from the asset + address[] memory sTokenRewardAddresses = sTokenIncentiveController.getRewardsByAsset( + baseData.stableDebtTokenAddress + ); + UserRewardInfo[] memory sUserRewardsInformation = new UserRewardInfo[]( + sTokenRewardAddresses.length + ); + for (uint256 j = 0; j < sTokenRewardAddresses.length; ++j) { + UserRewardInfo memory userRewardInformation; + userRewardInformation.rewardTokenAddress = sTokenRewardAddresses[j]; + + userRewardInformation.tokenIncentivesUserIndex = sTokenIncentiveController + .getUserAssetIndex( + user, + baseData.stableDebtTokenAddress, + userRewardInformation.rewardTokenAddress + ); + + userRewardInformation.userUnclaimedRewards = sTokenIncentiveController + .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); + userRewardInformation.rewardTokenDecimals = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).decimals(); + userRewardInformation.rewardTokenSymbol = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + userRewardInformation.rewardOracleAddress = sTokenIncentiveController.getRewardOracle( + userRewardInformation.rewardTokenAddress + ); + userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).decimals(); + userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).latestAnswer(); + + sUserRewardsInformation[j] = userRewardInformation; + } + + userReservesIncentivesData[i].sTokenIncentivesUserData = UserIncentiveData( + baseData.stableDebtTokenAddress, + address(aTokenIncentiveController), + sUserRewardsInformation + ); + } + } + + return (userReservesIncentivesData); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol new file mode 100644 index 00000000..857e1874 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol @@ -0,0 +1,262 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {IERC20Detailed} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; +import {IUiPoolDataProviderV3} from './interfaces/IUiPoolDataProviderV3.sol'; +import {IPool} from '@aave/core-v3/contracts/interfaces/IPool.sol'; +import {IAaveOracle} from '@aave/core-v3/contracts/interfaces/IAaveOracle.sol'; +import {IAToken} from '@aave/core-v3/contracts/interfaces/IAToken.sol'; +import {IVariableDebtToken} from '@aave/core-v3/contracts/interfaces/IVariableDebtToken.sol'; +import {IStableDebtToken} from '@aave/core-v3/contracts/interfaces/IStableDebtToken.sol'; +import {WadRayMath} from '@aave/core-v3/contracts/protocol/libraries/math/WadRayMath.sol'; +import {ReserveConfiguration} from '@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '@aave/core-v3/contracts/protocol/libraries/configuration/UserConfiguration.sol'; +import {DataTypes} from '@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol'; +import { + DefaultReserveInterestRateStrategy +} from '@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol'; +import {IEACAggregatorProxy} from './interfaces/IEACAggregatorProxy.sol'; +import {IERC20DetailedBytes} from './interfaces/IERC20DetailedBytes.sol'; +import {AaveProtocolDataProvider} from '@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol'; + +contract UiPoolDataProviderV3 is IUiPoolDataProviderV3 { + using WadRayMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + IEACAggregatorProxy public immutable networkBaseTokenPriceInUsdProxyAggregator; + IEACAggregatorProxy public immutable marketReferenceCurrencyPriceInUsdProxyAggregator; + uint256 public constant ETH_CURRENCY_UNIT = 1 ether; + address public constant MKR_ADDRESS = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; + + + constructor( + IEACAggregatorProxy _networkBaseTokenPriceInUsdProxyAggregator, + IEACAggregatorProxy _marketReferenceCurrencyPriceInUsdProxyAggregator + ) { + networkBaseTokenPriceInUsdProxyAggregator = _networkBaseTokenPriceInUsdProxyAggregator; + marketReferenceCurrencyPriceInUsdProxyAggregator = _marketReferenceCurrencyPriceInUsdProxyAggregator; + } + + function getInterestRateStrategySlopes(DefaultReserveInterestRateStrategy interestRateStrategy) + internal + view + returns ( + InterestRates memory + ) + { + InterestRates memory interestRates; + interestRates.variableRateSlope1 = interestRateStrategy.getVariableRateSlope1(); + interestRates.variableRateSlope2 = interestRateStrategy.getVariableRateSlope2(); + interestRates.stableRateSlope1 = interestRateStrategy.getStableRateSlope1(); + interestRates.stableRateSlope2 = interestRateStrategy.getStableRateSlope2(); + interestRates.baseStableBorrowRate = interestRateStrategy.getBaseStableBorrowRate(); + interestRates.baseVariableBorrowRate = interestRateStrategy.getBaseVariableBorrowRate(); + interestRates.optimalUsageRatio = interestRateStrategy.OPTIMAL_USAGE_RATIO(); + + return interestRates; + } + + function getReservesList(IPoolAddressesProvider provider) + public + view + override + returns (address[] memory) + { + IPool pool = IPool(provider.getPool()); + return pool.getReservesList(); + } + + function getReservesData(IPoolAddressesProvider provider) + public + view + override + returns ( + AggregatedReserveData[] memory, + BaseCurrencyInfo memory + ) + { + IAaveOracle oracle = IAaveOracle(provider.getPriceOracle()); + IPool pool = IPool(provider.getPool()); + AaveProtocolDataProvider poolDataProvider = AaveProtocolDataProvider(provider.getPoolDataProvider()); + + address[] memory reserves = pool.getReservesList(); + AggregatedReserveData[] memory reservesData = new AggregatedReserveData[](reserves.length); + + for (uint256 i = 0; i < reserves.length; i++) { + AggregatedReserveData memory reserveData = reservesData[i]; + reserveData.underlyingAsset = reserves[i]; + + // reserve current state + DataTypes.ReserveData memory baseData = + pool.getReserveData(reserveData.underlyingAsset); + //the liquidity index. Expressed in ray + reserveData.liquidityIndex = baseData.liquidityIndex; + //variable borrow index. Expressed in ray + reserveData.variableBorrowIndex = baseData.variableBorrowIndex; + //the current supply rate. Expressed in ray + reserveData.liquidityRate = baseData.currentLiquidityRate; + //the current variable borrow rate. Expressed in ray + reserveData.variableBorrowRate = baseData.currentVariableBorrowRate; + //the current stable borrow rate. Expressed in ray + reserveData.stableBorrowRate = baseData.currentStableBorrowRate; + reserveData.lastUpdateTimestamp = baseData.lastUpdateTimestamp; + reserveData.aTokenAddress = baseData.aTokenAddress; + reserveData.stableDebtTokenAddress = baseData.stableDebtTokenAddress; + reserveData.variableDebtTokenAddress = baseData.variableDebtTokenAddress; + //address of the interest rate strategy + reserveData.interestRateStrategyAddress = baseData.interestRateStrategyAddress; + reserveData.priceInMarketReferenceCurrency = oracle.getAssetPrice(reserveData.underlyingAsset); + reserveData.priceOracle = oracle.getSourceOfAsset(reserveData.underlyingAsset); + reserveData.availableLiquidity = IERC20Detailed(reserveData.underlyingAsset).balanceOf( + reserveData.aTokenAddress + ); + ( + reserveData.totalPrincipalStableDebt, + , + reserveData.averageStableRate, + reserveData.stableDebtLastUpdateTimestamp + ) = IStableDebtToken(reserveData.stableDebtTokenAddress).getSupplyData(); + reserveData.totalScaledVariableDebt = IVariableDebtToken(reserveData.variableDebtTokenAddress) + .scaledTotalSupply(); + + // Due we take the symbol from underlying token we need a special case for $MKR as symbol() returns bytes32 + if (address(reserveData.underlyingAsset) == address(MKR_ADDRESS)) { + bytes32 symbol = IERC20DetailedBytes(reserveData.underlyingAsset).symbol(); + reserveData.symbol = bytes32ToString(symbol); + } else { + reserveData.symbol = IERC20Detailed(reserveData.underlyingAsset).symbol(); + } + + //stores the reserve configuration + DataTypes.ReserveConfigurationMap memory reserveConfigurationMap = baseData.configuration; + uint256 eModeCategoryId; + ( + reserveData.baseLTVasCollateral, + reserveData.reserveLiquidationThreshold, + reserveData.reserveLiquidationBonus, + reserveData.decimals, + reserveData.reserveFactor, + eModeCategoryId + ) = reserveConfigurationMap.getParams(); + reserveData.usageAsCollateralEnabled = reserveData.baseLTVasCollateral != 0; + + bool isPaused; + ( + reserveData.isActive, + reserveData.isFrozen, + reserveData.borrowingEnabled, + reserveData.stableBorrowRateEnabled, + isPaused + ) = reserveConfigurationMap.getFlags(); + + InterestRates memory interestRates = getInterestRateStrategySlopes( + DefaultReserveInterestRateStrategy(reserveData.interestRateStrategyAddress) + ); + + reserveData.variableRateSlope1 = interestRates.variableRateSlope1; + reserveData.variableRateSlope2 = interestRates.variableRateSlope2; + reserveData.stableRateSlope1 = interestRates.stableRateSlope1; + reserveData.stableRateSlope2 = interestRates.stableRateSlope2; + reserveData.baseStableBorrowRate = interestRates.baseStableBorrowRate; + reserveData.baseVariableBorrowRate = interestRates.baseVariableBorrowRate; + reserveData.optimalUsageRatio = interestRates.optimalUsageRatio; + + // v3 only + reserveData.eModeCategoryId = uint8(eModeCategoryId); + reserveData.debtCeiling = reserveConfigurationMap.getDebtCeiling(); + reserveData.debtCeilingDecimals = poolDataProvider.getDebtCeilingDecimals(); + (reserveData.borrowCap, reserveData.supplyCap) = reserveConfigurationMap.getCaps(); + + reserveData.isPaused = isPaused; + reserveData.unbacked = baseData.unbacked; + reserveData.isolationModeTotalDebt = baseData.isolationModeTotalDebt; + reserveData.accruedToTreasury = baseData.accruedToTreasury; + + DataTypes.EModeCategory memory categoryData = pool.getEModeCategoryData(reserveData.eModeCategoryId); + reserveData.eModeLtv = categoryData.ltv; + reserveData.eModeLiquidationThreshold = categoryData.liquidationThreshold; + reserveData.eModeLiquidationBonus = categoryData.liquidationBonus; + // each eMode category may or may not have a custom oracle to override the individual assets price oracles + reserveData.eModePriceSource = categoryData.priceSource; + reserveData.eModeLabel = categoryData.label; + + reserveData.borrowableInIsolation = reserveConfigurationMap.getBorrowableInIsolation(); + } + + BaseCurrencyInfo memory baseCurrencyInfo; + baseCurrencyInfo.networkBaseTokenPriceInUsd = networkBaseTokenPriceInUsdProxyAggregator.latestAnswer(); + baseCurrencyInfo.networkBaseTokenPriceDecimals = networkBaseTokenPriceInUsdProxyAggregator.decimals(); + + try oracle.BASE_CURRENCY_UNIT() returns (uint256 baseCurrencyUnit) { + baseCurrencyInfo.marketReferenceCurrencyUnit = baseCurrencyUnit; + baseCurrencyInfo.marketReferenceCurrencyPriceInUsd = int256(baseCurrencyUnit); + } catch (bytes memory /*lowLevelData*/) { + baseCurrencyInfo.marketReferenceCurrencyUnit = ETH_CURRENCY_UNIT; + baseCurrencyInfo.marketReferenceCurrencyPriceInUsd = marketReferenceCurrencyPriceInUsdProxyAggregator.latestAnswer(); + } + + return (reservesData, baseCurrencyInfo); + } + + function getUserReservesData(IPoolAddressesProvider provider, address user) + external + view + override + returns (UserReserveData[] memory, uint8) + { + IPool pool = IPool(provider.getPool()); + address[] memory reserves = pool.getReservesList(); + DataTypes.UserConfigurationMap memory userConfig = pool.getUserConfiguration(user); + + uint8 userEmodeCategoryId = uint8(pool.getUserEMode(user)); + + UserReserveData[] memory userReservesData = + new UserReserveData[](user != address(0) ? reserves.length : 0); + + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveData memory baseData = pool.getReserveData(reserves[i]); + + // user reserve data + userReservesData[i].underlyingAsset = reserves[i]; + userReservesData[i].scaledATokenBalance = IAToken(baseData.aTokenAddress).scaledBalanceOf( + user + ); + userReservesData[i].usageAsCollateralEnabledOnUser = userConfig.isUsingAsCollateral(i); + + if (userConfig.isBorrowing(i)) { + userReservesData[i].scaledVariableDebt = IVariableDebtToken( + baseData + .variableDebtTokenAddress + ) + .scaledBalanceOf(user); + userReservesData[i].principalStableDebt = IStableDebtToken(baseData.stableDebtTokenAddress) + .principalBalanceOf(user); + if (userReservesData[i].principalStableDebt != 0) { + userReservesData[i].stableBorrowRate = IStableDebtToken(baseData.stableDebtTokenAddress) + .getUserStableRate(user); + userReservesData[i].stableBorrowLastUpdateTimestamp = IStableDebtToken( + baseData + .stableDebtTokenAddress + ) + .getUserLastUpdated(user); + } + } + } + + return (userReservesData, userEmodeCategoryId); + } + + function bytes32ToString(bytes32 _bytes32) public pure returns (string memory) { + uint8 i = 0; + while (i < 32 && _bytes32[i] != 0) { + i++; + } + bytes memory bytesArray = new bytes(i); + for (i = 0; i < 32 && _bytes32[i] != 0; i++) { + bytesArray[i] = _bytes32[i]; + } + return string(bytesArray); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/WETHGateway.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/WETHGateway.sol new file mode 100644 index 00000000..f56a994a --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/WETHGateway.sol @@ -0,0 +1,218 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {Ownable} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol'; +import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; +import {IWETH} from './interfaces/IWETH.sol'; +import {IWETHGateway} from './interfaces/IWETHGateway.sol'; +import {IPool} from '@aave/core-v3/contracts/interfaces/IPool.sol'; +import {IAToken} from '@aave/core-v3/contracts/interfaces/IAToken.sol'; +import {ReserveConfiguration} from '@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '@aave/core-v3/contracts/protocol/libraries/configuration/UserConfiguration.sol'; +import {DataTypes} from '@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol'; +import {DataTypesHelper} from '../libraries/DataTypesHelper.sol'; + +contract WETHGateway is IWETHGateway, Ownable { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + IWETH internal immutable WETH; + + /** + * @dev Sets the WETH address and the PoolAddressesProvider address. Infinite approves pool. + * @param weth Address of the Wrapped Ether contract + * @param owner Address of the owner of this contract + **/ + constructor(address weth, address owner) { + WETH = IWETH(weth); + transferOwnership(owner); + } + + function authorizePool(address pool) external onlyOwner { + WETH.approve(pool, type(uint256).max); + } + + /** + * @dev deposits WETH into the reserve, using native ETH. A corresponding amount of the overlying asset (aTokens) + * is minted. + * @param pool address of the targeted underlying pool + * @param onBehalfOf address of the user who will receive the aTokens representing the deposit + * @param referralCode integrators are assigned a referral code and can potentially receive rewards. + **/ + function depositETH( + address pool, + address onBehalfOf, + uint16 referralCode + ) external payable override { + WETH.deposit{value: msg.value}(); + IPool(pool).deposit(address(WETH), msg.value, onBehalfOf, referralCode); + } + + /** + * @dev withdraws the WETH _reserves of msg.sender. + * @param pool address of the targeted underlying pool + * @param amount amount of aWETH to withdraw and receive native ETH + * @param to address of the user who will receive native ETH + */ + function withdrawETH( + address pool, + uint256 amount, + address to + ) external override { + IAToken aWETH = IAToken(IPool(pool).getReserveData(address(WETH)).aTokenAddress); + uint256 userBalance = aWETH.balanceOf(msg.sender); + uint256 amountToWithdraw = amount; + + // if amount is equal to uint(-1), the user wants to redeem everything + if (amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); + IPool(pool).withdraw(address(WETH), amountToWithdraw, address(this)); + WETH.withdraw(amountToWithdraw); + _safeTransferETH(to, amountToWithdraw); + } + + /** + * @dev repays a borrow on the WETH reserve, for the specified amount (or for the whole amount, if uint256(-1) is specified). + * @param pool address of the targeted underlying pool + * @param amount the amount to repay, or uint256(-1) if the user wants to repay everything + * @param rateMode the rate mode to repay + * @param onBehalfOf the address for which msg.sender is repaying + */ + function repayETH( + address pool, + uint256 amount, + uint256 rateMode, + address onBehalfOf + ) external payable override { + (uint256 stableDebt, uint256 variableDebt) = DataTypesHelper.getUserCurrentDebt( + onBehalfOf, + IPool(pool).getReserveData(address(WETH)) + ); + + uint256 paybackAmount = DataTypes.InterestRateMode(rateMode) == + DataTypes.InterestRateMode.STABLE + ? stableDebt + : variableDebt; + + if (amount < paybackAmount) { + paybackAmount = amount; + } + require(msg.value >= paybackAmount, 'msg.value is less than repayment amount'); + WETH.deposit{value: paybackAmount}(); + IPool(pool).repay(address(WETH), msg.value, rateMode, onBehalfOf); + + // refund remaining dust eth + if (msg.value > paybackAmount) _safeTransferETH(msg.sender, msg.value - paybackAmount); + } + + /** + * @dev borrow WETH, unwraps to ETH and send both the ETH and DebtTokens to msg.sender, via `approveDelegation` and onBehalf argument in `Pool.borrow`. + * @param pool address of the targeted underlying pool + * @param amount the amount of ETH to borrow + * @param interesRateMode the interest rate mode + * @param referralCode integrators are assigned a referral code and can potentially receive rewards + */ + function borrowETH( + address pool, + uint256 amount, + uint256 interesRateMode, + uint16 referralCode + ) external override { + IPool(pool).borrow(address(WETH), amount, interesRateMode, referralCode, msg.sender); + WETH.withdraw(amount); + _safeTransferETH(msg.sender, amount); + } + + /** + * @dev withdraws the WETH _reserves of msg.sender. + * @param pool address of the targeted underlying pool + * @param amount amount of aWETH to withdraw and receive native ETH + * @param to address of the user who will receive native ETH + * @param deadline validity deadline of permit and so depositWithPermit signature + * @param permitV V parameter of ERC712 permit sig + * @param permitR R parameter of ERC712 permit sig + * @param permitS S parameter of ERC712 permit sig + */ + function withdrawETHWithPermit( + address pool, + uint256 amount, + address to, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external override { + IAToken aWETH = IAToken(IPool(pool).getReserveData(address(WETH)).aTokenAddress); + uint256 userBalance = aWETH.balanceOf(msg.sender); + uint256 amountToWithdraw = amount; + + // if amount is equal to uint(-1), the user wants to redeem everything + if (amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + // chosing to permit `amount`and not `amountToWithdraw`, easier for frontends, intregrators. + aWETH.permit(msg.sender, address(this), amount, deadline, permitV, permitR, permitS); + aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); + IPool(pool).withdraw(address(WETH), amountToWithdraw, address(this)); + WETH.withdraw(amountToWithdraw); + _safeTransferETH(to, amountToWithdraw); + } + + /** + * @dev transfer ETH to an address, revert if it fails. + * @param to recipient of the transfer + * @param value the amount to send + */ + function _safeTransferETH(address to, uint256 value) internal { + (bool success, ) = to.call{value: value}(new bytes(0)); + require(success, 'ETH_TRANSFER_FAILED'); + } + + /** + * @dev transfer ERC20 from the utility contract, for ERC20 recovery in case of stuck tokens due + * direct transfers to the contract address. + * @param token token to transfer + * @param to recipient of the transfer + * @param amount amount to send + */ + function emergencyTokenTransfer( + address token, + address to, + uint256 amount + ) external onlyOwner { + IERC20(token).transfer(to, amount); + } + + /** + * @dev transfer native Ether from the utility contract, for native Ether recovery in case of stuck Ether + * due selfdestructs or transfer ether to pre-computated contract address before deployment. + * @param to recipient of the transfer + * @param amount amount to send + */ + function emergencyEtherTransfer(address to, uint256 amount) external onlyOwner { + _safeTransferETH(to, amount); + } + + /** + * @dev Get WETH address used by WETHGateway + */ + function getWETHAddress() external view returns (address) { + return address(WETH); + } + + /** + * @dev Only WETH contract is allowed to transfer ETH here. Prevent other addresses to send Ether to this contract. + */ + receive() external payable { + require(msg.sender == address(WETH), 'Receive not allowed'); + } + + /** + * @dev Revert fallback calls + */ + fallback() external payable { + revert('Fallback not allowed'); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol new file mode 100644 index 00000000..a5e42e86 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {Address} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol'; +import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; + +import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '@aave/core-v3/contracts/interfaces/IPool.sol'; +import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {ReserveConfiguration} from '@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol'; +import {DataTypes} from '@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol'; + +/** + * @title WalletBalanceProvider contract + * @author Aave, influenced by https://github.com/wbobeirne/eth-balance-checker/blob/master/contracts/BalanceChecker.sol + * @notice Implements a logic of getting multiple tokens balance for one user address + * @dev NOTE: THIS CONTRACT IS NOT USED WITHIN THE AAVE PROTOCOL. It's an accessory contract used to reduce the number of calls + * towards the blockchain from the Aave backend. + **/ +contract WalletBalanceProvider { + using Address for address payable; + using Address for address; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + address constant MOCK_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /** + @dev Fallback function, don't accept any ETH + **/ + receive() external payable { + //only contracts can send ETH to the core + require(msg.sender.isContract(), '22'); + } + + /** + @dev Check the token balance of a wallet in a token contract + + Returns the balance of the token for user. Avoids possible errors: + - return 0 on non-contract address + **/ + function balanceOf(address user, address token) public view returns (uint256) { + if (token == MOCK_ETH_ADDRESS) { + return user.balance; // ETH balance + // check if token is actually a contract + } else if (token.isContract()) { + return IERC20(token).balanceOf(user); + } + revert('INVALID_TOKEN'); + } + + /** + * @notice Fetches, for a list of _users and _tokens (ETH included with mock address), the balances + * @param users The list of users + * @param tokens The list of tokens + * @return And array with the concatenation of, for each user, his/her balances + **/ + function batchBalanceOf(address[] calldata users, address[] calldata tokens) + external + view + returns (uint256[] memory) + { + uint256[] memory balances = new uint256[](users.length * tokens.length); + + for (uint256 i = 0; i < users.length; i++) { + for (uint256 j = 0; j < tokens.length; j++) { + balances[i * tokens.length + j] = balanceOf(users[i], tokens[j]); + } + } + + return balances; + } + + /** + @dev provides balances of user wallet for all reserves available on the pool + */ + function getUserWalletBalances(address provider, address user) + external + view + returns (address[] memory, uint256[] memory) + { + IPool pool = IPool(IPoolAddressesProvider(provider).getPool()); + + address[] memory reserves = pool.getReservesList(); + address[] memory reservesWithEth = new address[](reserves.length + 1); + for (uint256 i = 0; i < reserves.length; i++) { + reservesWithEth[i] = reserves[i]; + } + reservesWithEth[reserves.length] = MOCK_ETH_ADDRESS; + + uint256[] memory balances = new uint256[](reservesWithEth.length); + + for (uint256 j = 0; j < reserves.length; j++) { + DataTypes.ReserveConfigurationMap memory configuration = pool.getConfiguration( + reservesWithEth[j] + ); + + (bool isActive, , , , ) = configuration.getFlags(); + + if (!isActive) { + balances[j] = 0; + continue; + } + balances[j] = balanceOf(user, reservesWithEth[j]); + } + balances[reserves.length] = balanceOf(user, MOCK_ETH_ADDRESS); + + return (reservesWithEth, balances); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol new file mode 100644 index 00000000..ddb6f137 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IERC20DetailedBytes.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IERC20DetailedBytes.sol new file mode 100644 index 00000000..15aa07dc --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IERC20DetailedBytes.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; + +interface IERC20DetailedBytes is IERC20 { + function name() external view returns (bytes32); + + function symbol() external view returns (bytes32); + + function decimals() external view returns (uint8); +} \ No newline at end of file diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IUiIncentiveDataProviderV3.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IUiIncentiveDataProviderV3.sol new file mode 100644 index 00000000..ec3832f3 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IUiIncentiveDataProviderV3.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; + +interface IUiIncentiveDataProviderV3 { + struct AggregatedReserveIncentiveData { + address underlyingAsset; + IncentiveData aIncentiveData; + IncentiveData vIncentiveData; + IncentiveData sIncentiveData; + } + + struct IncentiveData { + address tokenAddress; + address incentiveControllerAddress; + RewardInfo[] rewardsTokenInformation; + } + + struct RewardInfo { + string rewardTokenSymbol; + address rewardTokenAddress; + address rewardOracleAddress; + uint256 emissionPerSecond; + uint256 incentivesLastUpdateTimestamp; + uint256 tokenIncentivesIndex; + uint256 emissionEndTimestamp; + int256 rewardPriceFeed; + uint8 rewardTokenDecimals; + uint8 precision; + uint8 priceFeedDecimals; + } + + struct UserReserveIncentiveData { + address underlyingAsset; + UserIncentiveData aTokenIncentivesUserData; + UserIncentiveData vTokenIncentivesUserData; + UserIncentiveData sTokenIncentivesUserData; + } + + struct UserIncentiveData { + address tokenAddress; + address incentiveControllerAddress; + UserRewardInfo[] userRewardsInformation; + } + + struct UserRewardInfo { + string rewardTokenSymbol; + address rewardOracleAddress; + address rewardTokenAddress; + uint256 userUnclaimedRewards; + uint256 tokenIncentivesUserIndex; + int256 rewardPriceFeed; + uint8 priceFeedDecimals; + uint8 rewardTokenDecimals; + + } + + function getReservesIncentivesData(IPoolAddressesProvider provider) + external + view + returns (AggregatedReserveIncentiveData[] memory); + + function getUserReservesIncentivesData(IPoolAddressesProvider provider, address user) + external + view + returns (UserReserveIncentiveData[] memory); + + // generic method with full data + function getFullReservesIncentiveData(IPoolAddressesProvider provider, address user) + external + view + returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory); +} \ No newline at end of file diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IUiPoolDataProviderV3.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IUiPoolDataProviderV3.sol new file mode 100644 index 00000000..2918ed71 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IUiPoolDataProviderV3.sol @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; +import {DataTypes} from '@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol'; + +interface IUiPoolDataProviderV3 { + struct InterestRates { + uint256 variableRateSlope1; + uint256 variableRateSlope2; + uint256 stableRateSlope1; + uint256 stableRateSlope2; + uint256 baseStableBorrowRate; + uint256 baseVariableBorrowRate; + uint256 optimalUsageRatio; + } + + struct AggregatedReserveData { + address underlyingAsset; + string name; + string symbol; + uint256 decimals; + uint256 baseLTVasCollateral; + uint256 reserveLiquidationThreshold; + uint256 reserveLiquidationBonus; + uint256 reserveFactor; + bool usageAsCollateralEnabled; + bool borrowingEnabled; + bool stableBorrowRateEnabled; + bool isActive; + bool isFrozen; + // base data + uint128 liquidityIndex; + uint128 variableBorrowIndex; + uint128 liquidityRate; + uint128 variableBorrowRate; + uint128 stableBorrowRate; + uint40 lastUpdateTimestamp; + address aTokenAddress; + address stableDebtTokenAddress; + address variableDebtTokenAddress; + address interestRateStrategyAddress; + // + uint256 availableLiquidity; + uint256 totalPrincipalStableDebt; + uint256 averageStableRate; + uint256 stableDebtLastUpdateTimestamp; + uint256 totalScaledVariableDebt; + uint256 priceInMarketReferenceCurrency; + address priceOracle; + uint256 variableRateSlope1; + uint256 variableRateSlope2; + uint256 stableRateSlope1; + uint256 stableRateSlope2; + uint256 baseStableBorrowRate; + uint256 baseVariableBorrowRate; + uint256 optimalUsageRatio; + // v3 only + bool isPaused; + uint128 accruedToTreasury; + uint128 unbacked; + uint128 isolationModeTotalDebt; + // + uint256 debtCeiling; + uint256 debtCeilingDecimals; + uint8 eModeCategoryId; + uint256 borrowCap; + uint256 supplyCap; + // eMode + uint16 eModeLtv; + uint16 eModeLiquidationThreshold; + uint16 eModeLiquidationBonus; + address eModePriceSource; + string eModeLabel; + bool borrowableInIsolation; + } + + struct UserReserveData { + address underlyingAsset; + uint256 scaledATokenBalance; + bool usageAsCollateralEnabledOnUser; + uint256 stableBorrowRate; + uint256 scaledVariableDebt; + uint256 principalStableDebt; + uint256 stableBorrowLastUpdateTimestamp; + } + + struct BaseCurrencyInfo { + uint256 marketReferenceCurrencyUnit; + int256 marketReferenceCurrencyPriceInUsd; + int256 networkBaseTokenPriceInUsd; + uint8 networkBaseTokenPriceDecimals; + } + + function getReservesList(IPoolAddressesProvider provider) + external + view + returns (address[] memory); + + function getReservesData(IPoolAddressesProvider provider) + external + view + returns ( + AggregatedReserveData[] memory, + BaseCurrencyInfo memory + ); + + function getUserReservesData(IPoolAddressesProvider provider, address user) + external + view + returns ( + UserReserveData[] memory, uint8 + ); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IWETH.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IWETH.sol new file mode 100644 index 00000000..071b5d69 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IWETH.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +interface IWETH { + function deposit() external payable; + + function withdraw(uint256) external; + + function approve(address guy, uint256 wad) external returns (bool); + + function transferFrom( + address src, + address dst, + uint256 wad + ) external returns (bool); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IWETHGateway.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IWETHGateway.sol new file mode 100644 index 00000000..56bafdf5 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IWETHGateway.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +interface IWETHGateway { + function depositETH( + address pool, + address onBehalfOf, + uint16 referralCode + ) external payable; + + function withdrawETH( + address pool, + uint256 amount, + address onBehalfOf + ) external; + + function repayETH( + address pool, + uint256 amount, + uint256 rateMode, + address onBehalfOf + ) external payable; + + function borrowETH( + address pool, + uint256 amount, + uint256 interesRateMode, + uint16 referralCode + ) external; + + function withdrawETHWithPermit( + address pool, + uint256 amount, + address to, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/RewardsController.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/RewardsController.sol new file mode 100644 index 00000000..062dce7e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/RewardsController.sol @@ -0,0 +1,367 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; +import {SafeCast} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IScaledBalanceToken} from '@aave/core-v3/contracts/interfaces/IScaledBalanceToken.sol'; +import {RewardsDistributor} from './RewardsDistributor.sol'; +import {IRewardsController} from './interfaces/IRewardsController.sol'; +import {ITransferStrategyBase} from './interfaces/ITransferStrategyBase.sol'; +import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol'; +import {IEACAggregatorProxy} from '../misc/interfaces/IEACAggregatorProxy.sol'; + +/** + * @title RewardsController + * @notice Abstract contract template to build Distributors contracts for ERC20 rewards to protocol participants + * @author Aave + **/ +contract RewardsController is RewardsDistributor, VersionedInitializable, IRewardsController { + using SafeCast for uint256; + + uint256 public constant REVISION = 1; + + // This mapping allows whitelisted addresses to claim on behalf of others + // useful for contracts that hold tokens to be rewarded but don't have any native logic to claim Liquidity Mining rewards + mapping(address => address) internal _authorizedClaimers; + + // reward => transfer strategy implementation contract + // The TransferStrategy contract abstracts the logic regarding + // the source of the reward and how to transfer it to the user. + mapping(address => ITransferStrategyBase) internal _transferStrategy; + + // This mapping contains the price oracle per reward. + // A price oracle is enforced for integrators to be able to show incentives at + // the current Aave UI without the need to setup an external price registry + // At the moment of reward configuration, the Incentives Controller performs + // a check to see if the provided reward oracle contains `latestAnswer`. + mapping(address => IEACAggregatorProxy) internal _rewardOracle; + + modifier onlyAuthorizedClaimers(address claimer, address user) { + require(_authorizedClaimers[user] == claimer, 'CLAIMER_UNAUTHORIZED'); + _; + } + + constructor(address emissionManager) RewardsDistributor(emissionManager) {} + + /** + * @dev Empty initialize for RewardsController + **/ + function initialize() external initializer {} + + /// @inheritdoc IRewardsController + function getClaimer(address user) external view override returns (address) { + return _authorizedClaimers[user]; + } + + /** + * @dev Returns the revision of the implementation contract + * @return uint256, current revision version + */ + function getRevision() internal pure override returns (uint256) { + return REVISION; + } + + /// @inheritdoc IRewardsController + function getRewardOracle(address reward) external view override returns (address) { + return address(_rewardOracle[reward]); + } + + /// @inheritdoc IRewardsController + function getTransferStrategy(address reward) external view override returns (address) { + return address(_transferStrategy[reward]); + } + + /// @inheritdoc IRewardsController + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) + external + override + onlyEmissionManager + { + for (uint256 i = 0; i < config.length; i++) { + // Get the current Scaled Total Supply of AToken or Debt token + config[i].totalSupply = IScaledBalanceToken(config[i].asset).scaledTotalSupply(); + + // Install TransferStrategy logic at IncentivesController + _installTransferStrategy(config[i].reward, config[i].transferStrategy); + + // Set reward oracle, enforces input oracle to have latestPrice function + _setRewardOracle(config[i].reward, config[i].rewardOracle); + } + _configureAssets(config); + } + + /// @inheritdoc IRewardsController + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) + external + onlyEmissionManager + { + _installTransferStrategy(reward, transferStrategy); + } + + /// @inheritdoc IRewardsController + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) + external + onlyEmissionManager + { + _setRewardOracle(reward, rewardOracle); + } + + /// @inheritdoc IRewardsController + function handleAction( + address user, + uint256 totalSupply, + uint256 userBalance + ) external override { + _updateData(msg.sender, user, userBalance, totalSupply); + } + + /// @inheritdoc IRewardsController + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external override returns (uint256) { + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimRewards(assets, amount, msg.sender, msg.sender, to, reward); + } + + /// @inheritdoc IRewardsController + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external override onlyAuthorizedClaimers(msg.sender, user) returns (uint256) { + require(user != address(0), 'INVALID_USER_ADDRESS'); + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimRewards(assets, amount, msg.sender, user, to, reward); + } + + /// @inheritdoc IRewardsController + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external override returns (uint256) { + return _claimRewards(assets, amount, msg.sender, msg.sender, msg.sender, reward); + } + + /// @inheritdoc IRewardsController + function claimAllRewards(address[] calldata assets, address to) + external + override + returns (address[] memory rewardsList, uint256[] memory claimedAmounts) + { + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimAllRewards(assets, msg.sender, msg.sender, to); + } + + /// @inheritdoc IRewardsController + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) + external + override + onlyAuthorizedClaimers(msg.sender, user) + returns (address[] memory rewardsList, uint256[] memory claimedAmounts) + { + require(user != address(0), 'INVALID_USER_ADDRESS'); + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimAllRewards(assets, msg.sender, user, to); + } + + /// @inheritdoc IRewardsController + function claimAllRewardsToSelf(address[] calldata assets) + external + override + returns (address[] memory rewardsList, uint256[] memory claimedAmounts) + { + return _claimAllRewards(assets, msg.sender, msg.sender, msg.sender); + } + + /// @inheritdoc IRewardsController + function setClaimer(address user, address caller) external override onlyEmissionManager { + _authorizedClaimers[user] = caller; + emit ClaimerSet(user, caller); + } + + /** + * @dev Get user balances and total supply of all the assets specified by the assets parameter + * @param assets List of assets to retrieve user balance and total supply + * @param user Address of the user + * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets + */ + function _getUserAssetBalances(address[] calldata assets, address user) + internal + view + override + returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances) + { + userAssetBalances = new RewardsDataTypes.UserAssetBalance[](assets.length); + for (uint256 i = 0; i < assets.length; i++) { + userAssetBalances[i].asset = assets[i]; + (userAssetBalances[i].userBalance, userAssetBalances[i].totalSupply) = IScaledBalanceToken(assets[i]) + .getScaledUserBalanceAndSupply(user); + } + return userAssetBalances; + } + + /** + * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount Amount of rewards to claim + * @param claimer Address of the claimer who claims rewards on behalf of user + * @param user Address to check and claim rewards + * @param to Address that will be receiving the rewards + * @param reward Address of the reward token + * @return Rewards claimed + **/ + function _claimRewards( + address[] calldata assets, + uint256 amount, + address claimer, + address user, + address to, + address reward + ) internal returns (uint256) { + if (amount == 0) { + return 0; + } + uint256 totalRewards; + + _updateDataMultiple(user, _getUserAssetBalances(assets, user)); + for (uint256 i = 0; i < assets.length; i++) { + address asset = assets[i]; + totalRewards += _assets[asset].rewards[reward].usersData[user].accrued; + + if (totalRewards <= amount) { + _assets[asset].rewards[reward].usersData[user].accrued = 0; + } else { + uint256 difference = totalRewards - amount; + totalRewards -= difference; + _assets[asset].rewards[reward].usersData[user].accrued = difference.toUint128(); + break; + } + } + + if (totalRewards == 0) { + return 0; + } + + _transferRewards(to, reward, totalRewards); + emit RewardsClaimed(user, reward, to, claimer, totalRewards); + + return totalRewards; + } + + /** + * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. + * @param assets List of assets to check eligible distributions before claiming rewards + * @param claimer Address of the claimer on behalf of user + * @param user Address to check and claim rewards + * @param to Address that will be receiving the rewards + * @return + * rewardsList List of reward addresses + * claimedAmount List of claimed amounts, follows "rewardsList" items order + **/ + function _claimAllRewards( + address[] calldata assets, + address claimer, + address user, + address to + ) internal returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { + uint256 rewardsListLength = _rewardsList.length; + rewardsList = new address[](rewardsListLength); + claimedAmounts = new uint256[](rewardsListLength); + + _updateDataMultiple(user, _getUserAssetBalances(assets, user)); + + for (uint256 i = 0; i < assets.length; i++) { + address asset = assets[i]; + for (uint256 j = 0; j < rewardsListLength; j++) { + if (rewardsList[j] == address(0)) { + rewardsList[j] = _rewardsList[j]; + } + uint256 rewardAmount = _assets[asset].rewards[rewardsList[j]].usersData[user].accrued; + if (rewardAmount != 0) { + claimedAmounts[j] += rewardAmount; + _assets[asset].rewards[rewardsList[j]].usersData[user].accrued = 0; + } + } + } + for (uint256 i = 0; i < rewardsListLength; i++) { + _transferRewards(to, rewardsList[i], claimedAmounts[i]); + emit RewardsClaimed(user, rewardsList[i], to, claimer, claimedAmounts[i]); + } + return (rewardsList, claimedAmounts); + } + + /** + * @dev Function to transfer rewards to the desired account using delegatecall and + * @param to Account address to send the rewards + * @param reward Address of the reward token + * @param amount Amount of rewards to transfer + */ + function _transferRewards( + address to, + address reward, + uint256 amount + ) internal { + ITransferStrategyBase transferStrategy = _transferStrategy[reward]; + + bool success = transferStrategy.performTransfer(to, reward, amount); + + require(success == true, 'TRANSFER_ERROR'); + } + + /** + * @dev Returns true if `account` is a contract. + * @param account The address of the account + * @return bool, true if contract, false otherwise + */ + function _isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + // solhint-disable-next-line no-inline-assembly + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Internal function to call the optional install hook at the TransferStrategy + * @param reward The address of the reward token + * @param transferStrategy The address of the reward TransferStrategy + */ + function _installTransferStrategy(address reward, ITransferStrategyBase transferStrategy) + internal + { + require(address(transferStrategy) != address(0), 'STRATEGY_CAN_NOT_BE_ZERO'); + require(_isContract(address(transferStrategy)) == true, 'STRATEGY_MUST_BE_CONTRACT'); + + _transferStrategy[reward] = transferStrategy; + + emit TransferStrategyInstalled(reward, address(transferStrategy)); + } + + /** + * @dev Update the Price Oracle of a reward token. The Price Oracle must follow Chainlink IEACAggregatorProxy interface. + * @notice The Price Oracle of a reward is used for displaying correct data about the incentives at the UI frontend. + * @param reward The address of the reward token + * @param rewardOracle The address of the price oracle + */ + + function _setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) internal { + require(rewardOracle.latestAnswer() > 0, 'ORACLE_MUST_RETURN_PRICE'); + _rewardOracle[reward] = rewardOracle; + emit RewardOracleUpdated(reward, address(rewardOracle)); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/RewardsDistributor.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/RewardsDistributor.sol new file mode 100644 index 00000000..b64d2a65 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/RewardsDistributor.sol @@ -0,0 +1,516 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {IERC20Detailed} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IRewardsDistributor} from './interfaces/IRewardsDistributor.sol'; +import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol'; + +/** + * @title RewardsDistributor + * @notice Accounting contract to manage multiple staking distributions with multiple rewards + * @author Aave + **/ +abstract contract RewardsDistributor is IRewardsDistributor { + using SafeCast for uint256; + // manager of incentives + address public immutable EMISSION_MANAGER; + + // asset => AssetData + mapping(address => RewardsDataTypes.AssetData) internal _assets; + + // reward => enabled + mapping(address => bool) internal _isRewardEnabled; + + // global rewards list + address[] internal _rewardsList; + + //global assets list + address[] internal _assetsList; + + modifier onlyEmissionManager() { + require(msg.sender == EMISSION_MANAGER, 'ONLY_EMISSION_MANAGER'); + _; + } + + constructor(address emissionManager) { + EMISSION_MANAGER = emissionManager; + } + + /// @inheritdoc IRewardsDistributor + function getRewardsData(address asset, address reward) + public + view + override + returns ( + uint256, + uint256, + uint256, + uint256 + ) + { + return ( + _assets[asset].rewards[reward].index, + _assets[asset].rewards[reward].emissionPerSecond, + _assets[asset].rewards[reward].lastUpdateTimestamp, + _assets[asset].rewards[reward].distributionEnd + ); + } + + /// @inheritdoc IRewardsDistributor + function getDistributionEnd(address asset, address reward) + external + view + override + returns (uint256) + { + return _assets[asset].rewards[reward].distributionEnd; + } + + /// @inheritdoc IRewardsDistributor + function getRewardsByAsset(address asset) external view override returns (address[] memory) { + uint128 rewardsCount = _assets[asset].availableRewardsCount; + address[] memory availableRewards = new address[](rewardsCount); + + for (uint128 i = 0; i < rewardsCount; i++) { + availableRewards[i] = _assets[asset].availableRewards[i]; + } + return availableRewards; + } + + /// @inheritdoc IRewardsDistributor + function getRewardsList() external view override returns (address[] memory) { + return _rewardsList; + } + + /// @inheritdoc IRewardsDistributor + function getUserAssetIndex( + address user, + address asset, + address reward + ) public view override returns (uint256) { + return _assets[asset].rewards[reward].usersData[user].index; + } + + /// @inheritdoc IRewardsDistributor + function getUserAccruedRewards(address user, address reward) + external + view + override + returns (uint256) + { + uint256 totalAccrued; + for (uint256 i = 0; i < _assetsList.length; i++) { + totalAccrued += _assets[_assetsList[i]].rewards[reward].usersData[user].accrued; + } + + return totalAccrued; + } + + /// @inheritdoc IRewardsDistributor + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view override returns (uint256) { + return _getUserReward(user, reward, _getUserAssetBalances(assets, user)); + } + + /// @inheritdoc IRewardsDistributor + function getAllUserRewards(address[] calldata assets, address user) + external + view + override + returns (address[] memory rewardsList, uint256[] memory unclaimedAmounts) + { + RewardsDataTypes.UserAssetBalance[] memory userAssetBalances = _getUserAssetBalances(assets, user); + rewardsList = new address[](_rewardsList.length); + unclaimedAmounts = new uint256[](rewardsList.length); + + // Add unrealized rewards from user to unclaimedRewards + for (uint256 i = 0; i < userAssetBalances.length; i++) { + for (uint256 r = 0; r < rewardsList.length; r++) { + rewardsList[r] = _rewardsList[r]; + unclaimedAmounts[r] += _assets[userAssetBalances[i].asset] + .rewards[rewardsList[r]] + .usersData[user] + .accrued; + + if (userAssetBalances[i].userBalance == 0) { + continue; + } + unclaimedAmounts[r] += _getPendingRewards( + user, + rewardsList[r], + userAssetBalances[i] + ); + } + } + return (rewardsList, unclaimedAmounts); + } + + /// @inheritdoc IRewardsDistributor + function setDistributionEnd( + address asset, + address reward, + uint32 newDistributionEnd + ) external override onlyEmissionManager { + uint256 oldDistributionEnd = _assets[asset].rewards[reward].distributionEnd; + _assets[asset].rewards[reward].distributionEnd = newDistributionEnd; + + emit AssetConfigUpdated( + asset, + reward, + _assets[asset].rewards[reward].emissionPerSecond, + _assets[asset].rewards[reward].emissionPerSecond, + oldDistributionEnd, + newDistributionEnd, + _assets[asset].rewards[reward].index + ); + } + + /// @inheritdoc IRewardsDistributor + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external override onlyEmissionManager { + require(rewards.length == newEmissionsPerSecond.length, 'INVALID_INPUT'); + for (uint256 i = 0; i < rewards.length; i++) { + RewardsDataTypes.AssetData storage assetConfig = _assets[asset]; + RewardsDataTypes.RewardData storage rewardConfig = _assets[asset].rewards[rewards[i]]; + uint256 decimals = assetConfig.decimals; + require(decimals != 0 && rewardConfig.lastUpdateTimestamp != 0, 'DISTRIBUTION_DOES_NOT_EXIST'); + + (uint256 newIndex, ) = _updateRewardData( + rewardConfig, + IERC20Detailed(asset).totalSupply(), + 10**decimals + ); + + uint256 oldEmissionPerSecond = rewardConfig.emissionPerSecond; + rewardConfig.emissionPerSecond = newEmissionsPerSecond[i]; + + emit AssetConfigUpdated( + asset, + rewards[i], + oldEmissionPerSecond, + newEmissionsPerSecond[i], + rewardConfig.distributionEnd, + rewardConfig.distributionEnd, + newIndex + ); + } + } + + /** + * @dev Configure the _assets for a specific emission + * @param rewardsInput The array of each asset configuration + **/ + function _configureAssets(RewardsDataTypes.RewardsConfigInput[] memory rewardsInput) internal { + for (uint256 i = 0; i < rewardsInput.length; i++) { + if (_assets[rewardsInput[i].asset].decimals == 0) { + //never initialized before, adding to the list of assets + _assetsList.push(rewardsInput[i].asset); + } + + uint256 decimals = _assets[rewardsInput[i].asset].decimals = IERC20Detailed( + rewardsInput[i].asset + ).decimals(); + + RewardsDataTypes.RewardData storage rewardConfig = _assets[rewardsInput[i].asset].rewards[ + rewardsInput[i].reward + ]; + + // Add reward address to asset available rewards if latestUpdateTimestamp is zero + if (rewardConfig.lastUpdateTimestamp == 0) { + _assets[rewardsInput[i].asset].availableRewards[ + _assets[rewardsInput[i].asset].availableRewardsCount + ] = rewardsInput[i].reward; + _assets[rewardsInput[i].asset].availableRewardsCount++; + } + + // Add reward address to global rewards list if still not enabled + if (_isRewardEnabled[rewardsInput[i].reward] == false) { + _isRewardEnabled[rewardsInput[i].reward] = true; + _rewardsList.push(rewardsInput[i].reward); + } + + // Due emissions is still zero, updates only latestUpdateTimestamp + (uint256 newIndex, ) = _updateRewardData( + rewardConfig, + rewardsInput[i].totalSupply, + 10**decimals + ); + + // Configure emission and distribution end of the reward per asset + uint88 oldEmissionsPerSecond = rewardConfig.emissionPerSecond; + uint32 oldDistributionEnd = rewardConfig.distributionEnd; + rewardConfig.emissionPerSecond = rewardsInput[i].emissionPerSecond; + rewardConfig.distributionEnd = rewardsInput[i].distributionEnd; + + emit AssetConfigUpdated( + rewardsInput[i].asset, + rewardsInput[i].reward, + oldEmissionsPerSecond, + rewardsInput[i].emissionPerSecond, + oldDistributionEnd, + rewardsInput[i].distributionEnd, + newIndex + ); + } + } + + /** + * @dev Updates the state of the distribution for the specified reward + * @param rewardData Storage pointer to the distribution reward config + * @param totalSupply Current total of underlying assets for this distribution + * @param assetUnit One unit of asset (10**decimals) + * @return The new distribution index + * @return True if the index was updated, false otherwise + **/ + function _updateRewardData( + RewardsDataTypes.RewardData storage rewardData, + uint256 totalSupply, + uint256 assetUnit + ) internal returns (uint256, bool) { + (uint256 oldIndex, uint256 newIndex) = _getAssetIndex(rewardData, totalSupply, assetUnit); + bool indexUpdated; + if (newIndex != oldIndex) { + require(newIndex <= type(uint104).max, 'INDEX_OVERFLOW'); + indexUpdated = true; + + //optimization: storing one after another saves one SSTORE + rewardData.index = uint104(newIndex); + rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); + } else { + rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); + } + + return (newIndex, indexUpdated); + } + + /** + * @dev Updates the state of the distribution for the specific user + * @param rewardData Storage pointer to the distribution reward config + * @param user The address of the user + * @param userBalance The user balance of the asset + * @param newAssetIndex The new index of the asset distribution + * @param assetUnit One unit of asset (10**decimals) + * @return The rewards accrued since the last update + **/ + function _updateUserData( + RewardsDataTypes.RewardData storage rewardData, + address user, + uint256 userBalance, + uint256 newAssetIndex, + uint256 assetUnit + ) internal returns (uint256, bool) { + uint256 userIndex = rewardData.usersData[user].index; + uint256 rewardsAccrued; + bool dataUpdated; + if ((dataUpdated = userIndex != newAssetIndex)) { + // already checked for overflow in _updateRewardData + rewardData.usersData[user].index = uint104(newAssetIndex); + if (userBalance != 0) { + rewardsAccrued = _getRewards(userBalance, newAssetIndex, userIndex, assetUnit); + + rewardData.usersData[user].accrued += rewardsAccrued.toUint128(); + } + } + return (rewardsAccrued, dataUpdated); + } + + /** + * @dev Iterates and accrues all the rewards for asset of the specific user + * @param asset The address of the reference asset of the distribution + * @param user The user address + * @param userBalance The current user asset balance + * @param totalSupply Total supply of the asset + **/ + function _updateData( + address asset, + address user, + uint256 userBalance, + uint256 totalSupply + ) internal { + uint256 assetUnit; + uint256 numAvailableRewards = _assets[asset].availableRewardsCount; + unchecked { + assetUnit = 10**_assets[asset].decimals; + } + + if (numAvailableRewards == 0) { + return; + } + unchecked { + for (uint128 r = 0; r < numAvailableRewards; r++) { + address reward = _assets[asset].availableRewards[r]; + RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; + + (uint256 newAssetIndex, bool rewardDataUpdated) = _updateRewardData( + rewardData, + totalSupply, + assetUnit + ); + + (uint256 rewardsAccrued, bool userDataUpdated) = _updateUserData( + rewardData, + user, + userBalance, + newAssetIndex, + assetUnit + ); + + if (rewardDataUpdated || userDataUpdated) { + emit Accrued(asset, reward, user, newAssetIndex, newAssetIndex, rewardsAccrued); + } + } + } + } + + /** + * @dev Accrues all the rewards of the assets specified in the userAssetBalances list + * @param user The address of the user + * @param userAssetBalances List of structs with the user balance and total supply of a set of assets + **/ + function _updateDataMultiple( + address user, + RewardsDataTypes.UserAssetBalance[] memory userAssetBalances + ) internal { + for (uint256 i = 0; i < userAssetBalances.length; i++) { + _updateData( + userAssetBalances[i].asset, + user, + userAssetBalances[i].userBalance, + userAssetBalances[i].totalSupply + ); + } + } + + /** + * @dev Return the accrued unclaimed amount of a reward from a user over a list of distribution + * @param user The address of the user + * @param reward The address of the reward token + * @param userAssetBalances List of structs with the user balance and total supply of a set of assets + * @return unclaimedRewards The accrued rewards for the user until the moment + **/ + function _getUserReward( + address user, + address reward, + RewardsDataTypes.UserAssetBalance[] memory userAssetBalances + ) internal view returns (uint256 unclaimedRewards) { + // Add unrealized rewards + for (uint256 i = 0; i < userAssetBalances.length; i++) { + if (userAssetBalances[i].userBalance == 0) { + continue; + } + unclaimedRewards += + _getPendingRewards(user, reward, userAssetBalances[i]) + + _assets[userAssetBalances[i].asset].rewards[reward].usersData[user].accrued; + } + + return unclaimedRewards; + } + + /** + * @dev Calculates the pending (not yet accrued) rewards since the last user action + * @param user The address of the user + * @param reward The address of the reward token + * @param userAssetBalance struct with the user balance and total supply of the incentivized asset + * @return The pending rewards for the user since the last user action + **/ + function _getPendingRewards( + address user, + address reward, + RewardsDataTypes.UserAssetBalance memory userAssetBalance + ) internal view returns (uint256) { + RewardsDataTypes.RewardData storage rewardData = _assets[userAssetBalance.asset].rewards[ + reward + ]; + uint256 assetUnit = 10**_assets[userAssetBalance.asset].decimals; + (, uint256 nextIndex) = _getAssetIndex(rewardData, userAssetBalance.totalSupply, assetUnit); + + return + _getRewards( + userAssetBalance.userBalance, + nextIndex, + rewardData.usersData[user].index, + assetUnit + ); + } + + /** + * @dev Internal function for the calculation of user's rewards on a distribution + * @param userBalance Balance of the user asset on a distribution + * @param reserveIndex Current index of the distribution + * @param userIndex Index stored for the user, representation his staking moment + * @param assetUnit One unit of asset (10**decimals) + * @return The rewards + **/ + function _getRewards( + uint256 userBalance, + uint256 reserveIndex, + uint256 userIndex, + uint256 assetUnit + ) internal pure returns (uint256) { + uint256 result = userBalance * (reserveIndex - userIndex); + assembly { + result := div(result, assetUnit) + } + return result; + } + + /** + * @dev Calculates the next value of an specific distribution index, with validations + * @param totalSupply of the asset being rewarded + * @param assetUnit One unit of asset (10**decimals) + * @return The new index. + **/ + function _getAssetIndex( + RewardsDataTypes.RewardData storage rewardData, + uint256 totalSupply, + uint256 assetUnit + ) internal view returns (uint256, uint256) { + uint256 oldIndex = rewardData.index; + uint256 distributionEnd = rewardData.distributionEnd; + uint256 emissionPerSecond = rewardData.emissionPerSecond; + uint256 lastUpdateTimestamp = rewardData.lastUpdateTimestamp; + + if ( + emissionPerSecond == 0 || + totalSupply == 0 || + lastUpdateTimestamp == block.timestamp || + lastUpdateTimestamp >= distributionEnd + ) { + return (oldIndex, oldIndex); + } + + uint256 currentTimestamp = block.timestamp > distributionEnd + ? distributionEnd + : block.timestamp; + uint256 timeDelta = currentTimestamp - lastUpdateTimestamp; + uint256 firstTerm = emissionPerSecond * timeDelta * assetUnit; + assembly { + firstTerm := div(firstTerm, totalSupply) + } + return (oldIndex, (firstTerm + oldIndex)); + } + + /** + * @dev Get user balances and total supply of all the assets specified by the assets parameter + * @param assets List of assets to retrieve user balance and total supply + * @param user Address of the user + * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets + */ + function _getUserAssetBalances(address[] calldata assets, address user) + internal + view + virtual + returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances); + + /// @inheritdoc IRewardsDistributor + function getAssetDecimals(address asset) external view returns (uint8) { + return _assets[asset].decimals; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IPullRewardsTransferStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IPullRewardsTransferStrategy.sol new file mode 100644 index 00000000..8b16e8db --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IPullRewardsTransferStrategy.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; + +/** + * @title IPullRewardsTransferStrategy + * @author Aave + **/ +interface IPullRewardsTransferStrategy is ITransferStrategyBase { + /** + * @return Address of the rewards vault + */ + function getRewardsVault() external view returns (address); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol new file mode 100644 index 00000000..706e3cd6 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol @@ -0,0 +1,205 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {IRewardsDistributor} from './IRewardsDistributor.sol'; +import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; +import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol'; +import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; + +/** + * @title IRewardsController + * @author Aave + * @notice Defines the basic interface for a Rewards Controller. + */ +interface IRewardsController is IRewardsDistributor { + /** + * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user + * @param user The address of the user + * @param claimer The address of the claimer + */ + event ClaimerSet(address indexed user, address indexed claimer); + + /** + * @dev Emitted when rewards are claimed + * @param user The address of the user rewards has been claimed on behalf of + * @param reward The address of the token reward is claimed + * @param to The address of the receiver of the rewards + * @param claimer The address of the claimer + * @param amount The amount of rewards claimed + */ + event RewardsClaimed( + address indexed user, + address indexed reward, + address indexed to, + address claimer, + uint256 amount + ); + + /** + * @dev Emitted when a transfer strategy is installed for the reward distribution + * @param reward The address of the token reward + * @param transferStrategy The address of TransferStrategy contract + */ + event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); + + /** + * @dev Emitted when the reward oracle is updated + * @param reward The address of the token reward + * @param rewardOracle The address of oracle + */ + event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Get the price aggregator oracle address + * @param reward The address of the reward + * @return The price oracle of the reward + */ + function getRewardOracle(address reward) external view returns (address); + + /** + * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) + * @param user The address of the user + * @return The claimer address + */ + function getClaimer(address user) external view returns (address); + + /** + * @dev Returns the Transfer Strategy implementation contract address being used for a reward address + * @param reward The address of the reward + * @return The address of the TransferStrategy contract + */ + function getTransferStrategy(address reward) external view returns (address); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Called by the corresponding asset on any update that affects the rewards distribution + * @param user The address of the user + * @param userBalance The user balance of the asset + * @param totalSupply The total supply of the asset + **/ + function handleAction( + address user, + uint256 userBalance, + uint256 totalSupply + ) external; + + /** + * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The + * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external returns (uint256); + + /** + * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" + **/ + function claimAllRewards(address[] calldata assets, address to) + external + returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must + * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsToSelf(address[] calldata assets) + external + returns (address[] memory rewardsList, uint256[] memory claimedAmounts); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol new file mode 100644 index 00000000..fa65351f --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +/** + * @title IRewardsDistributor + * @author Aave + * @notice Defines the basic interface for a Rewards Distributor. + */ +interface IRewardsDistributor { + /** + * @dev Emitted when the configuration of the rewards of an asset is updated. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param oldEmission The old emissions per second value of the reward distribution + * @param newEmission The new emissions per second value of the reward distribution + * @param oldDistributionEnd The old end timestamp of the reward distribution + * @param newDistributionEnd The new end timestamp of the reward distribution + * @param assetIndex The index of the asset distribution + */ + event AssetConfigUpdated( + address indexed asset, + address indexed reward, + uint256 oldEmission, + uint256 newEmission, + uint256 oldDistributionEnd, + uint256 newDistributionEnd, + uint256 assetIndex + ); + + /** + * @dev Emitted when rewards of an asset are accrued on behalf of a user. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param user The address of the user that rewards are accrued on behalf of + * @param assetIndex The index of the asset distribution + * @param userIndex The index of the asset distribution on behalf of the user + * @param rewardsAccrued The amount of rewards accrued + */ + event Accrued( + address indexed asset, + address indexed reward, + address indexed user, + uint256 assetIndex, + uint256 userIndex, + uint256 rewardsAccrued + ); + + /** + * @dev Sets the end date for the distribution + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd( + address asset, + address reward, + uint32 newDistributionEnd + ) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Gets the end date for the distribution + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The timestamp with the end of the distribution, in unix time format + **/ + function getDistributionEnd(address asset, address reward) external view returns (uint256); + + /** + * @dev Returns the index of a user on a reward distribution + * @param user Address of the user + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The current user asset index, not including new distributions + **/ + function getUserAssetIndex( + address user, + address asset, + address reward + ) external view returns (uint256); + + /** + * @dev Returns the configuration of the distribution reward for a certain asset + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The index of the asset distribution + * @return The emission per second of the reward distribution + * @return The timestamp of the last update of the index + * @return The timestamp of the distribution end + **/ + function getRewardsData(address asset, address reward) + external + view + returns ( + uint256, + uint256, + uint256, + uint256 + ); + + /** + * @dev Returns the list of available reward token addresses of an incentivized asset + * @param asset The incentivized asset + * @return List of rewards addresses of the input asset + **/ + function getRewardsByAsset(address asset) external view returns (address[] memory); + + /** + * @dev Returns the list of available reward addresses + * @return List of rewards supported in this contract + **/ + function getRewardsList() external view returns (address[] memory); + + /** + * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. + * @param user The address of the user + * @param reward The address of the reward token + * @return Unclaimed rewards, not including new distributions + **/ + function getUserAccruedRewards(address user, address reward) external view returns (uint256); + + /** + * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @param reward The address of the reward token + * @return The rewards amount + **/ + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view returns (uint256); + + /** + * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @return The list of reward addresses + * @return The list of unclaimed amount of rewards + **/ + function getAllUserRewards(address[] calldata assets, address user) + external + view + returns (address[] memory, uint256[] memory); + + /** + * @dev Returns the decimals of an asset to calculate the distribution delta + * @param asset The address to retrieve decimals + * @return The decimals of an underlying asset + */ + function getAssetDecimals(address asset) external view returns (uint8); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IStakedToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IStakedToken.sol new file mode 100644 index 00000000..dd0f206d --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IStakedToken.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +interface IStakedToken { + function STAKED_TOKEN() external view returns (address); + + function stake(address to, uint256 amount) external; + + function redeem(address to, uint256 amount) external; + + function cooldown() external; + + function claimRewards(address to, uint256 amount) external; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IStakedTokenTransferStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IStakedTokenTransferStrategy.sol new file mode 100644 index 00000000..9fe64a5d --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IStakedTokenTransferStrategy.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {IStakedToken} from '../interfaces/IStakedToken.sol'; +import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; + +/** + * @title IStakedTokenTransferStrategy + * @author Aave + **/ +interface IStakedTokenTransferStrategy is ITransferStrategyBase { + /** + * @dev Perform a MAX_UINT approval of AAVE to the Staked Aave contract. + */ + function renewApproval() external; + + /** + * @dev Drop approval of AAVE to the Staked Aave contract in case of emergency. + */ + function dropApproval() external; + + /** + * @return Staked Token contract address + */ + function getStakeContract() external view returns (address); + + /** + * @return Underlying token address from the stake contract + */ + function getUnderlyingToken() external view returns (address); +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol new file mode 100644 index 00000000..46d67b08 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +interface ITransferStrategyBase { + event EmergencyWithdrawal( + address indexed caller, + address indexed token, + address indexed to, + uint256 amount + ); + + /** + * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation + * @param to Account to transfer rewards + * @param reward Address of the reward token + * @param amount Amount to transfer to the "to" address parameter + * @return Returns true bool if transfer logic succeeds + */ + function performTransfer( + address to, + address reward, + uint256 amount + ) external returns (bool); + + /** + * @return Returns the address of the Incentives Controller + */ + function getIncentivesController() external view returns (address); + + /** + * @return Returns the address of the Rewards admin + */ + function getRewardsAdmin() external view returns (address); + + /** + * @dev Perform an emergency token withdrawal only callable by the Rewards admin + * @param token Address of the token to withdraw funds from this contract + * @param to Address of the recipient of the withdrawal + * @param amount Amount of the withdrawal + */ + function emergencyWithdrawal( + address token, + address to, + uint256 amount + ) external; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol new file mode 100644 index 00000000..e8e631c1 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; +import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol'; + +library RewardsDataTypes { + struct RewardsConfigInput { + uint88 emissionPerSecond; + uint256 totalSupply; + uint32 distributionEnd; + address asset; + address reward; + ITransferStrategyBase transferStrategy; + IEACAggregatorProxy rewardOracle; + } + + struct UserAssetBalance { + address asset; + uint256 userBalance; + uint256 totalSupply; + } + + struct UserData { + uint104 index; // matches reward index + uint128 accrued; + } + + struct RewardData { + uint104 index; + uint88 emissionPerSecond; + uint32 lastUpdateTimestamp; + uint32 distributionEnd; + mapping(address => UserData) usersData; + } + + struct AssetData { + mapping(address => RewardData) rewards; + mapping(uint128 => address) availableRewards; + uint128 availableRewardsCount; + uint8 decimals; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol new file mode 100644 index 00000000..450eb5c9 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IPullRewardsTransferStrategy} from '../interfaces/IPullRewardsTransferStrategy.sol'; +import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; +import {TransferStrategyBase} from './TransferStrategyBase.sol'; +import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; + +/** + * @title PullRewardsTransferStrategy + * @notice Transfer strategy that pulls ERC20 rewards from an external account to the user address. + * The external account could be a smart contract or EOA that must approve to the PullRewardsTransferStrategy contract address. + * @author Aave + **/ +contract PullRewardsTransferStrategy is TransferStrategyBase, IPullRewardsTransferStrategy { + using GPv2SafeERC20 for IERC20; + + address internal immutable REWARDS_VAULT; + + constructor( + address incentivesController, + address rewardsAdmin, + address rewardsVault + ) TransferStrategyBase(incentivesController, rewardsAdmin) { + REWARDS_VAULT = rewardsVault; + } + + /// @inheritdoc TransferStrategyBase + function performTransfer( + address to, + address reward, + uint256 amount + ) + external + override(TransferStrategyBase, ITransferStrategyBase) + onlyIncentivesController + returns (bool) + { + IERC20(reward).safeTransferFrom(REWARDS_VAULT, to, amount); + + return true; + } + + /// @inheritdoc IPullRewardsTransferStrategy + function getRewardsVault() external view returns (address) { + return REWARDS_VAULT; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol new file mode 100644 index 00000000..ba88c9d6 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IStakedToken} from '../interfaces/IStakedToken.sol'; +import {IStakedTokenTransferStrategy} from '../interfaces/IStakedTokenTransferStrategy.sol'; +import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; +import {TransferStrategyBase} from './TransferStrategyBase.sol'; +import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; + +/** + * @title StakedTokenTransferStrategy + * @notice Transfer strategy that stakes the rewards into a staking contract and transfers the staking contract token. + * The underlying token must be transferred to this contract to be able to stake it on demand. + * @author Aave + **/ +contract StakedTokenTransferStrategy is TransferStrategyBase, IStakedTokenTransferStrategy { + using GPv2SafeERC20 for IERC20; + + IStakedToken internal immutable STAKE_CONTRACT; + address internal immutable UNDERLYING_TOKEN; + + constructor( + address incentivesController, + address rewardsAdmin, + IStakedToken stakeToken + ) TransferStrategyBase(incentivesController, rewardsAdmin) { + STAKE_CONTRACT = stakeToken; + UNDERLYING_TOKEN = STAKE_CONTRACT.STAKED_TOKEN(); + + IERC20(UNDERLYING_TOKEN).approve(address(STAKE_CONTRACT), 0); + IERC20(UNDERLYING_TOKEN).approve(address(STAKE_CONTRACT), type(uint256).max); + } + + /// @inheritdoc TransferStrategyBase + function performTransfer( + address to, + address reward, + uint256 amount + ) + external + override(TransferStrategyBase, ITransferStrategyBase) + onlyIncentivesController + returns (bool) + { + require(reward == address(STAKE_CONTRACT), 'REWARD_TOKEN_NOT_STAKE_CONTRACT'); + + STAKE_CONTRACT.stake(to, amount); + + return true; + } + + /// @inheritdoc IStakedTokenTransferStrategy + function renewApproval() external onlyRewardsAdmin { + IERC20(UNDERLYING_TOKEN).approve(address(STAKE_CONTRACT), 0); + IERC20(UNDERLYING_TOKEN).approve(address(STAKE_CONTRACT), type(uint256).max); + } + + /// @inheritdoc IStakedTokenTransferStrategy + function dropApproval() external onlyRewardsAdmin { + IERC20(UNDERLYING_TOKEN).approve(address(STAKE_CONTRACT), 0); + } + + /// @inheritdoc IStakedTokenTransferStrategy + function getStakeContract() external view returns (address) { + return address(STAKE_CONTRACT); + } + + /// @inheritdoc IStakedTokenTransferStrategy + function getUnderlyingToken() external view returns (address) { + return UNDERLYING_TOKEN; + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/TransferStrategyBase.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/TransferStrategyBase.sol new file mode 100644 index 00000000..582ead1b --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/TransferStrategyBase.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; +import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; + +/** + * @title TransferStrategyStorage + * @author Aave + **/ +abstract contract TransferStrategyBase is ITransferStrategyBase { + using GPv2SafeERC20 for IERC20; + + address internal immutable INCENTIVES_CONTROLLER; + address internal immutable REWARDS_ADMIN; + + constructor(address incentivesController, address rewardsAdmin) { + INCENTIVES_CONTROLLER = incentivesController; + REWARDS_ADMIN = rewardsAdmin; + } + + /** + * @dev Modifier for incentives controller only functions + */ + modifier onlyIncentivesController() { + require(INCENTIVES_CONTROLLER == msg.sender, 'CALLER_NOT_INCENTIVES_CONTROLLER'); + _; + } + + /** + * @dev Modifier for reward admin only functions + */ + modifier onlyRewardsAdmin() { + require(msg.sender == REWARDS_ADMIN, 'ONLY_REWARDS_ADMIN'); + _; + } + + /// @inheritdoc ITransferStrategyBase + function getIncentivesController() external view override returns (address) { + return INCENTIVES_CONTROLLER; + } + + /// @inheritdoc ITransferStrategyBase + function getRewardsAdmin() external view override returns (address) { + return REWARDS_ADMIN; + } + + /// @inheritdoc ITransferStrategyBase + function performTransfer( + address to, + address reward, + uint256 amount + ) external virtual returns (bool); + + /// @inheritdoc ITransferStrategyBase + function emergencyWithdrawal( + address token, + address to, + uint256 amount + ) external onlyRewardsAdmin { + IERC20(token).safeTransfer(to, amount); + + emit EmergencyWithdrawal(msg.sender, token, to, amount); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/Collector.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/Collector.sol new file mode 100644 index 00000000..59f3c466 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/Collector.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; +import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; +import {ICollector} from './interfaces/ICollector.sol'; + +/** + * @title Collector + * @notice Stores the fees collected by the protocol and allows the fund administrator + * to approve or transfer the collected ERC20 tokens. + * @dev Implementation contract that must be initialized using transparent proxy pattern. + * @author Aave + **/ +contract Collector is VersionedInitializable, ICollector { + // Store the current funds administrator address + address internal _fundsAdmin; + + // Revision version of this implementation contract + uint256 public constant REVISION = 1; + + /** + * @dev Allow only the funds administrator address to call functions marked by this modifier + */ + modifier onlyFundsAdmin() { + require(msg.sender == _fundsAdmin, 'ONLY_BY_FUNDS_ADMIN'); + _; + } + + /** + * @dev Initialize the transparent proxy with the admin of the Collector + * @param reserveController The address of the admin that controls Collector + */ + function initialize(address reserveController) external initializer { + _setFundsAdmin(reserveController); + } + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure override returns (uint256) { + return REVISION; + } + + /// @inheritdoc ICollector + function getFundsAdmin() external view returns (address) { + return _fundsAdmin; + } + + /// @inheritdoc ICollector + function approve( + IERC20 token, + address recipient, + uint256 amount + ) external onlyFundsAdmin { + token.approve(recipient, amount); + } + + /// @inheritdoc ICollector + function transfer( + IERC20 token, + address recipient, + uint256 amount + ) external onlyFundsAdmin { + token.transfer(recipient, amount); + } + + /// @inheritdoc ICollector + function setFundsAdmin(address admin) external onlyFundsAdmin { + _setFundsAdmin(admin); + } + + /** + * @dev Transfer the ownership of the funds administrator role. + * @param admin The address of the new funds administrator + */ + function _setFundsAdmin(address admin) internal { + _fundsAdmin = admin; + emit NewFundsAdmin(admin); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/CollectorController.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/CollectorController.sol new file mode 100644 index 00000000..db51e65f --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/CollectorController.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {Ownable} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol'; +import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; +import {ICollector} from './interfaces/ICollector.sol'; + +/** + * @title CollectorController + * @notice The CollectorController contracts allows the owner of the contract + to approve or transfer tokens from the collector proxy contract. + The admin of the Collector proxy can't be the same as the fundsAdmin address. + This is needed due the usage of transparent proxy pattern. + * @author Aave + **/ +contract CollectorController is Ownable { + ICollector public immutable COLLECTOR; + + /** + * @dev Constructor setups the ownership of the contract and the collector proxy + * @param owner The address of the owner of the CollectorController + * @param collectorProxy The address of the Collector transparent proxy + */ + constructor(address owner, address collectorProxy) { + transferOwnership(owner); + COLLECTOR = ICollector(collectorProxy); + } + + /** + * @dev Transfer an amount of tokens to the recipient. + * @param token The address of the asset + * @param recipient The address of the entity to transfer the tokens. + * @param amount The amount to be transferred. + */ + function approve( + IERC20 token, + address recipient, + uint256 amount + ) external onlyOwner { + COLLECTOR.approve(token, recipient, amount); + } + + /** + * @dev Transfer an amount of tokens to the recipient. + * @param token The address of the asset + * @param recipient The address of the entity to transfer the tokens. + * @param amount The amount to be transferred. + */ + function transfer( + IERC20 token, + address recipient, + uint256 amount + ) external onlyOwner { + COLLECTOR.transfer(token, recipient, amount); + } +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/interfaces/ICollector.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/interfaces/ICollector.sol new file mode 100644 index 00000000..707d0a53 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/interfaces/ICollector.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; + +/** + * @title ICollector + * @notice Defines the interface of the Collector contract + * @author Aave + **/ +interface ICollector { + /** + * @dev Emitted during the transfer of ownership of the funds administrator address + * @param fundsAdmin The new funds administrator address + **/ + event NewFundsAdmin(address indexed fundsAdmin); + + /** + * @dev Retrieve the current implementation Revision of the proxy + * @return The revision version + */ + function REVISION() external view returns (uint256); + + /** + * @dev Retrieve the current funds administrator + * @return The address of the funds administrator + */ + function getFundsAdmin() external view returns (address); + + /** + * @dev Approve an amount of tokens to be pulled by the recipient. + * @param token The address of the asset + * @param recipient The address of the entity allowed to pull tokens + * @param amount The amount allowed to be pulled. If zero it will revoke the approval. + */ + function approve( + IERC20 token, + address recipient, + uint256 amount + ) external; + + /** + * @dev Transfer an amount of tokens to the recipient. + * @param token The address of the asset + * @param recipient The address of the entity to transfer the tokens. + * @param amount The amount to be transferred. + */ + function transfer( + IERC20 token, + address recipient, + uint256 amount + ) external; + + /** + * @dev Transfer the ownership of the funds administrator role. + This function should only be callable by the current funds administrator. + * @param admin The address of the new funds administrator + */ + function setFundsAdmin(address admin) external; +} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..66bdc69a --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..5f8c6582 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol new file mode 100644 index 00000000..ddd9f83e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/AaveOracle.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/AaveOracle.sol new file mode 100644 index 00000000..177cd126 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/AaveOracle.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/misc/AaveOracle.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol new file mode 100644 index 00000000..a1f72ef6 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/L2Encoder.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/L2Encoder.sol new file mode 100644 index 00000000..bc4fe15a --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/L2Encoder.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/misc/L2Encoder.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol new file mode 100644 index 00000000..ba513e32 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol new file mode 100644 index 00000000..058ab081 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol new file mode 100644 index 00000000..9750167e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockPool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockPool.sol new file mode 100644 index 00000000..437917f6 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockPool.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/mocks/helpers/MockPool.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol new file mode 100644 index 00000000..2fb0553b --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol new file mode 100644 index 00000000..aaffee5b --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol new file mode 100644 index 00000000..152e59c1 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol new file mode 100644 index 00000000..e4718003 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol new file mode 100644 index 00000000..8be624c0 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol new file mode 100644 index 00000000..3588eaf1 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol new file mode 100644 index 00000000..c15884fa --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol new file mode 100644 index 00000000..f6b64f8e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/configuration/ACLManager.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol new file mode 100644 index 00000000..50225ae8 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol new file mode 100644 index 00000000..acb07482 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..a0a997a0 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol new file mode 100644 index 00000000..f77f2392 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol new file mode 100644 index 00000000..ab8d93e2 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol new file mode 100644 index 00000000..2dfa2af3 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..cbcac836 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol new file mode 100644 index 00000000..83a73129 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..76464c8a --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..e608396b --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol new file mode 100644 index 00000000..a8b5e592 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..6c8c2f47 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol new file mode 100644 index 00000000..51ab4286 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/L2Pool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/L2Pool.sol new file mode 100644 index 00000000..bc2abade --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/L2Pool.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/pool/L2Pool.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/Pool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/Pool.sol new file mode 100644 index 00000000..67c31934 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/Pool.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/pool/Pool.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol new file mode 100644 index 00000000..6cd01268 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/AToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/AToken.sol new file mode 100644 index 00000000..1760f9da --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/AToken.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/tokenization/AToken.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol new file mode 100644 index 00000000..4728596f --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol new file mode 100644 index 00000000..16b55c63 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol new file mode 100644 index 00000000..9e05a81e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol new file mode 100644 index 00000000..085b9efc --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol new file mode 100644 index 00000000..5c49fe03 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol new file mode 100644 index 00000000..aeaadf94 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol new file mode 100644 index 00000000..444eab8f --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/WETHGateway.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/WETHGateway.sol new file mode 100644 index 00000000..889998f0 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/WETHGateway.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/periphery-v3/contracts/misc/WETHGateway.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol new file mode 100644 index 00000000..03772875 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/RewardsController.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/RewardsController.sol new file mode 100644 index 00000000..8f995c64 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/RewardsController.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/periphery-v3/contracts/rewards/RewardsController.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol new file mode 100644 index 00000000..0cdea44b --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol new file mode 100644 index 00000000..fe00c11d --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/treasury/Collector.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/treasury/Collector.sol new file mode 100644 index 00000000..6bd85f12 --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/treasury/Collector.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/periphery-v3/contracts/treasury/Collector.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/treasury/CollectorController.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/treasury/CollectorController.sol new file mode 100644 index 00000000..0c24fa5e --- /dev/null +++ b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/treasury/CollectorController.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import '@aave/periphery-v3/contracts/treasury/CollectorController.sol'; diff --git a/downloads/ARBITRUM/L2_POOL_IMPL.sol b/downloads/ARBITRUM/L2_POOL_IMPL.sol new file mode 100644 index 00000000..50a2a4d3 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL.sol @@ -0,0 +1,8682 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IL2Pool.sol + +/** + * @title IL2Pool + * @author Aave + * @notice Defines the basic extension interface for an L2 Aave Pool. + */ +interface IL2Pool { + /** + * @notice Calldata efficient wrapper of the supply function on behalf of the caller + * @param args Arguments for the supply function packed in one bytes32 + * 96 bits 16 bits 128 bits 16 bits + * | 0-padding | referralCode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + */ + function supply(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the supplyWithPermit function on behalf of the caller + * @param args Arguments for the supply function packed in one bytes32 + * 56 bits 8 bits 32 bits 16 bits 128 bits 16 bits + * | 0-padding | permitV | shortenedDeadline | referralCode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @param r The R parameter of ERC712 permit sig + * @param s The S parameter of ERC712 permit sig + */ + function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s) external; + + /** + * @notice Calldata efficient wrapper of the withdraw function, withdrawing to the caller + * @param args Arguments for the withdraw function packed in one bytes32 + * 112 bits 128 bits 16 bits + * | 0-padding | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @return The final amount withdrawn + */ + function withdraw(bytes32 args) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the borrow function, borrowing on behalf of the caller + * @param args Arguments for the borrow function packed in one bytes32 + * 88 bits 16 bits 8 bits 128 bits 16 bits + * | 0-padding | referralCode | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + */ + function borrow(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the repay function, repaying on behalf of the caller + * @param args Arguments for the repay function packed in one bytes32 + * 104 bits 8 bits 128 bits 16 bits + * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @return The final amount repaid + */ + function repay(bytes32 args) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the repayWithPermit function, repaying on behalf of the caller + * @param args Arguments for the repayWithPermit function packed in one bytes32 + * 64 bits 8 bits 32 bits 8 bits 128 bits 16 bits + * | 0-padding | permitV | shortenedDeadline | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @param r The R parameter of ERC712 permit sig + * @param s The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the repayWithATokens function + * @param args Arguments for the repayWithATokens function packed in one bytes32 + * 104 bits 8 bits 128 bits 16 bits + * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @return The final amount repaid + */ + function repayWithATokens(bytes32 args) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the setUserUseReserveAsCollateral function + * @param args Arguments for the setUserUseReserveAsCollateral function packed in one bytes32 + * 239 bits 1 bit 16 bits + * | 0-padding | useAsCollateral | assetId | + * @dev assetId is the index of the asset in the reservesList. + */ + function setUserUseReserveAsCollateral(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the liquidationCall function + * @param args1 part of the arguments for the liquidationCall function packed in one bytes32 + * 64 bits 160 bits 16 bits 16 bits + * | 0-padding | user address | debtAssetId | collateralAssetId | + * @param args2 part of the arguments for the liquidationCall function packed in one bytes32 + * 127 bits 1 bit 128 bits + * | 0-padding | receiveAToken | shortenedDebtToCover | + * @dev the shortenedDebtToCover is cast to 256 bits at decode time, + * if type(uint128).max the value will be expanded to type(uint256).max + */ + function liquidationCall(bytes32 args1, bytes32 args2) external; +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/CalldataLogic.sol + +/** + * @title CalldataLogic library + * @author Aave + * @notice Library to decode calldata, used to optimize calldata size in L2Pool for transaction cost reduction + */ +library CalldataLogic { + /** + * @notice Decodes compressed supply params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed supply params + * @return The address of the underlying reserve + * @return The amount to supply + * @return The referralCode + */ + function decodeSupplyParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint16) { + uint16 assetId; + uint256 amount; + uint16 referralCode; + + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + referralCode := and(shr(144, args), 0xFFFF) + } + return (reservesList[assetId], amount, referralCode); + } + + /** + * @notice Decodes compressed supply params to standard params along with permit params + * @param reservesList The addresses of all the active reserves + * @param args The packed supply with permit params + * @return The address of the underlying reserve + * @return The amount to supply + * @return The referralCode + * @return The deadline of the permit + * @return The V value of the permit signature + */ + function decodeSupplyWithPermitParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint16, uint256, uint8) { + uint256 deadline; + uint8 permitV; + + assembly { + deadline := and(shr(160, args), 0xFFFFFFFF) + permitV := and(shr(192, args), 0xFF) + } + (address asset, uint256 amount, uint16 referralCode) = decodeSupplyParams(reservesList, args); + + return (asset, amount, referralCode, deadline, permitV); + } + + /** + * @notice Decodes compressed withdraw params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed withdraw params + * @return The address of the underlying reserve + * @return The amount to withdraw + */ + function decodeWithdrawParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256) { + uint16 assetId; + uint256 amount; + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + } + if (amount == type(uint128).max) { + amount = type(uint256).max; + } + return (reservesList[assetId], amount); + } + + /** + * @notice Decodes compressed borrow params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed borrow params + * @return The address of the underlying reserve + * @return The amount to borrow + * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) + * @return The referralCode + */ + function decodeBorrowParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint256, uint16) { + uint16 assetId; + uint256 amount; + uint256 interestRateMode; + uint16 referralCode; + + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + interestRateMode := and(shr(144, args), 0xFF) + referralCode := and(shr(152, args), 0xFFFF) + } + + return (reservesList[assetId], amount, interestRateMode, referralCode); + } + + /** + * @notice Decodes compressed repay params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed repay params + * @return The address of the underlying reserve + * @return The amount to repay + * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) + */ + function decodeRepayParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint256) { + uint16 assetId; + uint256 amount; + uint256 interestRateMode; + + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + interestRateMode := and(shr(144, args), 0xFF) + } + + if (amount == type(uint128).max) { + amount = type(uint256).max; + } + + return (reservesList[assetId], amount, interestRateMode); + } + + /** + * @notice Decodes compressed repay params to standard params along with permit params + * @param reservesList The addresses of all the active reserves + * @param args The packed repay with permit params + * @return The address of the underlying reserve + * @return The amount to repay + * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) + * @return The deadline of the permit + * @return The V value of the permit signature + */ + function decodeRepayWithPermitParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint256, uint256, uint8) { + uint256 deadline; + uint8 permitV; + + (address asset, uint256 amount, uint256 interestRateMode) = decodeRepayParams( + reservesList, + args + ); + + assembly { + deadline := and(shr(152, args), 0xFFFFFFFF) + permitV := and(shr(184, args), 0xFF) + } + + return (asset, amount, interestRateMode, deadline, permitV); + } + + /** + * @notice Decodes compressed set user use reserve as collateral params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed set user use reserve as collateral params + * @return The address of the underlying reserve + * @return True if to set using as collateral, false otherwise + */ + function decodeSetUserUseReserveAsCollateralParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, bool) { + uint16 assetId; + bool useAsCollateral; + assembly { + assetId := and(args, 0xFFFF) + useAsCollateral := and(shr(16, args), 0x1) + } + return (reservesList[assetId], useAsCollateral); + } + + /** + * @notice Decodes compressed liquidation call params to standard params + * @param reservesList The addresses of all the active reserves + * @param args1 The first half of packed liquidation call params + * @param args2 The second half of the packed liquidation call params + * @return The address of the underlying collateral asset + * @return The address of the underlying debt asset + * @return The address of the user to liquidate + * @return The amount of debt to cover + * @return True if receiving aTokens, false otherwise + */ + function decodeLiquidationCallParams( + mapping(uint256 => address) storage reservesList, + bytes32 args1, + bytes32 args2 + ) internal view returns (address, address, address, uint256, bool) { + uint16 collateralAssetId; + uint16 debtAssetId; + address user; + uint256 debtToCover; + bool receiveAToken; + + assembly { + collateralAssetId := and(args1, 0xFFFF) + debtAssetId := and(shr(16, args1), 0xFFFF) + user := and(shr(32, args1), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + + debtToCover := and(args2, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + receiveAToken := and(shr(128, args2), 0x1) + } + + if (debtToCover == type(uint128).max) { + debtToCover = type(uint256).max; + } + + return ( + reservesList[collateralAssetId], + reservesList[debtAssetId], + user, + debtToCover, + receiveAToken + ); + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IERC20WithPermit.sol + +/** + * @title IERC20WithPermit + * @author Aave + * @notice Interface for the permit function (EIP-2612) + */ +interface IERC20WithPermit is IERC20 { + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleSentinel.sol + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/MathUtils.sol + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol + +/** + * @title IFlashLoanReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + */ +interface IFlashLoanReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed assets + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param assets The addresses of the flash-borrowed assets + * @param amounts The amounts of the flash-borrowed assets + * @param premiums The fee of each flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata premiums, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol + +/** + * @title IFlashLoanSimpleReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + */ +interface IFlashLoanSimpleReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed asset + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param asset The address of the flash-borrowed asset + * @param amount The amount of the flash-borrowed asset + * @param premium The fee of the flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address asset, + uint256 amount, + uint256 premium, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ReserveLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/PoolStorage.sol + +/** + * @title PoolStorage + * @author Aave + * @notice Contract used as storage of the Pool contract. + * @dev It defines the storage layout of the Pool contract. + */ +contract PoolStorage { + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + // Map of reserves and their data (underlyingAssetOfReserve => reserveData) + mapping(address => DataTypes.ReserveData) internal _reserves; + + // Map of users address and their configuration data (userAddress => userConfiguration) + mapping(address => DataTypes.UserConfigurationMap) internal _usersConfig; + + // List of reserves as a map (reserveId => reserve). + // It is structured as a mapping for gas savings reasons, using the reserve id as index + mapping(uint256 => address) internal _reservesList; + + // List of eMode categories as a map (eModeCategoryId => eModeCategory). + // It is structured as a mapping for gas savings reasons, using the eModeCategoryId as index + mapping(uint8 => DataTypes.EModeCategory) internal _eModeCategories; + + // Map of users address and their eMode category (userAddress => eModeCategoryId) + mapping(address => uint8) internal _usersEModeCategory; + + // Fee of the protocol bridge, expressed in bps + uint256 internal _bridgeProtocolFee; + + // Total FlashLoan Premium, expressed in bps + uint128 internal _flashLoanPremiumTotal; + + // FlashLoan premium paid to protocol treasury, expressed in bps + uint128 internal _flashLoanPremiumToProtocol; + + // DEPRECATED on v3.2.0 + uint64 internal __DEPRECATED_maxStableRateBorrowSizePercent; + + // Maximum number of active reserves there have been in the protocol. It is the upper bound of the reserves list + uint16 internal _reservesCount; +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/EModeLogic.sol + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/GenericLogic.sol + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ValidationLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BridgeLogic.sol + +library BridgeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. + * @dev Essentially a supply without transferring the underlying. + * @dev Emits the `MintUnbacked` event + * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param asset The address of the underlying asset to mint aTokens of + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function executeMintUnbacked( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, reserve, amount, onBehalfOf); + + uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); + uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); + + uint256 unbacked = reserve.unbacked += amount.toUint128(); + + require( + unbacked <= unbackedMintCap * (10 ** reserveDecimals), + Errors.UNBACKED_MINT_CAP_EXCEEDED + ); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, 0, 0); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + onBehalfOf, + amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration, + reserveCache.aTokenAddress + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); + } + } + + emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); + } + + /** + * @notice Back the current unbacked with `amount` and pay `fee`. + * @dev It is not possible to back more than the existing unbacked amount of the reserve + * @dev Emits the `BackUnbacked` event + * @param reserve The reserve to back unbacked for + * @param asset The address of the underlying asset to repay + * @param amount The amount to back + * @param fee The amount paid in fees + * @param protocolFeeBps The fraction of fees in basis points paid to the protocol + * @return The backed amount + */ + function executeBackUnbacked( + DataTypes.ReserveData storage reserve, + address asset, + uint256 amount, + uint256 fee, + uint256 protocolFeeBps + ) external returns (uint256) { + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; + + uint256 feeToProtocol = fee.percentMul(protocolFeeBps); + uint256 feeToLP = fee - feeToProtocol; + uint256 added = backingAmount + fee; + + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply() + + uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), + feeToLP + ); + + reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + + reserve.unbacked -= backingAmount.toUint128(); + reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, added, 0); + + IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); + + emit BackUnbacked(asset, msg.sender, backingAmount, fee); + + return backingAmount; + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/PoolLogic.sol + +/** + * @title PoolLogic library + * @author Aave + * @notice Implements the logic for Pool specific functions + */ +library PoolLogic { + using GPv2SafeERC20 for IERC20; + using WadRayMath for uint256; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice Initialize an asset reserve and add the reserve to the list of reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param params Additional parameters needed for initiation + * @return true if appended, false if inserted at existing empty spot + */ + function executeInitReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.InitReserveParams memory params + ) external returns (bool) { + require(Address.isContract(params.asset), Errors.NOT_CONTRACT); + reservesData[params.asset].init( + params.aTokenAddress, + params.variableDebtAddress, + params.interestRateStrategyAddress + ); + + bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || + reservesList[0] == params.asset; + require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); + + for (uint16 i = 0; i < params.reservesCount; i++) { + if (reservesList[i] == address(0)) { + reservesData[params.asset].id = i; + reservesList[i] = params.asset; + return false; + } + } + + require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); + reservesData[params.asset].id = params.reservesCount; + reservesList[params.reservesCount] = params.asset; + return true; + } + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function executeRescueTokens(address token, address to, uint256 amount) external { + IERC20(token).safeTransfer(to, amount); + } + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param reservesData The state of all the reserves + * @param assets The list of reserves for which the minting needs to be executed + */ + function executeMintToTreasury( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] calldata assets + ) external { + for (uint256 i = 0; i < assets.length; i++) { + address assetAddress = assets[i]; + + DataTypes.ReserveData storage reserve = reservesData[assetAddress]; + + // this cover both inactive reserves and invalid reserves since the flag will be 0 for both + if (!reserve.configuration.getActive()) { + continue; + } + + uint256 accruedToTreasury = reserve.accruedToTreasury; + + if (accruedToTreasury != 0) { + reserve.accruedToTreasury = 0; + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); + IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); + + emit MintedToTreasury(assetAddress, amountToMint); + } + } + } + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function executeResetIsolationModeTotalDebt( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset + ) external { + require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); + reservesData[asset].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(asset, 0); + } + + /** + * @notice Sets the liquidation grace period of the asset + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + */ + function executeSetLiquidationGracePeriod( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset, + uint40 until + ) external { + reservesData[asset].liquidationGracePeriodUntil = until; + } + + /** + * @notice Drop a reserve + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param asset The address of the underlying asset of the reserve + */ + function executeDropReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + address asset + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + ValidationLogic.validateDropReserve(reservesList, reserve, asset); + reservesList[reservesData[asset].id] = address(0); + delete reservesData[asset]; + } + + /** + * @notice Returns the user account data across all the reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the calculation + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function executeGetUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ) + { + ( + totalCollateralBase, + totalDebtBase, + ltv, + currentLiquidationThreshold, + healthFactor, + + ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); + + availableBorrowsBase = GenericLogic.calculateAvailableBorrows( + totalCollateralBase, + totalDebtBase, + ltv + ); + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/SupplyLogic.sol + +/** + * @title SupplyLogic library + * @author Aave + * @notice Implements the base logic for supply/withdraw + */ +library SupplyLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. + * @dev Emits the `Supply()` event. + * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as + * collateral. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the supply function + */ + function executeSupply( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSupplyParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, reserve, params.amount, params.onBehalfOf); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, params.amount, 0); + + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + params.onBehalfOf, + params.amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration, + reserveCache.aTokenAddress + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); + } + } + + emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); + } + + /** + * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset + * previously supplied in the Aave protocol. + * @dev Emits the `Withdraw()` event. + * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the withdraw function + * @return The actual amount withdrawn + */ + function executeWithdraw( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteWithdrawParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + require(params.to != reserveCache.aTokenAddress, Errors.WITHDRAW_TO_ATOKEN); + + reserve.updateState(reserveCache); + + uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( + reserveCache.nextLiquidityIndex + ); + + uint256 amountToWithdraw = params.amount; + + if (params.amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + + ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, amountToWithdraw); + + bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); + + if (isCollateral && amountToWithdraw == userBalance) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + params.to, + amountToWithdraw, + reserveCache.nextLiquidityIndex + ); + + if (isCollateral && userConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + params.asset, + msg.sender, + params.reservesCount, + params.oracle, + params.userEModeCategory + ); + } + + emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); + + return amountToWithdraw; + } + + /** + * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid + * collateralization constraints violation. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as + * collateral. + * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param params The additional parameters needed to execute the finalizeTransfer function + */ + function executeFinalizeTransfer( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.FinalizeTransferParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + + ValidationLogic.validateTransfer(reserve); + + uint256 reserveId = reserve.id; + uint256 scaledAmount = params.amount.rayDiv(reserve.getNormalizedIncome()); + + if (params.from != params.to && scaledAmount != 0) { + DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; + + if (fromConfig.isUsingAsCollateral(reserveId)) { + if (fromConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + usersConfig[params.from], + params.asset, + params.from, + params.reservesCount, + params.oracle, + params.fromEModeCategory + ); + } + if (params.balanceFromBefore == params.amount) { + fromConfig.setUsingAsCollateral(reserveId, false); + emit ReserveUsedAsCollateralDisabled(params.asset, params.from); + } + } + + if (params.balanceToBefore == 0) { + DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + toConfig, + reserve.configuration, + reserve.aTokenAddress + ) + ) { + toConfig.setUsingAsCollateral(reserveId, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.to); + } + } + } + } + + /** + * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as + * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor + * checks to ensure collateralization. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. + * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The users configuration mapping that track the supplied/borrowed assets + * @param asset The address of the asset being configured as collateral + * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise + * @param reservesCount The number of initialized reserves + * @param priceOracle The address of the price oracle + * @param userEModeCategory The eMode category chosen by the user + */ + function executeUseReserveAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + bool useAsCollateral, + uint256 reservesCount, + address priceOracle, + uint8 userEModeCategory + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); + + ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); + + if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; + + if (useAsCollateral) { + require( + ValidationLogic.validateUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration + ), + Errors.USER_IN_ISOLATION_MODE_OR_LTV_ZERO + ); + + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, msg.sender); + } else { + userConfig.setUsingAsCollateral(reserve.id, false); + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + asset, + msg.sender, + reservesCount, + priceOracle, + userEModeCategory + ); + + emit ReserveUsedAsCollateralDisabled(asset, msg.sender); + } + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BorrowLogic.sol + +/** + * @title BorrowLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to borrowing + */ +library BorrowLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the + * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the + * isolated debt. + * @dev Emits the `Borrow()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the borrow function + */ + function executeBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteBorrowParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ( + bool isolationModeActive, + address isolationModeCollateralAddress, + uint256 isolationModeDebtCeiling + ) = userConfig.getIsolationModeState(reservesData, reservesList); + + ValidationLogic.validateBorrow( + reservesData, + reservesList, + eModeCategories, + DataTypes.ValidateBorrowParams({ + reserveCache: reserveCache, + userConfig: userConfig, + asset: params.asset, + userAddress: params.onBehalfOf, + amount: params.amount, + interestRateMode: params.interestRateMode, + reservesCount: params.reservesCount, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory, + priceOracleSentinel: params.priceOracleSentinel, + isolationModeActive: isolationModeActive, + isolationModeCollateralAddress: isolationModeCollateralAddress, + isolationModeDebtCeiling: isolationModeDebtCeiling + }) + ); + + bool isFirstBorrowing = false; + + (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); + + if (isFirstBorrowing) { + userConfig.setBorrowing(reserve.id, true); + } + + if (isolationModeActive) { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt += (params.amount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + 0, + params.releaseUnderlying ? params.amount : 0 + ); + + if (params.releaseUnderlying) { + IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); + } + + emit Borrow( + params.asset, + params.user, + params.onBehalfOf, + params.amount, + DataTypes.InterestRateMode.VARIABLE, + reserve.currentVariableBorrowRate, + params.referralCode + ); + } + + /** + * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the + * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also + * reduces the isolated debt. + * @dev Emits the `Repay()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the repay function + * @return The actual amount being repaid + */ + function executeRepay( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteRepayParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + + uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( + params.onBehalfOf + ); + + ValidationLogic.validateRepay( + reserveCache, + params.amount, + params.interestRateMode, + params.onBehalfOf, + variableDebt + ); + + uint256 paybackAmount = variableDebt; + + // Allows a user to repay with aTokens without leaving dust from interest. + if (params.useATokens && params.amount == type(uint256).max) { + params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); + } + + if (params.amount < paybackAmount) { + paybackAmount = params.amount; + } + + reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) + .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + params.useATokens ? 0 : paybackAmount, + 0 + ); + + if (variableDebt - paybackAmount == 0) { + userConfig.setBorrowing(reserve.id, false); + } + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + reserveCache, + paybackAmount + ); + + if (params.useATokens) { + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + reserveCache.aTokenAddress, + paybackAmount, + reserveCache.nextLiquidityIndex + ); + // in case of aToken repayment the msg.sender must always repay on behalf of itself + if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + } else { + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); + IAToken(reserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.onBehalfOf, + paybackAmount + ); + } + + emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); + + return paybackAmount; + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/LiquidationLogic.sol + +/** + * @title LiquidationLogic library + * @author Aave + * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations + */ +library LiquidationLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Default percentage of borrower's debt to be repaid in a liquidation. + * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 0.5e4 results in 50.00% + */ + uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; + + /** + * @dev Maximum percentage of borrower's debt to be repaid in a liquidation + * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 1e4 results in 100.00% + */ + uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; + + /** + * @dev This constant represents below which health factor value it is possible to liquidate + * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. + * A value of 0.95e18 results in 0.95 + */ + uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; + + struct LiquidationCallLocalVars { + uint256 userCollateralBalance; + uint256 userTotalDebt; + uint256 actualDebtToLiquidate; + uint256 actualCollateralToLiquidate; + uint256 liquidationBonus; + uint256 healthFactor; + uint256 liquidationProtocolFeeAmount; + IAToken collateralAToken; + DataTypes.ReserveCache debtReserveCache; + } + + /** + * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) + * covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportional amount of the `collateralAsset` plus a bonus to cover market risk + * @dev Emits the `LiquidationCall()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params The additional parameters needed to execute the liquidation function + */ + function executeLiquidationCall( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ExecuteLiquidationCallParams memory params + ) external { + LiquidationCallLocalVars memory vars; + + DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; + DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; + DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; + vars.debtReserveCache = debtReserve.cache(); + debtReserve.updateState(vars.debtReserveCache); + + (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: params.reservesCount, + user: params.user, + oracle: params.priceOracle, + userEModeCategory: params.userEModeCategory + }) + ); + + (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( + vars.debtReserveCache, + params, + vars.healthFactor + ); + + ValidationLogic.validateLiquidationCall( + userConfig, + collateralReserve, + debtReserve, + DataTypes.ValidateLiquidationCallParams({ + debtReserveCache: vars.debtReserveCache, + totalDebt: vars.userTotalDebt, + healthFactor: vars.healthFactor, + priceOracleSentinel: params.priceOracleSentinel + }) + ); + + vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); + if ( + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + collateralReserve.id + ) + ) { + vars.liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; + } else { + vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); + } + + vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); + + ( + vars.actualCollateralToLiquidate, + vars.actualDebtToLiquidate, + vars.liquidationProtocolFeeAmount + ) = _calculateAvailableCollateralToLiquidate( + collateralReserve, + vars.debtReserveCache, + params.collateralAsset, + params.debtAsset, + vars.actualDebtToLiquidate, + vars.userCollateralBalance, + vars.liquidationBonus, + IPriceOracleGetter(params.priceOracle) + ); + + if (vars.userTotalDebt == vars.actualDebtToLiquidate) { + userConfig.setBorrowing(debtReserve.id, false); + } + + // If the collateral being liquidated is equal to the user balance, + // we set the currency as not being used as collateral anymore + if ( + vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == + vars.userCollateralBalance + ) { + userConfig.setUsingAsCollateral(collateralReserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); + } + + _burnDebtTokens(params, vars); + + debtReserve.updateInterestRatesAndVirtualBalance( + vars.debtReserveCache, + params.debtAsset, + vars.actualDebtToLiquidate, + 0 + ); + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + vars.debtReserveCache, + vars.actualDebtToLiquidate + ); + + if (params.receiveAToken) { + _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); + } else { + _burnCollateralATokens(collateralReserve, params, vars); + } + + // Transfer fee to treasury if it is non-zero + if (vars.liquidationProtocolFeeAmount != 0) { + uint256 liquidityIndex = collateralReserve.getNormalizedIncome(); + uint256 scaledDownLiquidationProtocolFee = vars.liquidationProtocolFeeAmount.rayDiv( + liquidityIndex + ); + uint256 scaledDownUserBalance = vars.collateralAToken.scaledBalanceOf(params.user); + // To avoid trying to send more aTokens than available on balance, due to 1 wei imprecision + if (scaledDownLiquidationProtocolFee > scaledDownUserBalance) { + vars.liquidationProtocolFeeAmount = scaledDownUserBalance.rayMul(liquidityIndex); + } + vars.collateralAToken.transferOnLiquidation( + params.user, + vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), + vars.liquidationProtocolFeeAmount + ); + } + + // Transfers the debt asset being repaid to the aToken, where the liquidity is kept + IERC20(params.debtAsset).safeTransferFrom( + msg.sender, + vars.debtReserveCache.aTokenAddress, + vars.actualDebtToLiquidate + ); + + IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.user, + vars.actualDebtToLiquidate + ); + + emit LiquidationCall( + params.collateralAsset, + params.debtAsset, + params.user, + vars.actualDebtToLiquidate, + vars.actualCollateralToLiquidate, + msg.sender, + params.receiveAToken + ); + } + + /** + * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. + * @dev The function also updates the state and the interest rate of the collateral reserve. + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _burnCollateralATokens( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); + collateralReserve.updateState(collateralReserveCache); + collateralReserve.updateInterestRatesAndVirtualBalance( + collateralReserveCache, + params.collateralAsset, + 0, + vars.actualCollateralToLiquidate + ); + + // Burn the equivalent amount of aToken, sending the underlying to the liquidator + vars.collateralAToken.burn( + params.user, + msg.sender, + vars.actualCollateralToLiquidate, + collateralReserveCache.nextLiquidityIndex + ); + } + + /** + * @notice Liquidates the user aTokens by transferring them to the liquidator. + * @dev The function also checks the state of the liquidator and activates the aToken as collateral + * as in standard transfers if the isolation mode constraints are respected. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _liquidateATokens( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); + vars.collateralAToken.transferOnLiquidation( + params.user, + msg.sender, + vars.actualCollateralToLiquidate + ); + + if (liquidatorPreviousATokenBalance == 0) { + DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + liquidatorConfig, + collateralReserve.configuration, + collateralReserve.aTokenAddress + ) + ) { + liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); + } + } + } + + /** + * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. + * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. + * @param params The additional parameters needed to execute the liquidation function + * @param vars the executeLiquidationCall() function local vars + */ + function _burnDebtTokens( + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( + vars.debtReserveCache.variableDebtTokenAddress + ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); + } + + /** + * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor + * and corresponding close factor. + * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR + * @param debtReserveCache The reserve cache data object of the debt reserve + * @param params The additional parameters needed to execute the liquidation function + * @param healthFactor The health factor of the position + * @return The total debt of the user + * @return The actual debt to liquidate as a function of the closeFactor + */ + function _calculateDebt( + DataTypes.ReserveCache memory debtReserveCache, + DataTypes.ExecuteLiquidationCallParams memory params, + uint256 healthFactor + ) internal view returns (uint256, uint256) { + uint256 userVariableDebt = IERC20(debtReserveCache.variableDebtTokenAddress).balanceOf( + params.user + ); + + uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD + ? DEFAULT_LIQUIDATION_CLOSE_FACTOR + : MAX_LIQUIDATION_CLOSE_FACTOR; + + uint256 maxLiquidatableDebt = userVariableDebt.percentMul(closeFactor); + + uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt + ? maxLiquidatableDebt + : params.debtToCover; + + return (userVariableDebt, actualDebtToLiquidate); + } + + struct AvailableCollateralToLiquidateLocalVars { + uint256 collateralPrice; + uint256 debtAssetPrice; + uint256 maxCollateralToLiquidate; + uint256 baseCollateral; + uint256 bonusCollateral; + uint256 debtAssetDecimals; + uint256 collateralDecimals; + uint256 collateralAssetUnit; + uint256 debtAssetUnit; + uint256 collateralAmount; + uint256 debtAmountNeeded; + uint256 liquidationProtocolFeePercentage; + uint256 liquidationProtocolFee; + } + + /** + * @notice Calculates how much of a specific collateral can be liquidated, given + * a certain amount of debt asset. + * @dev This function needs to be called after all the checks to validate the liquidation have been performed, + * otherwise it might fail. + * @param collateralReserve The data of the collateral reserve + * @param debtReserveCache The cached data of the debt reserve + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated + * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation + * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) + * @return The amount to repay with the liquidation + * @return The fee taken from the liquidation bonus amount to be paid to the protocol + */ + function _calculateAvailableCollateralToLiquidate( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveCache memory debtReserveCache, + address collateralAsset, + address debtAsset, + uint256 debtToCover, + uint256 userCollateralBalance, + uint256 liquidationBonus, + IPriceOracleGetter oracle + ) internal view returns (uint256, uint256, uint256) { + AvailableCollateralToLiquidateLocalVars memory vars; + + vars.collateralPrice = oracle.getAssetPrice(collateralAsset); + vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); + + vars.collateralDecimals = collateralReserve.configuration.getDecimals(); + vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); + + unchecked { + vars.collateralAssetUnit = 10 ** vars.collateralDecimals; + vars.debtAssetUnit = 10 ** vars.debtAssetDecimals; + } + + vars.liquidationProtocolFeePercentage = collateralReserve + .configuration + .getLiquidationProtocolFee(); + + // This is the base collateral to liquidate based on the given debt to cover + vars.baseCollateral = + ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / + (vars.collateralPrice * vars.debtAssetUnit); + + vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); + + if (vars.maxCollateralToLiquidate > userCollateralBalance) { + vars.collateralAmount = userCollateralBalance; + vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / + (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); + } else { + vars.collateralAmount = vars.maxCollateralToLiquidate; + vars.debtAmountNeeded = debtToCover; + } + + if (vars.liquidationProtocolFeePercentage != 0) { + vars.bonusCollateral = + vars.collateralAmount - + vars.collateralAmount.percentDiv(liquidationBonus); + + vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( + vars.liquidationProtocolFeePercentage + ); + + return ( + vars.collateralAmount - vars.liquidationProtocolFee, + vars.debtAmountNeeded, + vars.liquidationProtocolFee + ); + } else { + return (vars.collateralAmount, vars.debtAmountNeeded, 0); + } + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol + +/** + * @title FlashLoanLogic library + * @author Aave + * @notice Implements the logic for the flash loans + */ +library FlashLoanLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + + // See `IPool` for descriptions + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + // Helper struct for internal variables used in the `executeFlashLoan` function + struct FlashLoanLocalVars { + IFlashLoanReceiver receiver; + address currentAsset; + uint256 currentAmount; + uint256[] totalPremiums; + uint256 flashloanPremiumTotal; + uint256 flashloanPremiumToProtocol; + } + + /** + * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction + * as long as the amount taken plus fee is returned or debt is opened. + * @dev For authorized flashborrowers the fee is waived + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the flashloan function + */ + function executeFlashLoan( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.FlashloanParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); + + FlashLoanLocalVars memory vars; + + vars.totalPremiums = new uint256[](params.assets.length); + + vars.receiver = IFlashLoanReceiver(params.receiverAddress); + (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower + ? (0, 0) + : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); + + for (uint256 i = 0; i < params.assets.length; i++) { + vars.currentAmount = params.amounts[i]; + vars.totalPremiums[i] = DataTypes.InterestRateMode(params.interestRateModes[i]) == + DataTypes.InterestRateMode.NONE + ? vars.currentAmount.percentMul(vars.flashloanPremiumTotal) + : 0; + + if (reservesData[params.assets[i]].configuration.getIsVirtualAccActive()) { + reservesData[params.assets[i]].virtualUnderlyingBalance -= vars.currentAmount.toUint128(); + } + + IAToken(reservesData[params.assets[i]].aTokenAddress).transferUnderlyingTo( + params.receiverAddress, + vars.currentAmount + ); + } + + require( + vars.receiver.executeOperation( + params.assets, + params.amounts, + vars.totalPremiums, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + for (uint256 i = 0; i < params.assets.length; i++) { + vars.currentAsset = params.assets[i]; + vars.currentAmount = params.amounts[i]; + + if ( + DataTypes.InterestRateMode(params.interestRateModes[i]) == DataTypes.InterestRateMode.NONE + ) { + _handleFlashLoanRepayment( + reservesData[vars.currentAsset], + DataTypes.FlashLoanRepaymentParams({ + asset: vars.currentAsset, + receiverAddress: params.receiverAddress, + amount: vars.currentAmount, + totalPremium: vars.totalPremiums[i], + flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } else { + // If the user chose to not return the funds, the system checks if there is enough collateral and + // eventually opens a debt position + BorrowLogic.executeBorrow( + reservesData, + reservesList, + eModeCategories, + userConfig, + DataTypes.ExecuteBorrowParams({ + asset: vars.currentAsset, + user: msg.sender, + onBehalfOf: params.onBehalfOf, + amount: vars.currentAmount, + interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[i]), + referralCode: params.referralCode, + releaseUnderlying: false, + reservesCount: IPool(params.pool).getReservesCount(), + oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), + userEModeCategory: IPool(params.pool).getUserEMode(params.onBehalfOf).toUint8(), + priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) + .getPriceOracleSentinel() + }) + ); + // no premium is paid when taking on the flashloan as debt + emit FlashLoan( + params.receiverAddress, + msg.sender, + vars.currentAsset, + vars.currentAmount, + DataTypes.InterestRateMode(params.interestRateModes[i]), + 0, + params.referralCode + ); + } + } + } + + /** + * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one + * transaction as long as the amount taken plus fee is returned. + * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the simple flashloan function + */ + function executeFlashLoanSimple( + DataTypes.ReserveData storage reserve, + DataTypes.FlashloanSimpleParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloanSimple(reserve, params.amount); + + IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); + uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); + + if (reserve.configuration.getIsVirtualAccActive()) { + reserve.virtualUnderlyingBalance -= params.amount.toUint128(); + } + + IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); + + require( + receiver.executeOperation( + params.asset, + params.amount, + totalPremium, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + _handleFlashLoanRepayment( + reserve, + DataTypes.FlashLoanRepaymentParams({ + asset: params.asset, + receiverAddress: params.receiverAddress, + amount: params.amount, + totalPremium: totalPremium, + flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } + + /** + * @notice Handles repayment of flashloaned assets + premium + * @dev Will pull the amount + premium from the receiver, so must have approved pool + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the repayment function + */ + function _handleFlashLoanRepayment( + DataTypes.ReserveData storage reserve, + DataTypes.FlashLoanRepaymentParams memory params + ) internal { + uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); + uint256 premiumToLP = params.totalPremium - premiumToProtocol; + uint256 amountPlusPremium = params.amount + params.totalPremium; + + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply() + + uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), + premiumToLP + ); + + reserve.accruedToTreasury += premiumToProtocol + .rayDiv(reserveCache.nextLiquidityIndex) + .toUint128(); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, amountPlusPremium, 0); + + IERC20(params.asset).safeTransferFrom( + params.receiverAddress, + reserveCache.aTokenAddress, + amountPlusPremium + ); + + IAToken(reserveCache.aTokenAddress).handleRepayment( + params.receiverAddress, + params.receiverAddress, + amountPlusPremium + ); + + emit FlashLoan( + params.receiverAddress, + msg.sender, + params.asset, + params.amount, + DataTypes.InterestRateMode.NONE, + params.totalPremium, + params.referralCode + ); + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/Pool.sol + +/** + * @title Pool contract + * @author Aave + * @notice Main point of interaction with an Aave protocol's market + * - Users can: + * # Supply + * # Withdraw + * # Borrow + * # Repay + * # Enable/disable their supplied assets as collateral + * # Liquidate positions + * # Execute Flash Loans + * @dev To be covered by a proxy contract, owned by the PoolAddressesProvider of the specific market + * @dev All admin functions are callable by the PoolConfigurator contract defined also in the + * PoolAddressesProvider + */ +abstract contract Pool is VersionedInitializable, PoolStorage, IPool { + using ReserveLogic for DataTypes.ReserveData; + + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @dev Only pool configurator can call functions marked by this modifier. + */ + modifier onlyPoolConfigurator() { + _onlyPoolConfigurator(); + _; + } + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + _onlyPoolAdmin(); + _; + } + + /** + * @dev Only bridge can call functions marked by this modifier. + */ + modifier onlyBridge() { + _onlyBridge(); + _; + } + + function _onlyPoolConfigurator() internal view virtual { + require( + ADDRESSES_PROVIDER.getPoolConfigurator() == msg.sender, + Errors.CALLER_NOT_POOL_CONFIGURATOR + ); + } + + function _onlyPoolAdmin() internal view virtual { + require( + IACLManager(ADDRESSES_PROVIDER.getACLManager()).isPoolAdmin(msg.sender), + Errors.CALLER_NOT_POOL_ADMIN + ); + } + + function _onlyBridge() internal view virtual { + require( + IACLManager(ADDRESSES_PROVIDER.getACLManager()).isBridge(msg.sender), + Errors.CALLER_NOT_BRIDGE + ); + } + + /** + * @dev Constructor. + * @param provider The address of the PoolAddressesProvider contract + */ + constructor(IPoolAddressesProvider provider) { + ADDRESSES_PROVIDER = provider; + } + + /** + * @notice Initializes the Pool. + * @dev Function is invoked by the proxy contract when the Pool contract is added to the + * PoolAddressesProvider of the market. + * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations + * @param provider The address of the PoolAddressesProvider + */ + function initialize(IPoolAddressesProvider provider) external virtual; + + /// @inheritdoc IPool + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external virtual override onlyBridge { + BridgeLogic.executeMintUnbacked( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + asset, + amount, + onBehalfOf, + referralCode + ); + } + + /// @inheritdoc IPool + function backUnbacked( + address asset, + uint256 amount, + uint256 fee + ) external virtual override onlyBridge returns (uint256) { + return + BridgeLogic.executeBackUnbacked(_reserves[asset], asset, amount, fee, _bridgeProtocolFee); + } + + /// @inheritdoc IPool + function supply( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) public virtual override { + SupplyLogic.executeSupply( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteSupplyParams({ + asset: asset, + amount: amount, + onBehalfOf: onBehalfOf, + referralCode: referralCode + }) + ); + } + + /// @inheritdoc IPool + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) public virtual override { + try + IERC20WithPermit(asset).permit( + msg.sender, + address(this), + amount, + deadline, + permitV, + permitR, + permitS + ) + {} catch {} + SupplyLogic.executeSupply( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteSupplyParams({ + asset: asset, + amount: amount, + onBehalfOf: onBehalfOf, + referralCode: referralCode + }) + ); + } + + /// @inheritdoc IPool + function withdraw( + address asset, + uint256 amount, + address to + ) public virtual override returns (uint256) { + return + SupplyLogic.executeWithdraw( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[msg.sender], + DataTypes.ExecuteWithdrawParams({ + asset: asset, + amount: amount, + to: to, + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[msg.sender] + }) + ); + } + + /// @inheritdoc IPool + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) public virtual override { + BorrowLogic.executeBorrow( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[onBehalfOf], + DataTypes.ExecuteBorrowParams({ + asset: asset, + user: msg.sender, + onBehalfOf: onBehalfOf, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + referralCode: referralCode, + releaseUnderlying: true, + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[onBehalfOf], + priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() + }) + ); + } + + /// @inheritdoc IPool + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) public virtual override returns (uint256) { + return + BorrowLogic.executeRepay( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteRepayParams({ + asset: asset, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + onBehalfOf: onBehalfOf, + useATokens: false + }) + ); + } + + /// @inheritdoc IPool + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) public virtual override returns (uint256) { + try + IERC20WithPermit(asset).permit( + msg.sender, + address(this), + amount, + deadline, + permitV, + permitR, + permitS + ) + {} catch {} + + { + DataTypes.ExecuteRepayParams memory params = DataTypes.ExecuteRepayParams({ + asset: asset, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + onBehalfOf: onBehalfOf, + useATokens: false + }); + return BorrowLogic.executeRepay(_reserves, _reservesList, _usersConfig[onBehalfOf], params); + } + } + + /// @inheritdoc IPool + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) public virtual override returns (uint256) { + return + BorrowLogic.executeRepay( + _reserves, + _reservesList, + _usersConfig[msg.sender], + DataTypes.ExecuteRepayParams({ + asset: asset, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + onBehalfOf: msg.sender, + useATokens: true + }) + ); + } + + /// @inheritdoc IPool + function setUserUseReserveAsCollateral( + address asset, + bool useAsCollateral + ) public virtual override { + SupplyLogic.executeUseReserveAsCollateral( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[msg.sender], + asset, + useAsCollateral, + _reservesCount, + ADDRESSES_PROVIDER.getPriceOracle(), + _usersEModeCategory[msg.sender] + ); + } + + /// @inheritdoc IPool + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) public virtual override { + LiquidationLogic.executeLiquidationCall( + _reserves, + _reservesList, + _usersConfig, + _eModeCategories, + DataTypes.ExecuteLiquidationCallParams({ + reservesCount: _reservesCount, + debtToCover: debtToCover, + collateralAsset: collateralAsset, + debtAsset: debtAsset, + user: user, + receiveAToken: receiveAToken, + priceOracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[user], + priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() + }) + ); + } + + /// @inheritdoc IPool + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) public virtual override { + DataTypes.FlashloanParams memory flashParams = DataTypes.FlashloanParams({ + receiverAddress: receiverAddress, + assets: assets, + amounts: amounts, + interestRateModes: interestRateModes, + onBehalfOf: onBehalfOf, + params: params, + referralCode: referralCode, + flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, + flashLoanPremiumTotal: _flashLoanPremiumTotal, + reservesCount: _reservesCount, + addressesProvider: address(ADDRESSES_PROVIDER), + pool: address(this), + userEModeCategory: _usersEModeCategory[onBehalfOf], + isAuthorizedFlashBorrower: IACLManager(ADDRESSES_PROVIDER.getACLManager()).isFlashBorrower( + msg.sender + ) + }); + + FlashLoanLogic.executeFlashLoan( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[onBehalfOf], + flashParams + ); + } + + /// @inheritdoc IPool + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) public virtual override { + DataTypes.FlashloanSimpleParams memory flashParams = DataTypes.FlashloanSimpleParams({ + receiverAddress: receiverAddress, + asset: asset, + amount: amount, + params: params, + referralCode: referralCode, + flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, + flashLoanPremiumTotal: _flashLoanPremiumTotal + }); + FlashLoanLogic.executeFlashLoanSimple(_reserves[asset], flashParams); + } + + /// @inheritdoc IPool + function mintToTreasury(address[] calldata assets) external virtual override { + PoolLogic.executeMintToTreasury(_reserves, assets); + } + + /// @inheritdoc IPool + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory) { + return _reserves[asset]; + } + + /// @inheritdoc IPool + function getReserveData( + address asset + ) external view virtual override returns (DataTypes.ReserveDataLegacy memory) { + DataTypes.ReserveData memory reserve = _reserves[asset]; + DataTypes.ReserveDataLegacy memory res; + + res.configuration = reserve.configuration; + res.liquidityIndex = reserve.liquidityIndex; + res.currentLiquidityRate = reserve.currentLiquidityRate; + res.variableBorrowIndex = reserve.variableBorrowIndex; + res.currentVariableBorrowRate = reserve.currentVariableBorrowRate; + res.lastUpdateTimestamp = reserve.lastUpdateTimestamp; + res.id = reserve.id; + res.aTokenAddress = reserve.aTokenAddress; + res.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + res.interestRateStrategyAddress = reserve.interestRateStrategyAddress; + res.accruedToTreasury = reserve.accruedToTreasury; + res.unbacked = reserve.unbacked; + res.isolationModeTotalDebt = reserve.isolationModeTotalDebt; + // This is a temporary workaround for integrations that are broken by Aave 3.2 + // While the new pool data provider is backward compatible, some integrations hard-code an old implementation + // To allow them to unlock the funds, the pool address provider is setting a stable debt token, so balanceOf() and totalSupply() will return zero instead of reverting + res.stableDebtTokenAddress = ADDRESSES_PROVIDER.getAddress(bytes32('MOCK_STABLE_DEBT')); + return res; + } + + /// @inheritdoc IPool + function getVirtualUnderlyingBalance( + address asset + ) external view virtual override returns (uint128) { + return _reserves[asset].virtualUnderlyingBalance; + } + + /// @inheritdoc IPool + function getUserAccountData( + address user + ) + external + view + virtual + override + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ) + { + return + PoolLogic.executeGetUserAccountData( + _reserves, + _reservesList, + _eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: _usersConfig[user], + reservesCount: _reservesCount, + user: user, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[user] + }) + ); + } + + /// @inheritdoc IPool + function getConfiguration( + address asset + ) external view virtual override returns (DataTypes.ReserveConfigurationMap memory) { + return _reserves[asset].configuration; + } + + /// @inheritdoc IPool + function getUserConfiguration( + address user + ) external view virtual override returns (DataTypes.UserConfigurationMap memory) { + return _usersConfig[user]; + } + + /// @inheritdoc IPool + function getReserveNormalizedIncome( + address asset + ) external view virtual override returns (uint256) { + return _reserves[asset].getNormalizedIncome(); + } + + /// @inheritdoc IPool + function getReserveNormalizedVariableDebt( + address asset + ) external view virtual override returns (uint256) { + return _reserves[asset].getNormalizedDebt(); + } + + /// @inheritdoc IPool + function getReservesList() external view virtual override returns (address[] memory) { + uint256 reservesListCount = _reservesCount; + uint256 droppedReservesCount = 0; + address[] memory reservesList = new address[](reservesListCount); + + for (uint256 i = 0; i < reservesListCount; i++) { + if (_reservesList[i] != address(0)) { + reservesList[i - droppedReservesCount] = _reservesList[i]; + } else { + droppedReservesCount++; + } + } + + // Reduces the length of the reserves array by `droppedReservesCount` + assembly { + mstore(reservesList, sub(reservesListCount, droppedReservesCount)) + } + return reservesList; + } + + /// @inheritdoc IPool + function getReservesCount() external view virtual override returns (uint256) { + return _reservesCount; + } + + /// @inheritdoc IPool + function getReserveAddressById(uint16 id) external view returns (address) { + return _reservesList[id]; + } + + /// @inheritdoc IPool + function BRIDGE_PROTOCOL_FEE() public view virtual override returns (uint256) { + return _bridgeProtocolFee; + } + + /// @inheritdoc IPool + function FLASHLOAN_PREMIUM_TOTAL() public view virtual override returns (uint128) { + return _flashLoanPremiumTotal; + } + + /// @inheritdoc IPool + function FLASHLOAN_PREMIUM_TO_PROTOCOL() public view virtual override returns (uint128) { + return _flashLoanPremiumToProtocol; + } + + /// @inheritdoc IPool + function MAX_NUMBER_RESERVES() public view virtual override returns (uint16) { + return ReserveConfiguration.MAX_RESERVES_COUNT; + } + + /// @inheritdoc IPool + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external virtual override { + require(msg.sender == _reserves[asset].aTokenAddress, Errors.CALLER_NOT_ATOKEN); + SupplyLogic.executeFinalizeTransfer( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig, + DataTypes.FinalizeTransferParams({ + asset: asset, + from: from, + to: to, + amount: amount, + balanceFromBefore: balanceFromBefore, + balanceToBefore: balanceToBefore, + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + fromEModeCategory: _usersEModeCategory[from] + }) + ); + } + + /// @inheritdoc IPool + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external virtual override onlyPoolConfigurator { + if ( + PoolLogic.executeInitReserve( + _reserves, + _reservesList, + DataTypes.InitReserveParams({ + asset: asset, + aTokenAddress: aTokenAddress, + variableDebtAddress: variableDebtAddress, + interestRateStrategyAddress: interestRateStrategyAddress, + reservesCount: _reservesCount, + maxNumberReserves: MAX_NUMBER_RESERVES() + }) + ) + ) { + _reservesCount++; + } + } + + /// @inheritdoc IPool + function dropReserve(address asset) external virtual override onlyPoolConfigurator { + PoolLogic.executeDropReserve(_reserves, _reservesList, asset); + } + + /// @inheritdoc IPool + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external virtual override onlyPoolConfigurator { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + + _reserves[asset].interestRateStrategyAddress = rateStrategyAddress; + } + + /// @inheritdoc IPool + function syncIndexesState(address asset) external virtual override onlyPoolConfigurator { + DataTypes.ReserveData storage reserve = _reserves[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + } + + /// @inheritdoc IPool + function syncRatesState(address asset) external virtual override onlyPoolConfigurator { + DataTypes.ReserveData storage reserve = _reserves[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + ReserveLogic.updateInterestRatesAndVirtualBalance(reserve, reserveCache, asset, 0, 0); + } + + /// @inheritdoc IPool + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external virtual override onlyPoolConfigurator { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + _reserves[asset].configuration = configuration; + } + + /// @inheritdoc IPool + function updateBridgeProtocolFee( + uint256 protocolFee + ) external virtual override onlyPoolConfigurator { + _bridgeProtocolFee = protocolFee; + } + + /// @inheritdoc IPool + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external virtual override onlyPoolConfigurator { + _flashLoanPremiumTotal = flashLoanPremiumTotal; + _flashLoanPremiumToProtocol = flashLoanPremiumToProtocol; + } + + /// @inheritdoc IPool + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory category + ) external virtual override onlyPoolConfigurator { + // category 0 is reserved for volatile heterogeneous assets and it's always disabled + require(id != 0, Errors.EMODE_CATEGORY_RESERVED); + _eModeCategories[id].ltv = category.ltv; + _eModeCategories[id].liquidationThreshold = category.liquidationThreshold; + _eModeCategories[id].liquidationBonus = category.liquidationBonus; + _eModeCategories[id].label = category.label; + } + + /// @inheritdoc IPool + function configureEModeCategoryCollateralBitmap( + uint8 id, + uint128 collateralBitmap + ) external virtual override onlyPoolConfigurator { + // category 0 is reserved for volatile heterogeneous assets and it's always disabled + require(id != 0, Errors.EMODE_CATEGORY_RESERVED); + _eModeCategories[id].collateralBitmap = collateralBitmap; + } + + /// @inheritdoc IPool + function configureEModeCategoryBorrowableBitmap( + uint8 id, + uint128 borrowableBitmap + ) external virtual override onlyPoolConfigurator { + // category 0 is reserved for volatile heterogeneous assets and it's always disabled + require(id != 0, Errors.EMODE_CATEGORY_RESERVED); + _eModeCategories[id].borrowableBitmap = borrowableBitmap; + } + + /// @inheritdoc IPool + function getEModeCategoryData( + uint8 id + ) external view virtual override returns (DataTypes.EModeCategoryLegacy memory) { + DataTypes.EModeCategory memory category = _eModeCategories[id]; + return + DataTypes.EModeCategoryLegacy({ + ltv: category.ltv, + liquidationThreshold: category.liquidationThreshold, + liquidationBonus: category.liquidationBonus, + priceSource: address(0), + label: category.label + }); + } + + /// @inheritdoc IPool + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory) { + return + DataTypes.CollateralConfig({ + ltv: _eModeCategories[id].ltv, + liquidationThreshold: _eModeCategories[id].liquidationThreshold, + liquidationBonus: _eModeCategories[id].liquidationBonus + }); + } + + /// @inheritdoc IPool + function getEModeCategoryLabel(uint8 id) external view returns (string memory) { + return _eModeCategories[id].label; + } + + /// @inheritdoc IPool + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128) { + return _eModeCategories[id].collateralBitmap; + } + + /// @inheritdoc IPool + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128) { + return _eModeCategories[id].borrowableBitmap; + } + + /// @inheritdoc IPool + function setUserEMode(uint8 categoryId) external virtual override { + EModeLogic.executeSetUserEMode( + _reserves, + _reservesList, + _eModeCategories, + _usersEModeCategory, + _usersConfig[msg.sender], + DataTypes.ExecuteSetUserEModeParams({ + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + categoryId: categoryId + }) + ); + } + + /// @inheritdoc IPool + function getUserEMode(address user) external view virtual override returns (uint256) { + return _usersEModeCategory[user]; + } + + /// @inheritdoc IPool + function resetIsolationModeTotalDebt( + address asset + ) external virtual override onlyPoolConfigurator { + PoolLogic.executeResetIsolationModeTotalDebt(_reserves, asset); + } + + /// @inheritdoc IPool + function getLiquidationGracePeriod(address asset) external virtual override returns (uint40) { + return _reserves[asset].liquidationGracePeriodUntil; + } + + /// @inheritdoc IPool + function setLiquidationGracePeriod( + address asset, + uint40 until + ) external virtual override onlyPoolConfigurator { + require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + PoolLogic.executeSetLiquidationGracePeriod(_reserves, asset, until); + } + + /// @inheritdoc IPool + function rescueTokens( + address token, + address to, + uint256 amount + ) external virtual override onlyPoolAdmin { + PoolLogic.executeRescueTokens(token, to, amount); + } + + /// @inheritdoc IPool + /// @dev Deprecated: maintained for compatibility purposes + function deposit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external virtual override { + SupplyLogic.executeSupply( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteSupplyParams({ + asset: asset, + amount: amount, + onBehalfOf: onBehalfOf, + referralCode: referralCode + }) + ); + } + + /// @inheritdoc IPool + function getFlashLoanLogic() external pure returns (address) { + return address(FlashLoanLogic); + } + + /// @inheritdoc IPool + function getBorrowLogic() external pure returns (address) { + return address(BorrowLogic); + } + + /// @inheritdoc IPool + function getBridgeLogic() external pure returns (address) { + return address(BridgeLogic); + } + + /// @inheritdoc IPool + function getEModeLogic() external pure returns (address) { + return address(EModeLogic); + } + + /// @inheritdoc IPool + function getLiquidationLogic() external pure returns (address) { + return address(LiquidationLogic); + } + + /// @inheritdoc IPool + function getPoolLogic() external pure returns (address) { + return address(PoolLogic); + } + + /// @inheritdoc IPool + function getSupplyLogic() external pure returns (address) { + return address(SupplyLogic); + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/PoolInstance.sol + +contract PoolInstance is Pool { + uint256 public constant POOL_REVISION = 6; + + constructor(IPoolAddressesProvider provider) Pool(provider) {} + + /** + * @notice Initializes the Pool. + * @dev Function is invoked by the proxy contract when the Pool contract is added to the + * PoolAddressesProvider of the market. + * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations + * @param provider The address of the PoolAddressesProvider + */ + function initialize(IPoolAddressesProvider provider) external virtual override initializer { + require(provider == ADDRESSES_PROVIDER, Errors.INVALID_ADDRESSES_PROVIDER); + } + + function getRevision() internal pure virtual override returns (uint256) { + return POOL_REVISION; + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/L2Pool.sol + +/** + * @title L2Pool + * @author Aave + * @notice Calldata optimized extension of the Pool contract allowing users to pass compact calldata representation + * to reduce transaction costs on rollups. + */ +abstract contract L2Pool is Pool, IL2Pool { + /// @inheritdoc IL2Pool + function supply(bytes32 args) external override { + (address asset, uint256 amount, uint16 referralCode) = CalldataLogic.decodeSupplyParams( + _reservesList, + args + ); + + supply(asset, amount, msg.sender, referralCode); + } + + /// @inheritdoc IL2Pool + function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s) external override { + (address asset, uint256 amount, uint16 referralCode, uint256 deadline, uint8 v) = CalldataLogic + .decodeSupplyWithPermitParams(_reservesList, args); + + supplyWithPermit(asset, amount, msg.sender, referralCode, deadline, v, r, s); + } + + /// @inheritdoc IL2Pool + function withdraw(bytes32 args) external override returns (uint256) { + (address asset, uint256 amount) = CalldataLogic.decodeWithdrawParams(_reservesList, args); + + return withdraw(asset, amount, msg.sender); + } + + /// @inheritdoc IL2Pool + function borrow(bytes32 args) external override { + (address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode) = CalldataLogic + .decodeBorrowParams(_reservesList, args); + + borrow(asset, amount, interestRateMode, referralCode, msg.sender); + } + + /// @inheritdoc IL2Pool + function repay(bytes32 args) external override returns (uint256) { + (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( + _reservesList, + args + ); + + return repay(asset, amount, interestRateMode, msg.sender); + } + + /// @inheritdoc IL2Pool + function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) external override returns (uint256) { + ( + address asset, + uint256 amount, + uint256 interestRateMode, + uint256 deadline, + uint8 v + ) = CalldataLogic.decodeRepayWithPermitParams(_reservesList, args); + + return repayWithPermit(asset, amount, interestRateMode, msg.sender, deadline, v, r, s); + } + + /// @inheritdoc IL2Pool + function repayWithATokens(bytes32 args) external override returns (uint256) { + (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( + _reservesList, + args + ); + + return repayWithATokens(asset, amount, interestRateMode); + } + + /// @inheritdoc IL2Pool + function setUserUseReserveAsCollateral(bytes32 args) external override { + (address asset, bool useAsCollateral) = CalldataLogic.decodeSetUserUseReserveAsCollateralParams( + _reservesList, + args + ); + setUserUseReserveAsCollateral(asset, useAsCollateral); + } + + /// @inheritdoc IL2Pool + function liquidationCall(bytes32 args1, bytes32 args2) external override { + ( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) = CalldataLogic.decodeLiquidationCallParams(_reservesList, args1, args2); + liquidationCall(collateralAsset, debtAsset, user, debtToCover, receiveAToken); + } +} + +// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/L2PoolInstance.sol + +contract L2PoolInstance is L2Pool, PoolInstance { + constructor(IPoolAddressesProvider provider) PoolInstance(provider) {} +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/L2PoolInstance.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/L2PoolInstance.sol new file mode 100644 index 00000000..f323d4bd --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/L2PoolInstance.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {L2Pool} from '../protocol/pool/L2Pool.sol'; +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {PoolInstance} from './PoolInstance.sol'; + +contract L2PoolInstance is L2Pool, PoolInstance { + constructor(IPoolAddressesProvider provider) PoolInstance(provider) {} +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/PoolInstance.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/PoolInstance.sol new file mode 100644 index 00000000..02eafdd1 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/PoolInstance.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {Pool} from '../protocol/pool/Pool.sol'; +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {Errors} from '../protocol/libraries/helpers/Errors.sol'; + +contract PoolInstance is Pool { + uint256 public constant POOL_REVISION = 6; + + constructor(IPoolAddressesProvider provider) Pool(provider) {} + + /** + * @notice Initializes the Pool. + * @dev Function is invoked by the proxy contract when the Pool contract is added to the + * PoolAddressesProvider of the market. + * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations + * @param provider The address of the PoolAddressesProvider + */ + function initialize(IPoolAddressesProvider provider) external virtual override initializer { + require(provider == ADDRESSES_PROVIDER, Errors.INVALID_ADDRESSES_PROVIDER); + } + + function getRevision() internal pure virtual override returns (uint256) { + return POOL_REVISION; + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IERC20WithPermit.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IERC20WithPermit.sol new file mode 100644 index 00000000..0fceb8c5 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IERC20WithPermit.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; + +/** + * @title IERC20WithPermit + * @author Aave + * @notice Interface for the permit function (EIP-2612) + */ +interface IERC20WithPermit is IERC20 { + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IL2Pool.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IL2Pool.sol new file mode 100644 index 00000000..56dee912 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IL2Pool.sol @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IL2Pool + * @author Aave + * @notice Defines the basic extension interface for an L2 Aave Pool. + */ +interface IL2Pool { + /** + * @notice Calldata efficient wrapper of the supply function on behalf of the caller + * @param args Arguments for the supply function packed in one bytes32 + * 96 bits 16 bits 128 bits 16 bits + * | 0-padding | referralCode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + */ + function supply(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the supplyWithPermit function on behalf of the caller + * @param args Arguments for the supply function packed in one bytes32 + * 56 bits 8 bits 32 bits 16 bits 128 bits 16 bits + * | 0-padding | permitV | shortenedDeadline | referralCode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @param r The R parameter of ERC712 permit sig + * @param s The S parameter of ERC712 permit sig + */ + function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s) external; + + /** + * @notice Calldata efficient wrapper of the withdraw function, withdrawing to the caller + * @param args Arguments for the withdraw function packed in one bytes32 + * 112 bits 128 bits 16 bits + * | 0-padding | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @return The final amount withdrawn + */ + function withdraw(bytes32 args) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the borrow function, borrowing on behalf of the caller + * @param args Arguments for the borrow function packed in one bytes32 + * 88 bits 16 bits 8 bits 128 bits 16 bits + * | 0-padding | referralCode | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + */ + function borrow(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the repay function, repaying on behalf of the caller + * @param args Arguments for the repay function packed in one bytes32 + * 104 bits 8 bits 128 bits 16 bits + * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @return The final amount repaid + */ + function repay(bytes32 args) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the repayWithPermit function, repaying on behalf of the caller + * @param args Arguments for the repayWithPermit function packed in one bytes32 + * 64 bits 8 bits 32 bits 8 bits 128 bits 16 bits + * | 0-padding | permitV | shortenedDeadline | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @param r The R parameter of ERC712 permit sig + * @param s The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the repayWithATokens function + * @param args Arguments for the repayWithATokens function packed in one bytes32 + * 104 bits 8 bits 128 bits 16 bits + * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @return The final amount repaid + */ + function repayWithATokens(bytes32 args) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the setUserUseReserveAsCollateral function + * @param args Arguments for the setUserUseReserveAsCollateral function packed in one bytes32 + * 239 bits 1 bit 16 bits + * | 0-padding | useAsCollateral | assetId | + * @dev assetId is the index of the asset in the reservesList. + */ + function setUserUseReserveAsCollateral(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the liquidationCall function + * @param args1 part of the arguments for the liquidationCall function packed in one bytes32 + * 64 bits 160 bits 16 bits 16 bits + * | 0-padding | user address | debtAssetId | collateralAssetId | + * @param args2 part of the arguments for the liquidationCall function packed in one bytes32 + * 127 bits 1 bit 128 bits + * | 0-padding | receiveAToken | shortenedDebtToCover | + * @dev the shortenedDebtToCover is cast to 256 bits at decode time, + * if type(uint128).max the value will be expanded to type(uint256).max + */ + function liquidationCall(bytes32 args1, bytes32 args2) external; +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..e7ba8f7a --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol new file mode 100644 index 00000000..1070227a --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol new file mode 100644 index 00000000..a3a55684 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; + +/** + * @title IFlashLoanReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + */ +interface IFlashLoanReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed assets + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param assets The addresses of the flash-borrowed assets + * @param amounts The amounts of the flash-borrowed assets + * @param premiums The fee of each flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata premiums, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol new file mode 100644 index 00000000..bff21ae4 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; + +/** + * @title IFlashLoanSimpleReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + */ +interface IFlashLoanSimpleReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed asset + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param asset The address of the flash-borrowed asset + * @param amount The amount of the flash-borrowed asset + * @param premium The fee of the flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address asset, + uint256 amount, + uint256 premium, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BorrowLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BorrowLogic.sol new file mode 100644 index 00000000..c4ed26ed --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BorrowLogic.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {IsolationModeLogic} from './IsolationModeLogic.sol'; + +/** + * @title BorrowLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to borrowing + */ +library BorrowLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the + * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the + * isolated debt. + * @dev Emits the `Borrow()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the borrow function + */ + function executeBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteBorrowParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ( + bool isolationModeActive, + address isolationModeCollateralAddress, + uint256 isolationModeDebtCeiling + ) = userConfig.getIsolationModeState(reservesData, reservesList); + + ValidationLogic.validateBorrow( + reservesData, + reservesList, + eModeCategories, + DataTypes.ValidateBorrowParams({ + reserveCache: reserveCache, + userConfig: userConfig, + asset: params.asset, + userAddress: params.onBehalfOf, + amount: params.amount, + interestRateMode: params.interestRateMode, + reservesCount: params.reservesCount, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory, + priceOracleSentinel: params.priceOracleSentinel, + isolationModeActive: isolationModeActive, + isolationModeCollateralAddress: isolationModeCollateralAddress, + isolationModeDebtCeiling: isolationModeDebtCeiling + }) + ); + + bool isFirstBorrowing = false; + + (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); + + if (isFirstBorrowing) { + userConfig.setBorrowing(reserve.id, true); + } + + if (isolationModeActive) { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt += (params.amount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + 0, + params.releaseUnderlying ? params.amount : 0 + ); + + if (params.releaseUnderlying) { + IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); + } + + emit Borrow( + params.asset, + params.user, + params.onBehalfOf, + params.amount, + DataTypes.InterestRateMode.VARIABLE, + reserve.currentVariableBorrowRate, + params.referralCode + ); + } + + /** + * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the + * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also + * reduces the isolated debt. + * @dev Emits the `Repay()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the repay function + * @return The actual amount being repaid + */ + function executeRepay( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteRepayParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + + uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( + params.onBehalfOf + ); + + ValidationLogic.validateRepay( + reserveCache, + params.amount, + params.interestRateMode, + params.onBehalfOf, + variableDebt + ); + + uint256 paybackAmount = variableDebt; + + // Allows a user to repay with aTokens without leaving dust from interest. + if (params.useATokens && params.amount == type(uint256).max) { + params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); + } + + if (params.amount < paybackAmount) { + paybackAmount = params.amount; + } + + reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) + .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + params.useATokens ? 0 : paybackAmount, + 0 + ); + + if (variableDebt - paybackAmount == 0) { + userConfig.setBorrowing(reserve.id, false); + } + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + reserveCache, + paybackAmount + ); + + if (params.useATokens) { + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + reserveCache.aTokenAddress, + paybackAmount, + reserveCache.nextLiquidityIndex + ); + // in case of aToken repayment the msg.sender must always repay on behalf of itself + if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + } else { + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); + IAToken(reserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.onBehalfOf, + paybackAmount + ); + } + + emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); + + return paybackAmount; + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BridgeLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BridgeLogic.sol new file mode 100644 index 00000000..3b4d469b --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BridgeLogic.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +library BridgeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. + * @dev Essentially a supply without transferring the underlying. + * @dev Emits the `MintUnbacked` event + * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param asset The address of the underlying asset to mint aTokens of + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function executeMintUnbacked( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, reserve, amount, onBehalfOf); + + uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); + uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); + + uint256 unbacked = reserve.unbacked += amount.toUint128(); + + require( + unbacked <= unbackedMintCap * (10 ** reserveDecimals), + Errors.UNBACKED_MINT_CAP_EXCEEDED + ); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, 0, 0); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + onBehalfOf, + amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration, + reserveCache.aTokenAddress + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); + } + } + + emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); + } + + /** + * @notice Back the current unbacked with `amount` and pay `fee`. + * @dev It is not possible to back more than the existing unbacked amount of the reserve + * @dev Emits the `BackUnbacked` event + * @param reserve The reserve to back unbacked for + * @param asset The address of the underlying asset to repay + * @param amount The amount to back + * @param fee The amount paid in fees + * @param protocolFeeBps The fraction of fees in basis points paid to the protocol + * @return The backed amount + */ + function executeBackUnbacked( + DataTypes.ReserveData storage reserve, + address asset, + uint256 amount, + uint256 fee, + uint256 protocolFeeBps + ) external returns (uint256) { + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; + + uint256 feeToProtocol = fee.percentMul(protocolFeeBps); + uint256 feeToLP = fee - feeToProtocol; + uint256 added = backingAmount + fee; + + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply() + + uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), + feeToLP + ); + + reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + + reserve.unbacked -= backingAmount.toUint128(); + reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, added, 0); + + IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); + + emit BackUnbacked(asset, msg.sender, backingAmount, fee); + + return backingAmount; + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/CalldataLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/CalldataLogic.sol new file mode 100644 index 00000000..742cbcbf --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/CalldataLogic.sol @@ -0,0 +1,233 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title CalldataLogic library + * @author Aave + * @notice Library to decode calldata, used to optimize calldata size in L2Pool for transaction cost reduction + */ +library CalldataLogic { + /** + * @notice Decodes compressed supply params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed supply params + * @return The address of the underlying reserve + * @return The amount to supply + * @return The referralCode + */ + function decodeSupplyParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint16) { + uint16 assetId; + uint256 amount; + uint16 referralCode; + + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + referralCode := and(shr(144, args), 0xFFFF) + } + return (reservesList[assetId], amount, referralCode); + } + + /** + * @notice Decodes compressed supply params to standard params along with permit params + * @param reservesList The addresses of all the active reserves + * @param args The packed supply with permit params + * @return The address of the underlying reserve + * @return The amount to supply + * @return The referralCode + * @return The deadline of the permit + * @return The V value of the permit signature + */ + function decodeSupplyWithPermitParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint16, uint256, uint8) { + uint256 deadline; + uint8 permitV; + + assembly { + deadline := and(shr(160, args), 0xFFFFFFFF) + permitV := and(shr(192, args), 0xFF) + } + (address asset, uint256 amount, uint16 referralCode) = decodeSupplyParams(reservesList, args); + + return (asset, amount, referralCode, deadline, permitV); + } + + /** + * @notice Decodes compressed withdraw params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed withdraw params + * @return The address of the underlying reserve + * @return The amount to withdraw + */ + function decodeWithdrawParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256) { + uint16 assetId; + uint256 amount; + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + } + if (amount == type(uint128).max) { + amount = type(uint256).max; + } + return (reservesList[assetId], amount); + } + + /** + * @notice Decodes compressed borrow params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed borrow params + * @return The address of the underlying reserve + * @return The amount to borrow + * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) + * @return The referralCode + */ + function decodeBorrowParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint256, uint16) { + uint16 assetId; + uint256 amount; + uint256 interestRateMode; + uint16 referralCode; + + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + interestRateMode := and(shr(144, args), 0xFF) + referralCode := and(shr(152, args), 0xFFFF) + } + + return (reservesList[assetId], amount, interestRateMode, referralCode); + } + + /** + * @notice Decodes compressed repay params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed repay params + * @return The address of the underlying reserve + * @return The amount to repay + * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) + */ + function decodeRepayParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint256) { + uint16 assetId; + uint256 amount; + uint256 interestRateMode; + + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + interestRateMode := and(shr(144, args), 0xFF) + } + + if (amount == type(uint128).max) { + amount = type(uint256).max; + } + + return (reservesList[assetId], amount, interestRateMode); + } + + /** + * @notice Decodes compressed repay params to standard params along with permit params + * @param reservesList The addresses of all the active reserves + * @param args The packed repay with permit params + * @return The address of the underlying reserve + * @return The amount to repay + * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) + * @return The deadline of the permit + * @return The V value of the permit signature + */ + function decodeRepayWithPermitParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint256, uint256, uint8) { + uint256 deadline; + uint8 permitV; + + (address asset, uint256 amount, uint256 interestRateMode) = decodeRepayParams( + reservesList, + args + ); + + assembly { + deadline := and(shr(152, args), 0xFFFFFFFF) + permitV := and(shr(184, args), 0xFF) + } + + return (asset, amount, interestRateMode, deadline, permitV); + } + + /** + * @notice Decodes compressed set user use reserve as collateral params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed set user use reserve as collateral params + * @return The address of the underlying reserve + * @return True if to set using as collateral, false otherwise + */ + function decodeSetUserUseReserveAsCollateralParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, bool) { + uint16 assetId; + bool useAsCollateral; + assembly { + assetId := and(args, 0xFFFF) + useAsCollateral := and(shr(16, args), 0x1) + } + return (reservesList[assetId], useAsCollateral); + } + + /** + * @notice Decodes compressed liquidation call params to standard params + * @param reservesList The addresses of all the active reserves + * @param args1 The first half of packed liquidation call params + * @param args2 The second half of the packed liquidation call params + * @return The address of the underlying collateral asset + * @return The address of the underlying debt asset + * @return The address of the user to liquidate + * @return The amount of debt to cover + * @return True if receiving aTokens, false otherwise + */ + function decodeLiquidationCallParams( + mapping(uint256 => address) storage reservesList, + bytes32 args1, + bytes32 args2 + ) internal view returns (address, address, address, uint256, bool) { + uint16 collateralAssetId; + uint16 debtAssetId; + address user; + uint256 debtToCover; + bool receiveAToken; + + assembly { + collateralAssetId := and(args1, 0xFFFF) + debtAssetId := and(shr(16, args1), 0xFFFF) + user := and(shr(32, args1), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + + debtToCover := and(args2, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + receiveAToken := and(shr(128, args2), 0x1) + } + + if (debtToCover == type(uint128).max) { + debtToCover = type(uint256).max; + } + + return ( + reservesList[collateralAssetId], + reservesList[debtAssetId], + user, + debtToCover, + receiveAToken + ); + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..647fc7e7 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol new file mode 100644 index 00000000..31ffb288 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol @@ -0,0 +1,277 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IFlashLoanReceiver} from '../../../misc/flashloan/interfaces/IFlashLoanReceiver.sol'; +import {IFlashLoanSimpleReceiver} from '../../../misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {BorrowLogic} from './BorrowLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title FlashLoanLogic library + * @author Aave + * @notice Implements the logic for the flash loans + */ +library FlashLoanLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + + // See `IPool` for descriptions + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + // Helper struct for internal variables used in the `executeFlashLoan` function + struct FlashLoanLocalVars { + IFlashLoanReceiver receiver; + address currentAsset; + uint256 currentAmount; + uint256[] totalPremiums; + uint256 flashloanPremiumTotal; + uint256 flashloanPremiumToProtocol; + } + + /** + * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction + * as long as the amount taken plus fee is returned or debt is opened. + * @dev For authorized flashborrowers the fee is waived + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the flashloan function + */ + function executeFlashLoan( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.FlashloanParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); + + FlashLoanLocalVars memory vars; + + vars.totalPremiums = new uint256[](params.assets.length); + + vars.receiver = IFlashLoanReceiver(params.receiverAddress); + (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower + ? (0, 0) + : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); + + for (uint256 i = 0; i < params.assets.length; i++) { + vars.currentAmount = params.amounts[i]; + vars.totalPremiums[i] = DataTypes.InterestRateMode(params.interestRateModes[i]) == + DataTypes.InterestRateMode.NONE + ? vars.currentAmount.percentMul(vars.flashloanPremiumTotal) + : 0; + + if (reservesData[params.assets[i]].configuration.getIsVirtualAccActive()) { + reservesData[params.assets[i]].virtualUnderlyingBalance -= vars.currentAmount.toUint128(); + } + + IAToken(reservesData[params.assets[i]].aTokenAddress).transferUnderlyingTo( + params.receiverAddress, + vars.currentAmount + ); + } + + require( + vars.receiver.executeOperation( + params.assets, + params.amounts, + vars.totalPremiums, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + for (uint256 i = 0; i < params.assets.length; i++) { + vars.currentAsset = params.assets[i]; + vars.currentAmount = params.amounts[i]; + + if ( + DataTypes.InterestRateMode(params.interestRateModes[i]) == DataTypes.InterestRateMode.NONE + ) { + _handleFlashLoanRepayment( + reservesData[vars.currentAsset], + DataTypes.FlashLoanRepaymentParams({ + asset: vars.currentAsset, + receiverAddress: params.receiverAddress, + amount: vars.currentAmount, + totalPremium: vars.totalPremiums[i], + flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } else { + // If the user chose to not return the funds, the system checks if there is enough collateral and + // eventually opens a debt position + BorrowLogic.executeBorrow( + reservesData, + reservesList, + eModeCategories, + userConfig, + DataTypes.ExecuteBorrowParams({ + asset: vars.currentAsset, + user: msg.sender, + onBehalfOf: params.onBehalfOf, + amount: vars.currentAmount, + interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[i]), + referralCode: params.referralCode, + releaseUnderlying: false, + reservesCount: IPool(params.pool).getReservesCount(), + oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), + userEModeCategory: IPool(params.pool).getUserEMode(params.onBehalfOf).toUint8(), + priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) + .getPriceOracleSentinel() + }) + ); + // no premium is paid when taking on the flashloan as debt + emit FlashLoan( + params.receiverAddress, + msg.sender, + vars.currentAsset, + vars.currentAmount, + DataTypes.InterestRateMode(params.interestRateModes[i]), + 0, + params.referralCode + ); + } + } + } + + /** + * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one + * transaction as long as the amount taken plus fee is returned. + * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the simple flashloan function + */ + function executeFlashLoanSimple( + DataTypes.ReserveData storage reserve, + DataTypes.FlashloanSimpleParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloanSimple(reserve, params.amount); + + IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); + uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); + + if (reserve.configuration.getIsVirtualAccActive()) { + reserve.virtualUnderlyingBalance -= params.amount.toUint128(); + } + + IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); + + require( + receiver.executeOperation( + params.asset, + params.amount, + totalPremium, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + _handleFlashLoanRepayment( + reserve, + DataTypes.FlashLoanRepaymentParams({ + asset: params.asset, + receiverAddress: params.receiverAddress, + amount: params.amount, + totalPremium: totalPremium, + flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } + + /** + * @notice Handles repayment of flashloaned assets + premium + * @dev Will pull the amount + premium from the receiver, so must have approved pool + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the repayment function + */ + function _handleFlashLoanRepayment( + DataTypes.ReserveData storage reserve, + DataTypes.FlashLoanRepaymentParams memory params + ) internal { + uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); + uint256 premiumToLP = params.totalPremium - premiumToProtocol; + uint256 amountPlusPremium = params.amount + params.totalPremium; + + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply() + + uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), + premiumToLP + ); + + reserve.accruedToTreasury += premiumToProtocol + .rayDiv(reserveCache.nextLiquidityIndex) + .toUint128(); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, amountPlusPremium, 0); + + IERC20(params.asset).safeTransferFrom( + params.receiverAddress, + reserveCache.aTokenAddress, + amountPlusPremium + ); + + IAToken(reserveCache.aTokenAddress).handleRepayment( + params.receiverAddress, + params.receiverAddress, + amountPlusPremium + ); + + emit FlashLoan( + params.receiverAddress, + msg.sender, + params.asset, + params.amount, + DataTypes.InterestRateMode.NONE, + params.totalPremium, + params.referralCode + ); + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..cd5b83c6 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol new file mode 100644 index 00000000..473840ea --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/LiquidationLogic.sol new file mode 100644 index 00000000..8f4c35f6 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -0,0 +1,460 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts//IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {PercentageMath} from '../../libraries/math/PercentageMath.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {DataTypes} from '../../libraries/types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {IsolationModeLogic} from './IsolationModeLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; +import {UserConfiguration} from '../../libraries/configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../../libraries/configuration/ReserveConfiguration.sol'; +import {EModeConfiguration} from '../../libraries/configuration/EModeConfiguration.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; + +/** + * @title LiquidationLogic library + * @author Aave + * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations + */ +library LiquidationLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Default percentage of borrower's debt to be repaid in a liquidation. + * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 0.5e4 results in 50.00% + */ + uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; + + /** + * @dev Maximum percentage of borrower's debt to be repaid in a liquidation + * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 1e4 results in 100.00% + */ + uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; + + /** + * @dev This constant represents below which health factor value it is possible to liquidate + * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. + * A value of 0.95e18 results in 0.95 + */ + uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; + + struct LiquidationCallLocalVars { + uint256 userCollateralBalance; + uint256 userTotalDebt; + uint256 actualDebtToLiquidate; + uint256 actualCollateralToLiquidate; + uint256 liquidationBonus; + uint256 healthFactor; + uint256 liquidationProtocolFeeAmount; + IAToken collateralAToken; + DataTypes.ReserveCache debtReserveCache; + } + + /** + * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) + * covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportional amount of the `collateralAsset` plus a bonus to cover market risk + * @dev Emits the `LiquidationCall()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params The additional parameters needed to execute the liquidation function + */ + function executeLiquidationCall( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ExecuteLiquidationCallParams memory params + ) external { + LiquidationCallLocalVars memory vars; + + DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; + DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; + DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; + vars.debtReserveCache = debtReserve.cache(); + debtReserve.updateState(vars.debtReserveCache); + + (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: params.reservesCount, + user: params.user, + oracle: params.priceOracle, + userEModeCategory: params.userEModeCategory + }) + ); + + (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( + vars.debtReserveCache, + params, + vars.healthFactor + ); + + ValidationLogic.validateLiquidationCall( + userConfig, + collateralReserve, + debtReserve, + DataTypes.ValidateLiquidationCallParams({ + debtReserveCache: vars.debtReserveCache, + totalDebt: vars.userTotalDebt, + healthFactor: vars.healthFactor, + priceOracleSentinel: params.priceOracleSentinel + }) + ); + + vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); + if ( + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + collateralReserve.id + ) + ) { + vars.liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; + } else { + vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); + } + + vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); + + ( + vars.actualCollateralToLiquidate, + vars.actualDebtToLiquidate, + vars.liquidationProtocolFeeAmount + ) = _calculateAvailableCollateralToLiquidate( + collateralReserve, + vars.debtReserveCache, + params.collateralAsset, + params.debtAsset, + vars.actualDebtToLiquidate, + vars.userCollateralBalance, + vars.liquidationBonus, + IPriceOracleGetter(params.priceOracle) + ); + + if (vars.userTotalDebt == vars.actualDebtToLiquidate) { + userConfig.setBorrowing(debtReserve.id, false); + } + + // If the collateral being liquidated is equal to the user balance, + // we set the currency as not being used as collateral anymore + if ( + vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == + vars.userCollateralBalance + ) { + userConfig.setUsingAsCollateral(collateralReserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); + } + + _burnDebtTokens(params, vars); + + debtReserve.updateInterestRatesAndVirtualBalance( + vars.debtReserveCache, + params.debtAsset, + vars.actualDebtToLiquidate, + 0 + ); + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + vars.debtReserveCache, + vars.actualDebtToLiquidate + ); + + if (params.receiveAToken) { + _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); + } else { + _burnCollateralATokens(collateralReserve, params, vars); + } + + // Transfer fee to treasury if it is non-zero + if (vars.liquidationProtocolFeeAmount != 0) { + uint256 liquidityIndex = collateralReserve.getNormalizedIncome(); + uint256 scaledDownLiquidationProtocolFee = vars.liquidationProtocolFeeAmount.rayDiv( + liquidityIndex + ); + uint256 scaledDownUserBalance = vars.collateralAToken.scaledBalanceOf(params.user); + // To avoid trying to send more aTokens than available on balance, due to 1 wei imprecision + if (scaledDownLiquidationProtocolFee > scaledDownUserBalance) { + vars.liquidationProtocolFeeAmount = scaledDownUserBalance.rayMul(liquidityIndex); + } + vars.collateralAToken.transferOnLiquidation( + params.user, + vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), + vars.liquidationProtocolFeeAmount + ); + } + + // Transfers the debt asset being repaid to the aToken, where the liquidity is kept + IERC20(params.debtAsset).safeTransferFrom( + msg.sender, + vars.debtReserveCache.aTokenAddress, + vars.actualDebtToLiquidate + ); + + IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.user, + vars.actualDebtToLiquidate + ); + + emit LiquidationCall( + params.collateralAsset, + params.debtAsset, + params.user, + vars.actualDebtToLiquidate, + vars.actualCollateralToLiquidate, + msg.sender, + params.receiveAToken + ); + } + + /** + * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. + * @dev The function also updates the state and the interest rate of the collateral reserve. + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _burnCollateralATokens( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); + collateralReserve.updateState(collateralReserveCache); + collateralReserve.updateInterestRatesAndVirtualBalance( + collateralReserveCache, + params.collateralAsset, + 0, + vars.actualCollateralToLiquidate + ); + + // Burn the equivalent amount of aToken, sending the underlying to the liquidator + vars.collateralAToken.burn( + params.user, + msg.sender, + vars.actualCollateralToLiquidate, + collateralReserveCache.nextLiquidityIndex + ); + } + + /** + * @notice Liquidates the user aTokens by transferring them to the liquidator. + * @dev The function also checks the state of the liquidator and activates the aToken as collateral + * as in standard transfers if the isolation mode constraints are respected. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _liquidateATokens( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); + vars.collateralAToken.transferOnLiquidation( + params.user, + msg.sender, + vars.actualCollateralToLiquidate + ); + + if (liquidatorPreviousATokenBalance == 0) { + DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + liquidatorConfig, + collateralReserve.configuration, + collateralReserve.aTokenAddress + ) + ) { + liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); + } + } + } + + /** + * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. + * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. + * @param params The additional parameters needed to execute the liquidation function + * @param vars the executeLiquidationCall() function local vars + */ + function _burnDebtTokens( + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( + vars.debtReserveCache.variableDebtTokenAddress + ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); + } + + /** + * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor + * and corresponding close factor. + * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR + * @param debtReserveCache The reserve cache data object of the debt reserve + * @param params The additional parameters needed to execute the liquidation function + * @param healthFactor The health factor of the position + * @return The total debt of the user + * @return The actual debt to liquidate as a function of the closeFactor + */ + function _calculateDebt( + DataTypes.ReserveCache memory debtReserveCache, + DataTypes.ExecuteLiquidationCallParams memory params, + uint256 healthFactor + ) internal view returns (uint256, uint256) { + uint256 userVariableDebt = IERC20(debtReserveCache.variableDebtTokenAddress).balanceOf( + params.user + ); + + uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD + ? DEFAULT_LIQUIDATION_CLOSE_FACTOR + : MAX_LIQUIDATION_CLOSE_FACTOR; + + uint256 maxLiquidatableDebt = userVariableDebt.percentMul(closeFactor); + + uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt + ? maxLiquidatableDebt + : params.debtToCover; + + return (userVariableDebt, actualDebtToLiquidate); + } + + struct AvailableCollateralToLiquidateLocalVars { + uint256 collateralPrice; + uint256 debtAssetPrice; + uint256 maxCollateralToLiquidate; + uint256 baseCollateral; + uint256 bonusCollateral; + uint256 debtAssetDecimals; + uint256 collateralDecimals; + uint256 collateralAssetUnit; + uint256 debtAssetUnit; + uint256 collateralAmount; + uint256 debtAmountNeeded; + uint256 liquidationProtocolFeePercentage; + uint256 liquidationProtocolFee; + } + + /** + * @notice Calculates how much of a specific collateral can be liquidated, given + * a certain amount of debt asset. + * @dev This function needs to be called after all the checks to validate the liquidation have been performed, + * otherwise it might fail. + * @param collateralReserve The data of the collateral reserve + * @param debtReserveCache The cached data of the debt reserve + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated + * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation + * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) + * @return The amount to repay with the liquidation + * @return The fee taken from the liquidation bonus amount to be paid to the protocol + */ + function _calculateAvailableCollateralToLiquidate( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveCache memory debtReserveCache, + address collateralAsset, + address debtAsset, + uint256 debtToCover, + uint256 userCollateralBalance, + uint256 liquidationBonus, + IPriceOracleGetter oracle + ) internal view returns (uint256, uint256, uint256) { + AvailableCollateralToLiquidateLocalVars memory vars; + + vars.collateralPrice = oracle.getAssetPrice(collateralAsset); + vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); + + vars.collateralDecimals = collateralReserve.configuration.getDecimals(); + vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); + + unchecked { + vars.collateralAssetUnit = 10 ** vars.collateralDecimals; + vars.debtAssetUnit = 10 ** vars.debtAssetDecimals; + } + + vars.liquidationProtocolFeePercentage = collateralReserve + .configuration + .getLiquidationProtocolFee(); + + // This is the base collateral to liquidate based on the given debt to cover + vars.baseCollateral = + ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / + (vars.collateralPrice * vars.debtAssetUnit); + + vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); + + if (vars.maxCollateralToLiquidate > userCollateralBalance) { + vars.collateralAmount = userCollateralBalance; + vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / + (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); + } else { + vars.collateralAmount = vars.maxCollateralToLiquidate; + vars.debtAmountNeeded = debtToCover; + } + + if (vars.liquidationProtocolFeePercentage != 0) { + vars.bonusCollateral = + vars.collateralAmount - + vars.collateralAmount.percentDiv(liquidationBonus); + + vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( + vars.liquidationProtocolFeePercentage + ); + + return ( + vars.collateralAmount - vars.liquidationProtocolFee, + vars.debtAmountNeeded, + vars.liquidationProtocolFee + ); + } else { + return (vars.collateralAmount, vars.debtAmountNeeded, 0); + } + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/PoolLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/PoolLogic.sol new file mode 100644 index 00000000..1558fe55 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/PoolLogic.sol @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; + +/** + * @title PoolLogic library + * @author Aave + * @notice Implements the logic for Pool specific functions + */ +library PoolLogic { + using GPv2SafeERC20 for IERC20; + using WadRayMath for uint256; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice Initialize an asset reserve and add the reserve to the list of reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param params Additional parameters needed for initiation + * @return true if appended, false if inserted at existing empty spot + */ + function executeInitReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.InitReserveParams memory params + ) external returns (bool) { + require(Address.isContract(params.asset), Errors.NOT_CONTRACT); + reservesData[params.asset].init( + params.aTokenAddress, + params.variableDebtAddress, + params.interestRateStrategyAddress + ); + + bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || + reservesList[0] == params.asset; + require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); + + for (uint16 i = 0; i < params.reservesCount; i++) { + if (reservesList[i] == address(0)) { + reservesData[params.asset].id = i; + reservesList[i] = params.asset; + return false; + } + } + + require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); + reservesData[params.asset].id = params.reservesCount; + reservesList[params.reservesCount] = params.asset; + return true; + } + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function executeRescueTokens(address token, address to, uint256 amount) external { + IERC20(token).safeTransfer(to, amount); + } + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param reservesData The state of all the reserves + * @param assets The list of reserves for which the minting needs to be executed + */ + function executeMintToTreasury( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] calldata assets + ) external { + for (uint256 i = 0; i < assets.length; i++) { + address assetAddress = assets[i]; + + DataTypes.ReserveData storage reserve = reservesData[assetAddress]; + + // this cover both inactive reserves and invalid reserves since the flag will be 0 for both + if (!reserve.configuration.getActive()) { + continue; + } + + uint256 accruedToTreasury = reserve.accruedToTreasury; + + if (accruedToTreasury != 0) { + reserve.accruedToTreasury = 0; + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); + IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); + + emit MintedToTreasury(assetAddress, amountToMint); + } + } + } + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function executeResetIsolationModeTotalDebt( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset + ) external { + require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); + reservesData[asset].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(asset, 0); + } + + /** + * @notice Sets the liquidation grace period of the asset + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + */ + function executeSetLiquidationGracePeriod( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset, + uint40 until + ) external { + reservesData[asset].liquidationGracePeriodUntil = until; + } + + /** + * @notice Drop a reserve + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param asset The address of the underlying asset of the reserve + */ + function executeDropReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + address asset + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + ValidationLogic.validateDropReserve(reservesList, reserve, asset); + reservesList[reservesData[asset].id] = address(0); + delete reservesData[asset]; + } + + /** + * @notice Returns the user account data across all the reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the calculation + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function executeGetUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ) + { + ( + totalCollateralBase, + totalDebtBase, + ltv, + currentLiquidationThreshold, + healthFactor, + + ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); + + availableBorrowsBase = GenericLogic.calculateAvailableBorrows( + totalCollateralBase, + totalDebtBase, + ltv + ); + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..dd5c637d --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/SupplyLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/SupplyLogic.sol new file mode 100644 index 00000000..727886e7 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/SupplyLogic.sol @@ -0,0 +1,300 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; + +/** + * @title SupplyLogic library + * @author Aave + * @notice Implements the base logic for supply/withdraw + */ +library SupplyLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. + * @dev Emits the `Supply()` event. + * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as + * collateral. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the supply function + */ + function executeSupply( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSupplyParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, reserve, params.amount, params.onBehalfOf); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, params.amount, 0); + + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + params.onBehalfOf, + params.amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration, + reserveCache.aTokenAddress + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); + } + } + + emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); + } + + /** + * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset + * previously supplied in the Aave protocol. + * @dev Emits the `Withdraw()` event. + * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the withdraw function + * @return The actual amount withdrawn + */ + function executeWithdraw( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteWithdrawParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + require(params.to != reserveCache.aTokenAddress, Errors.WITHDRAW_TO_ATOKEN); + + reserve.updateState(reserveCache); + + uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( + reserveCache.nextLiquidityIndex + ); + + uint256 amountToWithdraw = params.amount; + + if (params.amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + + ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, amountToWithdraw); + + bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); + + if (isCollateral && amountToWithdraw == userBalance) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + params.to, + amountToWithdraw, + reserveCache.nextLiquidityIndex + ); + + if (isCollateral && userConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + params.asset, + msg.sender, + params.reservesCount, + params.oracle, + params.userEModeCategory + ); + } + + emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); + + return amountToWithdraw; + } + + /** + * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid + * collateralization constraints violation. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as + * collateral. + * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param params The additional parameters needed to execute the finalizeTransfer function + */ + function executeFinalizeTransfer( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.FinalizeTransferParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + + ValidationLogic.validateTransfer(reserve); + + uint256 reserveId = reserve.id; + uint256 scaledAmount = params.amount.rayDiv(reserve.getNormalizedIncome()); + + if (params.from != params.to && scaledAmount != 0) { + DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; + + if (fromConfig.isUsingAsCollateral(reserveId)) { + if (fromConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + usersConfig[params.from], + params.asset, + params.from, + params.reservesCount, + params.oracle, + params.fromEModeCategory + ); + } + if (params.balanceFromBefore == params.amount) { + fromConfig.setUsingAsCollateral(reserveId, false); + emit ReserveUsedAsCollateralDisabled(params.asset, params.from); + } + } + + if (params.balanceToBefore == 0) { + DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + toConfig, + reserve.configuration, + reserve.aTokenAddress + ) + ) { + toConfig.setUsingAsCollateral(reserveId, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.to); + } + } + } + } + + /** + * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as + * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor + * checks to ensure collateralization. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. + * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The users configuration mapping that track the supplied/borrowed assets + * @param asset The address of the asset being configured as collateral + * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise + * @param reservesCount The number of initialized reserves + * @param priceOracle The address of the price oracle + * @param userEModeCategory The eMode category chosen by the user + */ + function executeUseReserveAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + bool useAsCollateral, + uint256 reservesCount, + address priceOracle, + uint8 userEModeCategory + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); + + ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); + + if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; + + if (useAsCollateral) { + require( + ValidationLogic.validateUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration + ), + Errors.USER_IN_ISOLATION_MODE_OR_LTV_ZERO + ); + + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, msg.sender); + } else { + userConfig.setUsingAsCollateral(reserve.id, false); + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + asset, + msg.sender, + reservesCount, + priceOracle, + userEModeCategory + ); + + emit ReserveUsedAsCollateralDisabled(asset, msg.sender); + } + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..e08a30e8 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,642 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..9adca939 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/L2Pool.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/L2Pool.sol new file mode 100644 index 00000000..d8925717 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/L2Pool.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {Pool} from './Pool.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {IL2Pool} from '../../interfaces/IL2Pool.sol'; +import {CalldataLogic} from '../libraries/logic/CalldataLogic.sol'; + +/** + * @title L2Pool + * @author Aave + * @notice Calldata optimized extension of the Pool contract allowing users to pass compact calldata representation + * to reduce transaction costs on rollups. + */ +abstract contract L2Pool is Pool, IL2Pool { + /// @inheritdoc IL2Pool + function supply(bytes32 args) external override { + (address asset, uint256 amount, uint16 referralCode) = CalldataLogic.decodeSupplyParams( + _reservesList, + args + ); + + supply(asset, amount, msg.sender, referralCode); + } + + /// @inheritdoc IL2Pool + function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s) external override { + (address asset, uint256 amount, uint16 referralCode, uint256 deadline, uint8 v) = CalldataLogic + .decodeSupplyWithPermitParams(_reservesList, args); + + supplyWithPermit(asset, amount, msg.sender, referralCode, deadline, v, r, s); + } + + /// @inheritdoc IL2Pool + function withdraw(bytes32 args) external override returns (uint256) { + (address asset, uint256 amount) = CalldataLogic.decodeWithdrawParams(_reservesList, args); + + return withdraw(asset, amount, msg.sender); + } + + /// @inheritdoc IL2Pool + function borrow(bytes32 args) external override { + (address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode) = CalldataLogic + .decodeBorrowParams(_reservesList, args); + + borrow(asset, amount, interestRateMode, referralCode, msg.sender); + } + + /// @inheritdoc IL2Pool + function repay(bytes32 args) external override returns (uint256) { + (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( + _reservesList, + args + ); + + return repay(asset, amount, interestRateMode, msg.sender); + } + + /// @inheritdoc IL2Pool + function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) external override returns (uint256) { + ( + address asset, + uint256 amount, + uint256 interestRateMode, + uint256 deadline, + uint8 v + ) = CalldataLogic.decodeRepayWithPermitParams(_reservesList, args); + + return repayWithPermit(asset, amount, interestRateMode, msg.sender, deadline, v, r, s); + } + + /// @inheritdoc IL2Pool + function repayWithATokens(bytes32 args) external override returns (uint256) { + (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( + _reservesList, + args + ); + + return repayWithATokens(asset, amount, interestRateMode); + } + + /// @inheritdoc IL2Pool + function setUserUseReserveAsCollateral(bytes32 args) external override { + (address asset, bool useAsCollateral) = CalldataLogic.decodeSetUserUseReserveAsCollateralParams( + _reservesList, + args + ); + setUserUseReserveAsCollateral(asset, useAsCollateral); + } + + /// @inheritdoc IL2Pool + function liquidationCall(bytes32 args1, bytes32 args2) external override { + ( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) = CalldataLogic.decodeLiquidationCallParams(_reservesList, args1, args2); + liquidationCall(collateralAsset, debtAsset, user, debtToCover, receiveAToken); + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/Pool.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/Pool.sol new file mode 100644 index 00000000..9629c6a3 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/Pool.sol @@ -0,0 +1,871 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {VersionedInitializable} from '../../misc/aave-upgradeability/VersionedInitializable.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; +import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; +import {PoolLogic} from '../libraries/logic/PoolLogic.sol'; +import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; +import {EModeLogic} from '../libraries/logic/EModeLogic.sol'; +import {SupplyLogic} from '../libraries/logic/SupplyLogic.sol'; +import {FlashLoanLogic} from '../libraries/logic/FlashLoanLogic.sol'; +import {BorrowLogic} from '../libraries/logic/BorrowLogic.sol'; +import {LiquidationLogic} from '../libraries/logic/LiquidationLogic.sol'; +import {DataTypes} from '../libraries/types/DataTypes.sol'; +import {BridgeLogic} from '../libraries/logic/BridgeLogic.sol'; +import {IERC20WithPermit} from '../../interfaces/IERC20WithPermit.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../interfaces/IPool.sol'; +import {IACLManager} from '../../interfaces/IACLManager.sol'; +import {PoolStorage} from './PoolStorage.sol'; + +/** + * @title Pool contract + * @author Aave + * @notice Main point of interaction with an Aave protocol's market + * - Users can: + * # Supply + * # Withdraw + * # Borrow + * # Repay + * # Enable/disable their supplied assets as collateral + * # Liquidate positions + * # Execute Flash Loans + * @dev To be covered by a proxy contract, owned by the PoolAddressesProvider of the specific market + * @dev All admin functions are callable by the PoolConfigurator contract defined also in the + * PoolAddressesProvider + */ +abstract contract Pool is VersionedInitializable, PoolStorage, IPool { + using ReserveLogic for DataTypes.ReserveData; + + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @dev Only pool configurator can call functions marked by this modifier. + */ + modifier onlyPoolConfigurator() { + _onlyPoolConfigurator(); + _; + } + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + _onlyPoolAdmin(); + _; + } + + /** + * @dev Only bridge can call functions marked by this modifier. + */ + modifier onlyBridge() { + _onlyBridge(); + _; + } + + function _onlyPoolConfigurator() internal view virtual { + require( + ADDRESSES_PROVIDER.getPoolConfigurator() == msg.sender, + Errors.CALLER_NOT_POOL_CONFIGURATOR + ); + } + + function _onlyPoolAdmin() internal view virtual { + require( + IACLManager(ADDRESSES_PROVIDER.getACLManager()).isPoolAdmin(msg.sender), + Errors.CALLER_NOT_POOL_ADMIN + ); + } + + function _onlyBridge() internal view virtual { + require( + IACLManager(ADDRESSES_PROVIDER.getACLManager()).isBridge(msg.sender), + Errors.CALLER_NOT_BRIDGE + ); + } + + /** + * @dev Constructor. + * @param provider The address of the PoolAddressesProvider contract + */ + constructor(IPoolAddressesProvider provider) { + ADDRESSES_PROVIDER = provider; + } + + /** + * @notice Initializes the Pool. + * @dev Function is invoked by the proxy contract when the Pool contract is added to the + * PoolAddressesProvider of the market. + * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations + * @param provider The address of the PoolAddressesProvider + */ + function initialize(IPoolAddressesProvider provider) external virtual; + + /// @inheritdoc IPool + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external virtual override onlyBridge { + BridgeLogic.executeMintUnbacked( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + asset, + amount, + onBehalfOf, + referralCode + ); + } + + /// @inheritdoc IPool + function backUnbacked( + address asset, + uint256 amount, + uint256 fee + ) external virtual override onlyBridge returns (uint256) { + return + BridgeLogic.executeBackUnbacked(_reserves[asset], asset, amount, fee, _bridgeProtocolFee); + } + + /// @inheritdoc IPool + function supply( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) public virtual override { + SupplyLogic.executeSupply( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteSupplyParams({ + asset: asset, + amount: amount, + onBehalfOf: onBehalfOf, + referralCode: referralCode + }) + ); + } + + /// @inheritdoc IPool + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) public virtual override { + try + IERC20WithPermit(asset).permit( + msg.sender, + address(this), + amount, + deadline, + permitV, + permitR, + permitS + ) + {} catch {} + SupplyLogic.executeSupply( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteSupplyParams({ + asset: asset, + amount: amount, + onBehalfOf: onBehalfOf, + referralCode: referralCode + }) + ); + } + + /// @inheritdoc IPool + function withdraw( + address asset, + uint256 amount, + address to + ) public virtual override returns (uint256) { + return + SupplyLogic.executeWithdraw( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[msg.sender], + DataTypes.ExecuteWithdrawParams({ + asset: asset, + amount: amount, + to: to, + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[msg.sender] + }) + ); + } + + /// @inheritdoc IPool + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) public virtual override { + BorrowLogic.executeBorrow( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[onBehalfOf], + DataTypes.ExecuteBorrowParams({ + asset: asset, + user: msg.sender, + onBehalfOf: onBehalfOf, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + referralCode: referralCode, + releaseUnderlying: true, + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[onBehalfOf], + priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() + }) + ); + } + + /// @inheritdoc IPool + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) public virtual override returns (uint256) { + return + BorrowLogic.executeRepay( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteRepayParams({ + asset: asset, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + onBehalfOf: onBehalfOf, + useATokens: false + }) + ); + } + + /// @inheritdoc IPool + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) public virtual override returns (uint256) { + try + IERC20WithPermit(asset).permit( + msg.sender, + address(this), + amount, + deadline, + permitV, + permitR, + permitS + ) + {} catch {} + + { + DataTypes.ExecuteRepayParams memory params = DataTypes.ExecuteRepayParams({ + asset: asset, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + onBehalfOf: onBehalfOf, + useATokens: false + }); + return BorrowLogic.executeRepay(_reserves, _reservesList, _usersConfig[onBehalfOf], params); + } + } + + /// @inheritdoc IPool + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) public virtual override returns (uint256) { + return + BorrowLogic.executeRepay( + _reserves, + _reservesList, + _usersConfig[msg.sender], + DataTypes.ExecuteRepayParams({ + asset: asset, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + onBehalfOf: msg.sender, + useATokens: true + }) + ); + } + + /// @inheritdoc IPool + function setUserUseReserveAsCollateral( + address asset, + bool useAsCollateral + ) public virtual override { + SupplyLogic.executeUseReserveAsCollateral( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[msg.sender], + asset, + useAsCollateral, + _reservesCount, + ADDRESSES_PROVIDER.getPriceOracle(), + _usersEModeCategory[msg.sender] + ); + } + + /// @inheritdoc IPool + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) public virtual override { + LiquidationLogic.executeLiquidationCall( + _reserves, + _reservesList, + _usersConfig, + _eModeCategories, + DataTypes.ExecuteLiquidationCallParams({ + reservesCount: _reservesCount, + debtToCover: debtToCover, + collateralAsset: collateralAsset, + debtAsset: debtAsset, + user: user, + receiveAToken: receiveAToken, + priceOracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[user], + priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() + }) + ); + } + + /// @inheritdoc IPool + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) public virtual override { + DataTypes.FlashloanParams memory flashParams = DataTypes.FlashloanParams({ + receiverAddress: receiverAddress, + assets: assets, + amounts: amounts, + interestRateModes: interestRateModes, + onBehalfOf: onBehalfOf, + params: params, + referralCode: referralCode, + flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, + flashLoanPremiumTotal: _flashLoanPremiumTotal, + reservesCount: _reservesCount, + addressesProvider: address(ADDRESSES_PROVIDER), + pool: address(this), + userEModeCategory: _usersEModeCategory[onBehalfOf], + isAuthorizedFlashBorrower: IACLManager(ADDRESSES_PROVIDER.getACLManager()).isFlashBorrower( + msg.sender + ) + }); + + FlashLoanLogic.executeFlashLoan( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[onBehalfOf], + flashParams + ); + } + + /// @inheritdoc IPool + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) public virtual override { + DataTypes.FlashloanSimpleParams memory flashParams = DataTypes.FlashloanSimpleParams({ + receiverAddress: receiverAddress, + asset: asset, + amount: amount, + params: params, + referralCode: referralCode, + flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, + flashLoanPremiumTotal: _flashLoanPremiumTotal + }); + FlashLoanLogic.executeFlashLoanSimple(_reserves[asset], flashParams); + } + + /// @inheritdoc IPool + function mintToTreasury(address[] calldata assets) external virtual override { + PoolLogic.executeMintToTreasury(_reserves, assets); + } + + /// @inheritdoc IPool + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory) { + return _reserves[asset]; + } + + /// @inheritdoc IPool + function getReserveData( + address asset + ) external view virtual override returns (DataTypes.ReserveDataLegacy memory) { + DataTypes.ReserveData memory reserve = _reserves[asset]; + DataTypes.ReserveDataLegacy memory res; + + res.configuration = reserve.configuration; + res.liquidityIndex = reserve.liquidityIndex; + res.currentLiquidityRate = reserve.currentLiquidityRate; + res.variableBorrowIndex = reserve.variableBorrowIndex; + res.currentVariableBorrowRate = reserve.currentVariableBorrowRate; + res.lastUpdateTimestamp = reserve.lastUpdateTimestamp; + res.id = reserve.id; + res.aTokenAddress = reserve.aTokenAddress; + res.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + res.interestRateStrategyAddress = reserve.interestRateStrategyAddress; + res.accruedToTreasury = reserve.accruedToTreasury; + res.unbacked = reserve.unbacked; + res.isolationModeTotalDebt = reserve.isolationModeTotalDebt; + // This is a temporary workaround for integrations that are broken by Aave 3.2 + // While the new pool data provider is backward compatible, some integrations hard-code an old implementation + // To allow them to unlock the funds, the pool address provider is setting a stable debt token, so balanceOf() and totalSupply() will return zero instead of reverting + res.stableDebtTokenAddress = ADDRESSES_PROVIDER.getAddress(bytes32('MOCK_STABLE_DEBT')); + return res; + } + + /// @inheritdoc IPool + function getVirtualUnderlyingBalance( + address asset + ) external view virtual override returns (uint128) { + return _reserves[asset].virtualUnderlyingBalance; + } + + /// @inheritdoc IPool + function getUserAccountData( + address user + ) + external + view + virtual + override + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ) + { + return + PoolLogic.executeGetUserAccountData( + _reserves, + _reservesList, + _eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: _usersConfig[user], + reservesCount: _reservesCount, + user: user, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[user] + }) + ); + } + + /// @inheritdoc IPool + function getConfiguration( + address asset + ) external view virtual override returns (DataTypes.ReserveConfigurationMap memory) { + return _reserves[asset].configuration; + } + + /// @inheritdoc IPool + function getUserConfiguration( + address user + ) external view virtual override returns (DataTypes.UserConfigurationMap memory) { + return _usersConfig[user]; + } + + /// @inheritdoc IPool + function getReserveNormalizedIncome( + address asset + ) external view virtual override returns (uint256) { + return _reserves[asset].getNormalizedIncome(); + } + + /// @inheritdoc IPool + function getReserveNormalizedVariableDebt( + address asset + ) external view virtual override returns (uint256) { + return _reserves[asset].getNormalizedDebt(); + } + + /// @inheritdoc IPool + function getReservesList() external view virtual override returns (address[] memory) { + uint256 reservesListCount = _reservesCount; + uint256 droppedReservesCount = 0; + address[] memory reservesList = new address[](reservesListCount); + + for (uint256 i = 0; i < reservesListCount; i++) { + if (_reservesList[i] != address(0)) { + reservesList[i - droppedReservesCount] = _reservesList[i]; + } else { + droppedReservesCount++; + } + } + + // Reduces the length of the reserves array by `droppedReservesCount` + assembly { + mstore(reservesList, sub(reservesListCount, droppedReservesCount)) + } + return reservesList; + } + + /// @inheritdoc IPool + function getReservesCount() external view virtual override returns (uint256) { + return _reservesCount; + } + + /// @inheritdoc IPool + function getReserveAddressById(uint16 id) external view returns (address) { + return _reservesList[id]; + } + + /// @inheritdoc IPool + function BRIDGE_PROTOCOL_FEE() public view virtual override returns (uint256) { + return _bridgeProtocolFee; + } + + /// @inheritdoc IPool + function FLASHLOAN_PREMIUM_TOTAL() public view virtual override returns (uint128) { + return _flashLoanPremiumTotal; + } + + /// @inheritdoc IPool + function FLASHLOAN_PREMIUM_TO_PROTOCOL() public view virtual override returns (uint128) { + return _flashLoanPremiumToProtocol; + } + + /// @inheritdoc IPool + function MAX_NUMBER_RESERVES() public view virtual override returns (uint16) { + return ReserveConfiguration.MAX_RESERVES_COUNT; + } + + /// @inheritdoc IPool + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external virtual override { + require(msg.sender == _reserves[asset].aTokenAddress, Errors.CALLER_NOT_ATOKEN); + SupplyLogic.executeFinalizeTransfer( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig, + DataTypes.FinalizeTransferParams({ + asset: asset, + from: from, + to: to, + amount: amount, + balanceFromBefore: balanceFromBefore, + balanceToBefore: balanceToBefore, + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + fromEModeCategory: _usersEModeCategory[from] + }) + ); + } + + /// @inheritdoc IPool + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external virtual override onlyPoolConfigurator { + if ( + PoolLogic.executeInitReserve( + _reserves, + _reservesList, + DataTypes.InitReserveParams({ + asset: asset, + aTokenAddress: aTokenAddress, + variableDebtAddress: variableDebtAddress, + interestRateStrategyAddress: interestRateStrategyAddress, + reservesCount: _reservesCount, + maxNumberReserves: MAX_NUMBER_RESERVES() + }) + ) + ) { + _reservesCount++; + } + } + + /// @inheritdoc IPool + function dropReserve(address asset) external virtual override onlyPoolConfigurator { + PoolLogic.executeDropReserve(_reserves, _reservesList, asset); + } + + /// @inheritdoc IPool + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external virtual override onlyPoolConfigurator { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + + _reserves[asset].interestRateStrategyAddress = rateStrategyAddress; + } + + /// @inheritdoc IPool + function syncIndexesState(address asset) external virtual override onlyPoolConfigurator { + DataTypes.ReserveData storage reserve = _reserves[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + } + + /// @inheritdoc IPool + function syncRatesState(address asset) external virtual override onlyPoolConfigurator { + DataTypes.ReserveData storage reserve = _reserves[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + ReserveLogic.updateInterestRatesAndVirtualBalance(reserve, reserveCache, asset, 0, 0); + } + + /// @inheritdoc IPool + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external virtual override onlyPoolConfigurator { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + _reserves[asset].configuration = configuration; + } + + /// @inheritdoc IPool + function updateBridgeProtocolFee( + uint256 protocolFee + ) external virtual override onlyPoolConfigurator { + _bridgeProtocolFee = protocolFee; + } + + /// @inheritdoc IPool + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external virtual override onlyPoolConfigurator { + _flashLoanPremiumTotal = flashLoanPremiumTotal; + _flashLoanPremiumToProtocol = flashLoanPremiumToProtocol; + } + + /// @inheritdoc IPool + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory category + ) external virtual override onlyPoolConfigurator { + // category 0 is reserved for volatile heterogeneous assets and it's always disabled + require(id != 0, Errors.EMODE_CATEGORY_RESERVED); + _eModeCategories[id].ltv = category.ltv; + _eModeCategories[id].liquidationThreshold = category.liquidationThreshold; + _eModeCategories[id].liquidationBonus = category.liquidationBonus; + _eModeCategories[id].label = category.label; + } + + /// @inheritdoc IPool + function configureEModeCategoryCollateralBitmap( + uint8 id, + uint128 collateralBitmap + ) external virtual override onlyPoolConfigurator { + // category 0 is reserved for volatile heterogeneous assets and it's always disabled + require(id != 0, Errors.EMODE_CATEGORY_RESERVED); + _eModeCategories[id].collateralBitmap = collateralBitmap; + } + + /// @inheritdoc IPool + function configureEModeCategoryBorrowableBitmap( + uint8 id, + uint128 borrowableBitmap + ) external virtual override onlyPoolConfigurator { + // category 0 is reserved for volatile heterogeneous assets and it's always disabled + require(id != 0, Errors.EMODE_CATEGORY_RESERVED); + _eModeCategories[id].borrowableBitmap = borrowableBitmap; + } + + /// @inheritdoc IPool + function getEModeCategoryData( + uint8 id + ) external view virtual override returns (DataTypes.EModeCategoryLegacy memory) { + DataTypes.EModeCategory memory category = _eModeCategories[id]; + return + DataTypes.EModeCategoryLegacy({ + ltv: category.ltv, + liquidationThreshold: category.liquidationThreshold, + liquidationBonus: category.liquidationBonus, + priceSource: address(0), + label: category.label + }); + } + + /// @inheritdoc IPool + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory) { + return + DataTypes.CollateralConfig({ + ltv: _eModeCategories[id].ltv, + liquidationThreshold: _eModeCategories[id].liquidationThreshold, + liquidationBonus: _eModeCategories[id].liquidationBonus + }); + } + + /// @inheritdoc IPool + function getEModeCategoryLabel(uint8 id) external view returns (string memory) { + return _eModeCategories[id].label; + } + + /// @inheritdoc IPool + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128) { + return _eModeCategories[id].collateralBitmap; + } + + /// @inheritdoc IPool + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128) { + return _eModeCategories[id].borrowableBitmap; + } + + /// @inheritdoc IPool + function setUserEMode(uint8 categoryId) external virtual override { + EModeLogic.executeSetUserEMode( + _reserves, + _reservesList, + _eModeCategories, + _usersEModeCategory, + _usersConfig[msg.sender], + DataTypes.ExecuteSetUserEModeParams({ + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + categoryId: categoryId + }) + ); + } + + /// @inheritdoc IPool + function getUserEMode(address user) external view virtual override returns (uint256) { + return _usersEModeCategory[user]; + } + + /// @inheritdoc IPool + function resetIsolationModeTotalDebt( + address asset + ) external virtual override onlyPoolConfigurator { + PoolLogic.executeResetIsolationModeTotalDebt(_reserves, asset); + } + + /// @inheritdoc IPool + function getLiquidationGracePeriod(address asset) external virtual override returns (uint40) { + return _reserves[asset].liquidationGracePeriodUntil; + } + + /// @inheritdoc IPool + function setLiquidationGracePeriod( + address asset, + uint40 until + ) external virtual override onlyPoolConfigurator { + require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + PoolLogic.executeSetLiquidationGracePeriod(_reserves, asset, until); + } + + /// @inheritdoc IPool + function rescueTokens( + address token, + address to, + uint256 amount + ) external virtual override onlyPoolAdmin { + PoolLogic.executeRescueTokens(token, to, amount); + } + + /// @inheritdoc IPool + /// @dev Deprecated: maintained for compatibility purposes + function deposit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external virtual override { + SupplyLogic.executeSupply( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteSupplyParams({ + asset: asset, + amount: amount, + onBehalfOf: onBehalfOf, + referralCode: referralCode + }) + ); + } + + /// @inheritdoc IPool + function getFlashLoanLogic() external pure returns (address) { + return address(FlashLoanLogic); + } + + /// @inheritdoc IPool + function getBorrowLogic() external pure returns (address) { + return address(BorrowLogic); + } + + /// @inheritdoc IPool + function getBridgeLogic() external pure returns (address) { + return address(BridgeLogic); + } + + /// @inheritdoc IPool + function getEModeLogic() external pure returns (address) { + return address(EModeLogic); + } + + /// @inheritdoc IPool + function getLiquidationLogic() external pure returns (address) { + return address(LiquidationLogic); + } + + /// @inheritdoc IPool + function getPoolLogic() external pure returns (address) { + return address(PoolLogic); + } + + /// @inheritdoc IPool + function getSupplyLogic() external pure returns (address) { + return address(SupplyLogic); + } +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/PoolStorage.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/PoolStorage.sol new file mode 100644 index 00000000..719461e4 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/PoolStorage.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {UserConfiguration} from '../libraries/configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; +import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; +import {DataTypes} from '../libraries/types/DataTypes.sol'; + +/** + * @title PoolStorage + * @author Aave + * @notice Contract used as storage of the Pool contract. + * @dev It defines the storage layout of the Pool contract. + */ +contract PoolStorage { + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + // Map of reserves and their data (underlyingAssetOfReserve => reserveData) + mapping(address => DataTypes.ReserveData) internal _reserves; + + // Map of users address and their configuration data (userAddress => userConfiguration) + mapping(address => DataTypes.UserConfigurationMap) internal _usersConfig; + + // List of reserves as a map (reserveId => reserve). + // It is structured as a mapping for gas savings reasons, using the reserve id as index + mapping(uint256 => address) internal _reservesList; + + // List of eMode categories as a map (eModeCategoryId => eModeCategory). + // It is structured as a mapping for gas savings reasons, using the eModeCategoryId as index + mapping(uint8 => DataTypes.EModeCategory) internal _eModeCategories; + + // Map of users address and their eMode category (userAddress => eModeCategoryId) + mapping(address => uint8) internal _usersEModeCategory; + + // Fee of the protocol bridge, expressed in bps + uint256 internal _bridgeProtocolFee; + + // Total FlashLoan Premium, expressed in bps + uint128 internal _flashLoanPremiumTotal; + + // FlashLoan premium paid to protocol treasury, expressed in bps + uint128 internal _flashLoanPremiumToProtocol; + + // DEPRECATED on v3.2.0 + uint64 internal __DEPRECATED_maxStableRateBorrowSizePercent; + + // Maximum number of active reserves there have been in the protocol. It is the upper bound of the reserves list + uint16 internal _reservesCount; +} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC.sol new file mode 100644 index 00000000..7169fb30 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC.sol @@ -0,0 +1,6036 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} + +// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol + +/** + * @title LiquidationLogic library + * @author Aave + * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations + */ +library LiquidationLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Default percentage of borrower's debt to be repaid in a liquidation. + * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 0.5e4 results in 50.00% + */ + uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; + + /** + * @dev Maximum percentage of borrower's debt to be repaid in a liquidation + * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 1e4 results in 100.00% + */ + uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; + + /** + * @dev This constant represents below which health factor value it is possible to liquidate + * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. + * A value of 0.95e18 results in 0.95 + */ + uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; + + struct LiquidationCallLocalVars { + uint256 userCollateralBalance; + uint256 userTotalDebt; + uint256 actualDebtToLiquidate; + uint256 actualCollateralToLiquidate; + uint256 liquidationBonus; + uint256 healthFactor; + uint256 liquidationProtocolFeeAmount; + IAToken collateralAToken; + DataTypes.ReserveCache debtReserveCache; + } + + /** + * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) + * covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportional amount of the `collateralAsset` plus a bonus to cover market risk + * @dev Emits the `LiquidationCall()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params The additional parameters needed to execute the liquidation function + */ + function executeLiquidationCall( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ExecuteLiquidationCallParams memory params + ) external { + LiquidationCallLocalVars memory vars; + + DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; + DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; + DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; + vars.debtReserveCache = debtReserve.cache(); + debtReserve.updateState(vars.debtReserveCache); + + (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: params.reservesCount, + user: params.user, + oracle: params.priceOracle, + userEModeCategory: params.userEModeCategory + }) + ); + + (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( + vars.debtReserveCache, + params, + vars.healthFactor + ); + + ValidationLogic.validateLiquidationCall( + userConfig, + collateralReserve, + debtReserve, + DataTypes.ValidateLiquidationCallParams({ + debtReserveCache: vars.debtReserveCache, + totalDebt: vars.userTotalDebt, + healthFactor: vars.healthFactor, + priceOracleSentinel: params.priceOracleSentinel + }) + ); + + vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); + if ( + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + collateralReserve.id + ) + ) { + vars.liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; + } else { + vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); + } + + vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); + + ( + vars.actualCollateralToLiquidate, + vars.actualDebtToLiquidate, + vars.liquidationProtocolFeeAmount + ) = _calculateAvailableCollateralToLiquidate( + collateralReserve, + vars.debtReserveCache, + params.collateralAsset, + params.debtAsset, + vars.actualDebtToLiquidate, + vars.userCollateralBalance, + vars.liquidationBonus, + IPriceOracleGetter(params.priceOracle) + ); + + if (vars.userTotalDebt == vars.actualDebtToLiquidate) { + userConfig.setBorrowing(debtReserve.id, false); + } + + // If the collateral being liquidated is equal to the user balance, + // we set the currency as not being used as collateral anymore + if ( + vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == + vars.userCollateralBalance + ) { + userConfig.setUsingAsCollateral(collateralReserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); + } + + _burnDebtTokens(params, vars); + + debtReserve.updateInterestRatesAndVirtualBalance( + vars.debtReserveCache, + params.debtAsset, + vars.actualDebtToLiquidate, + 0 + ); + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + vars.debtReserveCache, + vars.actualDebtToLiquidate + ); + + if (params.receiveAToken) { + _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); + } else { + _burnCollateralATokens(collateralReserve, params, vars); + } + + // Transfer fee to treasury if it is non-zero + if (vars.liquidationProtocolFeeAmount != 0) { + uint256 liquidityIndex = collateralReserve.getNormalizedIncome(); + uint256 scaledDownLiquidationProtocolFee = vars.liquidationProtocolFeeAmount.rayDiv( + liquidityIndex + ); + uint256 scaledDownUserBalance = vars.collateralAToken.scaledBalanceOf(params.user); + // To avoid trying to send more aTokens than available on balance, due to 1 wei imprecision + if (scaledDownLiquidationProtocolFee > scaledDownUserBalance) { + vars.liquidationProtocolFeeAmount = scaledDownUserBalance.rayMul(liquidityIndex); + } + vars.collateralAToken.transferOnLiquidation( + params.user, + vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), + vars.liquidationProtocolFeeAmount + ); + } + + // Transfers the debt asset being repaid to the aToken, where the liquidity is kept + IERC20(params.debtAsset).safeTransferFrom( + msg.sender, + vars.debtReserveCache.aTokenAddress, + vars.actualDebtToLiquidate + ); + + IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.user, + vars.actualDebtToLiquidate + ); + + emit LiquidationCall( + params.collateralAsset, + params.debtAsset, + params.user, + vars.actualDebtToLiquidate, + vars.actualCollateralToLiquidate, + msg.sender, + params.receiveAToken + ); + } + + /** + * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. + * @dev The function also updates the state and the interest rate of the collateral reserve. + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _burnCollateralATokens( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); + collateralReserve.updateState(collateralReserveCache); + collateralReserve.updateInterestRatesAndVirtualBalance( + collateralReserveCache, + params.collateralAsset, + 0, + vars.actualCollateralToLiquidate + ); + + // Burn the equivalent amount of aToken, sending the underlying to the liquidator + vars.collateralAToken.burn( + params.user, + msg.sender, + vars.actualCollateralToLiquidate, + collateralReserveCache.nextLiquidityIndex + ); + } + + /** + * @notice Liquidates the user aTokens by transferring them to the liquidator. + * @dev The function also checks the state of the liquidator and activates the aToken as collateral + * as in standard transfers if the isolation mode constraints are respected. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _liquidateATokens( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); + vars.collateralAToken.transferOnLiquidation( + params.user, + msg.sender, + vars.actualCollateralToLiquidate + ); + + if (liquidatorPreviousATokenBalance == 0) { + DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + liquidatorConfig, + collateralReserve.configuration, + collateralReserve.aTokenAddress + ) + ) { + liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); + } + } + } + + /** + * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. + * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. + * @param params The additional parameters needed to execute the liquidation function + * @param vars the executeLiquidationCall() function local vars + */ + function _burnDebtTokens( + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( + vars.debtReserveCache.variableDebtTokenAddress + ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); + } + + /** + * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor + * and corresponding close factor. + * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR + * @param debtReserveCache The reserve cache data object of the debt reserve + * @param params The additional parameters needed to execute the liquidation function + * @param healthFactor The health factor of the position + * @return The total debt of the user + * @return The actual debt to liquidate as a function of the closeFactor + */ + function _calculateDebt( + DataTypes.ReserveCache memory debtReserveCache, + DataTypes.ExecuteLiquidationCallParams memory params, + uint256 healthFactor + ) internal view returns (uint256, uint256) { + uint256 userVariableDebt = IERC20(debtReserveCache.variableDebtTokenAddress).balanceOf( + params.user + ); + + uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD + ? DEFAULT_LIQUIDATION_CLOSE_FACTOR + : MAX_LIQUIDATION_CLOSE_FACTOR; + + uint256 maxLiquidatableDebt = userVariableDebt.percentMul(closeFactor); + + uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt + ? maxLiquidatableDebt + : params.debtToCover; + + return (userVariableDebt, actualDebtToLiquidate); + } + + struct AvailableCollateralToLiquidateLocalVars { + uint256 collateralPrice; + uint256 debtAssetPrice; + uint256 maxCollateralToLiquidate; + uint256 baseCollateral; + uint256 bonusCollateral; + uint256 debtAssetDecimals; + uint256 collateralDecimals; + uint256 collateralAssetUnit; + uint256 debtAssetUnit; + uint256 collateralAmount; + uint256 debtAmountNeeded; + uint256 liquidationProtocolFeePercentage; + uint256 liquidationProtocolFee; + } + + /** + * @notice Calculates how much of a specific collateral can be liquidated, given + * a certain amount of debt asset. + * @dev This function needs to be called after all the checks to validate the liquidation have been performed, + * otherwise it might fail. + * @param collateralReserve The data of the collateral reserve + * @param debtReserveCache The cached data of the debt reserve + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated + * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation + * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) + * @return The amount to repay with the liquidation + * @return The fee taken from the liquidation bonus amount to be paid to the protocol + */ + function _calculateAvailableCollateralToLiquidate( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveCache memory debtReserveCache, + address collateralAsset, + address debtAsset, + uint256 debtToCover, + uint256 userCollateralBalance, + uint256 liquidationBonus, + IPriceOracleGetter oracle + ) internal view returns (uint256, uint256, uint256) { + AvailableCollateralToLiquidateLocalVars memory vars; + + vars.collateralPrice = oracle.getAssetPrice(collateralAsset); + vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); + + vars.collateralDecimals = collateralReserve.configuration.getDecimals(); + vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); + + unchecked { + vars.collateralAssetUnit = 10 ** vars.collateralDecimals; + vars.debtAssetUnit = 10 ** vars.debtAssetDecimals; + } + + vars.liquidationProtocolFeePercentage = collateralReserve + .configuration + .getLiquidationProtocolFee(); + + // This is the base collateral to liquidate based on the given debt to cover + vars.baseCollateral = + ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / + (vars.collateralPrice * vars.debtAssetUnit); + + vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); + + if (vars.maxCollateralToLiquidate > userCollateralBalance) { + vars.collateralAmount = userCollateralBalance; + vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / + (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); + } else { + vars.collateralAmount = vars.maxCollateralToLiquidate; + vars.debtAmountNeeded = debtToCover; + } + + if (vars.liquidationProtocolFeePercentage != 0) { + vars.bonusCollateral = + vars.collateralAmount - + vars.collateralAmount.percentDiv(liquidationBonus); + + vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( + vars.liquidationProtocolFeePercentage + ); + + return ( + vars.collateralAmount - vars.liquidationProtocolFee, + vars.debtAmountNeeded, + vars.liquidationProtocolFee + ); + } else { + return (vars.collateralAmount, vars.debtAmountNeeded, 0); + } + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..01e1bcaf --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol @@ -0,0 +1,833 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..e7ba8f7a --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..43987f47 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,583 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..647fc7e7 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..cd5b83c6 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol new file mode 100644 index 00000000..473840ea --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol new file mode 100644 index 00000000..8f4c35f6 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -0,0 +1,460 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts//IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {PercentageMath} from '../../libraries/math/PercentageMath.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {DataTypes} from '../../libraries/types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {IsolationModeLogic} from './IsolationModeLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; +import {UserConfiguration} from '../../libraries/configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../../libraries/configuration/ReserveConfiguration.sol'; +import {EModeConfiguration} from '../../libraries/configuration/EModeConfiguration.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; + +/** + * @title LiquidationLogic library + * @author Aave + * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations + */ +library LiquidationLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Default percentage of borrower's debt to be repaid in a liquidation. + * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 0.5e4 results in 50.00% + */ + uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; + + /** + * @dev Maximum percentage of borrower's debt to be repaid in a liquidation + * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 1e4 results in 100.00% + */ + uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; + + /** + * @dev This constant represents below which health factor value it is possible to liquidate + * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. + * A value of 0.95e18 results in 0.95 + */ + uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; + + struct LiquidationCallLocalVars { + uint256 userCollateralBalance; + uint256 userTotalDebt; + uint256 actualDebtToLiquidate; + uint256 actualCollateralToLiquidate; + uint256 liquidationBonus; + uint256 healthFactor; + uint256 liquidationProtocolFeeAmount; + IAToken collateralAToken; + DataTypes.ReserveCache debtReserveCache; + } + + /** + * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) + * covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportional amount of the `collateralAsset` plus a bonus to cover market risk + * @dev Emits the `LiquidationCall()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params The additional parameters needed to execute the liquidation function + */ + function executeLiquidationCall( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ExecuteLiquidationCallParams memory params + ) external { + LiquidationCallLocalVars memory vars; + + DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; + DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; + DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; + vars.debtReserveCache = debtReserve.cache(); + debtReserve.updateState(vars.debtReserveCache); + + (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: params.reservesCount, + user: params.user, + oracle: params.priceOracle, + userEModeCategory: params.userEModeCategory + }) + ); + + (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( + vars.debtReserveCache, + params, + vars.healthFactor + ); + + ValidationLogic.validateLiquidationCall( + userConfig, + collateralReserve, + debtReserve, + DataTypes.ValidateLiquidationCallParams({ + debtReserveCache: vars.debtReserveCache, + totalDebt: vars.userTotalDebt, + healthFactor: vars.healthFactor, + priceOracleSentinel: params.priceOracleSentinel + }) + ); + + vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); + if ( + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + collateralReserve.id + ) + ) { + vars.liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; + } else { + vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); + } + + vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); + + ( + vars.actualCollateralToLiquidate, + vars.actualDebtToLiquidate, + vars.liquidationProtocolFeeAmount + ) = _calculateAvailableCollateralToLiquidate( + collateralReserve, + vars.debtReserveCache, + params.collateralAsset, + params.debtAsset, + vars.actualDebtToLiquidate, + vars.userCollateralBalance, + vars.liquidationBonus, + IPriceOracleGetter(params.priceOracle) + ); + + if (vars.userTotalDebt == vars.actualDebtToLiquidate) { + userConfig.setBorrowing(debtReserve.id, false); + } + + // If the collateral being liquidated is equal to the user balance, + // we set the currency as not being used as collateral anymore + if ( + vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == + vars.userCollateralBalance + ) { + userConfig.setUsingAsCollateral(collateralReserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); + } + + _burnDebtTokens(params, vars); + + debtReserve.updateInterestRatesAndVirtualBalance( + vars.debtReserveCache, + params.debtAsset, + vars.actualDebtToLiquidate, + 0 + ); + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + vars.debtReserveCache, + vars.actualDebtToLiquidate + ); + + if (params.receiveAToken) { + _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); + } else { + _burnCollateralATokens(collateralReserve, params, vars); + } + + // Transfer fee to treasury if it is non-zero + if (vars.liquidationProtocolFeeAmount != 0) { + uint256 liquidityIndex = collateralReserve.getNormalizedIncome(); + uint256 scaledDownLiquidationProtocolFee = vars.liquidationProtocolFeeAmount.rayDiv( + liquidityIndex + ); + uint256 scaledDownUserBalance = vars.collateralAToken.scaledBalanceOf(params.user); + // To avoid trying to send more aTokens than available on balance, due to 1 wei imprecision + if (scaledDownLiquidationProtocolFee > scaledDownUserBalance) { + vars.liquidationProtocolFeeAmount = scaledDownUserBalance.rayMul(liquidityIndex); + } + vars.collateralAToken.transferOnLiquidation( + params.user, + vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), + vars.liquidationProtocolFeeAmount + ); + } + + // Transfers the debt asset being repaid to the aToken, where the liquidity is kept + IERC20(params.debtAsset).safeTransferFrom( + msg.sender, + vars.debtReserveCache.aTokenAddress, + vars.actualDebtToLiquidate + ); + + IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.user, + vars.actualDebtToLiquidate + ); + + emit LiquidationCall( + params.collateralAsset, + params.debtAsset, + params.user, + vars.actualDebtToLiquidate, + vars.actualCollateralToLiquidate, + msg.sender, + params.receiveAToken + ); + } + + /** + * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. + * @dev The function also updates the state and the interest rate of the collateral reserve. + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _burnCollateralATokens( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); + collateralReserve.updateState(collateralReserveCache); + collateralReserve.updateInterestRatesAndVirtualBalance( + collateralReserveCache, + params.collateralAsset, + 0, + vars.actualCollateralToLiquidate + ); + + // Burn the equivalent amount of aToken, sending the underlying to the liquidator + vars.collateralAToken.burn( + params.user, + msg.sender, + vars.actualCollateralToLiquidate, + collateralReserveCache.nextLiquidityIndex + ); + } + + /** + * @notice Liquidates the user aTokens by transferring them to the liquidator. + * @dev The function also checks the state of the liquidator and activates the aToken as collateral + * as in standard transfers if the isolation mode constraints are respected. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _liquidateATokens( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); + vars.collateralAToken.transferOnLiquidation( + params.user, + msg.sender, + vars.actualCollateralToLiquidate + ); + + if (liquidatorPreviousATokenBalance == 0) { + DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + liquidatorConfig, + collateralReserve.configuration, + collateralReserve.aTokenAddress + ) + ) { + liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); + } + } + } + + /** + * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. + * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. + * @param params The additional parameters needed to execute the liquidation function + * @param vars the executeLiquidationCall() function local vars + */ + function _burnDebtTokens( + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( + vars.debtReserveCache.variableDebtTokenAddress + ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); + } + + /** + * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor + * and corresponding close factor. + * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR + * @param debtReserveCache The reserve cache data object of the debt reserve + * @param params The additional parameters needed to execute the liquidation function + * @param healthFactor The health factor of the position + * @return The total debt of the user + * @return The actual debt to liquidate as a function of the closeFactor + */ + function _calculateDebt( + DataTypes.ReserveCache memory debtReserveCache, + DataTypes.ExecuteLiquidationCallParams memory params, + uint256 healthFactor + ) internal view returns (uint256, uint256) { + uint256 userVariableDebt = IERC20(debtReserveCache.variableDebtTokenAddress).balanceOf( + params.user + ); + + uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD + ? DEFAULT_LIQUIDATION_CLOSE_FACTOR + : MAX_LIQUIDATION_CLOSE_FACTOR; + + uint256 maxLiquidatableDebt = userVariableDebt.percentMul(closeFactor); + + uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt + ? maxLiquidatableDebt + : params.debtToCover; + + return (userVariableDebt, actualDebtToLiquidate); + } + + struct AvailableCollateralToLiquidateLocalVars { + uint256 collateralPrice; + uint256 debtAssetPrice; + uint256 maxCollateralToLiquidate; + uint256 baseCollateral; + uint256 bonusCollateral; + uint256 debtAssetDecimals; + uint256 collateralDecimals; + uint256 collateralAssetUnit; + uint256 debtAssetUnit; + uint256 collateralAmount; + uint256 debtAmountNeeded; + uint256 liquidationProtocolFeePercentage; + uint256 liquidationProtocolFee; + } + + /** + * @notice Calculates how much of a specific collateral can be liquidated, given + * a certain amount of debt asset. + * @dev This function needs to be called after all the checks to validate the liquidation have been performed, + * otherwise it might fail. + * @param collateralReserve The data of the collateral reserve + * @param debtReserveCache The cached data of the debt reserve + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated + * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation + * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) + * @return The amount to repay with the liquidation + * @return The fee taken from the liquidation bonus amount to be paid to the protocol + */ + function _calculateAvailableCollateralToLiquidate( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveCache memory debtReserveCache, + address collateralAsset, + address debtAsset, + uint256 debtToCover, + uint256 userCollateralBalance, + uint256 liquidationBonus, + IPriceOracleGetter oracle + ) internal view returns (uint256, uint256, uint256) { + AvailableCollateralToLiquidateLocalVars memory vars; + + vars.collateralPrice = oracle.getAssetPrice(collateralAsset); + vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); + + vars.collateralDecimals = collateralReserve.configuration.getDecimals(); + vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); + + unchecked { + vars.collateralAssetUnit = 10 ** vars.collateralDecimals; + vars.debtAssetUnit = 10 ** vars.debtAssetDecimals; + } + + vars.liquidationProtocolFeePercentage = collateralReserve + .configuration + .getLiquidationProtocolFee(); + + // This is the base collateral to liquidate based on the given debt to cover + vars.baseCollateral = + ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / + (vars.collateralPrice * vars.debtAssetUnit); + + vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); + + if (vars.maxCollateralToLiquidate > userCollateralBalance) { + vars.collateralAmount = userCollateralBalance; + vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / + (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); + } else { + vars.collateralAmount = vars.maxCollateralToLiquidate; + vars.debtAmountNeeded = debtToCover; + } + + if (vars.liquidationProtocolFeePercentage != 0) { + vars.bonusCollateral = + vars.collateralAmount - + vars.collateralAmount.percentDiv(liquidationBonus); + + vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( + vars.liquidationProtocolFeePercentage + ); + + return ( + vars.collateralAmount - vars.liquidationProtocolFee, + vars.debtAmountNeeded, + vars.liquidationProtocolFee + ); + } else { + return (vars.collateralAmount, vars.debtAmountNeeded, 0); + } + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..dd5c637d --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..e08a30e8 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,642 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..9adca939 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/ARBITRUM/ORACLE.sol b/downloads/ARBITRUM/ORACLE.sol new file mode 100644 index 00000000..47299698 --- /dev/null +++ b/downloads/ARBITRUM/ORACLE.sol @@ -0,0 +1,759 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity =0.8.10 ^0.8.0; + +// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol + +// Chainlink Contracts v0.8 + +interface AggregatorInterface { + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt); + + event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); +} + +// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + **/ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + **/ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + **/ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + **/ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + **/ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + **/ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + **/ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + **/ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + **/ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + **/ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + **/ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + **/ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + **/ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' + string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 +} + +// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + **/ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an admin as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IAaveOracle.sol + +/** + * @title IAaveOracle + * @author Aave + * @notice Defines the basic interface for the Aave Oracle + */ +interface IAaveOracle is IPriceOracleGetter { + /** + * @dev Emitted after the base currency is set + * @param baseCurrency The base currency of used for price quotes + * @param baseCurrencyUnit The unit of the base currency + */ + event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); + + /** + * @dev Emitted after the price source of an asset is updated + * @param asset The address of the asset + * @param source The price source of the asset + */ + event AssetSourceUpdated(address indexed asset, address indexed source); + + /** + * @dev Emitted after the address of fallback oracle is updated + * @param fallbackOracle The address of the fallback oracle + */ + event FallbackOracleUpdated(address indexed fallbackOracle); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Sets or replaces price sources of assets + * @param assets The addresses of the assets + * @param sources The addresses of the price sources + */ + function setAssetSources(address[] calldata assets, address[] calldata sources) external; + + /** + * @notice Sets the fallback oracle + * @param fallbackOracle The address of the fallback oracle + */ + function setFallbackOracle(address fallbackOracle) external; + + /** + * @notice Returns a list of prices from a list of assets addresses + * @param assets The list of assets addresses + * @return The prices of the given assets + */ + function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); + + /** + * @notice Returns the address of the source for an asset address + * @param asset The address of the asset + * @return The address of the source + */ + function getSourceOfAsset(address asset) external view returns (address); + + /** + * @notice Returns the address of the fallback oracle + * @return The address of the fallback oracle + */ + function getFallbackOracle() external view returns (address); +} + +// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/misc/AaveOracle.sol + +/** + * @title AaveOracle + * @author Aave + * @notice Contract to get asset prices, manage price sources and update the fallback oracle + * - Use of Chainlink Aggregators as first source of price + * - If the returned price by a Chainlink aggregator is <= 0, the call is forwarded to a fallback oracle + * - Owned by the Aave governance + */ +contract AaveOracle is IAaveOracle { + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + // Map of asset price sources (asset => priceSource) + mapping(address => AggregatorInterface) private assetsSources; + + IPriceOracleGetter private _fallbackOracle; + address public immutable override BASE_CURRENCY; + uint256 public immutable override BASE_CURRENCY_UNIT; + + /** + * @dev Only asset listing or pool admin can call functions marked by this modifier. + **/ + modifier onlyAssetListingOrPoolAdmins() { + _onlyAssetListingOrPoolAdmins(); + _; + } + + /** + * @notice Constructor + * @param provider The address of the new PoolAddressesProvider + * @param assets The addresses of the assets + * @param sources The address of the source of each asset + * @param fallbackOracle The address of the fallback oracle to use if the data of an + * aggregator is not consistent + * @param baseCurrency The base currency used for the price quotes. If USD is used, base currency is 0x0 + * @param baseCurrencyUnit The unit of the base currency + */ + constructor( + IPoolAddressesProvider provider, + address[] memory assets, + address[] memory sources, + address fallbackOracle, + address baseCurrency, + uint256 baseCurrencyUnit + ) { + ADDRESSES_PROVIDER = provider; + _setFallbackOracle(fallbackOracle); + _setAssetsSources(assets, sources); + BASE_CURRENCY = baseCurrency; + BASE_CURRENCY_UNIT = baseCurrencyUnit; + emit BaseCurrencySet(baseCurrency, baseCurrencyUnit); + } + + /// @inheritdoc IAaveOracle + function setAssetSources( + address[] calldata assets, + address[] calldata sources + ) external override onlyAssetListingOrPoolAdmins { + _setAssetsSources(assets, sources); + } + + /// @inheritdoc IAaveOracle + function setFallbackOracle( + address fallbackOracle + ) external override onlyAssetListingOrPoolAdmins { + _setFallbackOracle(fallbackOracle); + } + + /** + * @notice Internal function to set the sources for each asset + * @param assets The addresses of the assets + * @param sources The address of the source of each asset + */ + function _setAssetsSources(address[] memory assets, address[] memory sources) internal { + require(assets.length == sources.length, Errors.INCONSISTENT_PARAMS_LENGTH); + for (uint256 i = 0; i < assets.length; i++) { + assetsSources[assets[i]] = AggregatorInterface(sources[i]); + emit AssetSourceUpdated(assets[i], sources[i]); + } + } + + /** + * @notice Internal function to set the fallback oracle + * @param fallbackOracle The address of the fallback oracle + */ + function _setFallbackOracle(address fallbackOracle) internal { + _fallbackOracle = IPriceOracleGetter(fallbackOracle); + emit FallbackOracleUpdated(fallbackOracle); + } + + /// @inheritdoc IPriceOracleGetter + function getAssetPrice(address asset) public view override returns (uint256) { + AggregatorInterface source = assetsSources[asset]; + + if (asset == BASE_CURRENCY) { + return BASE_CURRENCY_UNIT; + } else if (address(source) == address(0)) { + return _fallbackOracle.getAssetPrice(asset); + } else { + int256 price = source.latestAnswer(); + if (price > 0) { + return uint256(price); + } else { + return _fallbackOracle.getAssetPrice(asset); + } + } + } + + /// @inheritdoc IAaveOracle + function getAssetsPrices( + address[] calldata assets + ) external view override returns (uint256[] memory) { + uint256[] memory prices = new uint256[](assets.length); + for (uint256 i = 0; i < assets.length; i++) { + prices[i] = getAssetPrice(assets[i]); + } + return prices; + } + + /// @inheritdoc IAaveOracle + function getSourceOfAsset(address asset) external view override returns (address) { + return address(assetsSources[asset]); + } + + /// @inheritdoc IAaveOracle + function getFallbackOracle() external view returns (address) { + return address(_fallbackOracle); + } + + function _onlyAssetListingOrPoolAdmins() internal view { + IACLManager aclManager = IACLManager(ADDRESSES_PROVIDER.getACLManager()); + require( + aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), + Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN + ); + } +} diff --git a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol new file mode 100644 index 00000000..496151aa --- /dev/null +++ b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +// Chainlink Contracts v0.8 +pragma solidity ^0.8.0; + +interface AggregatorInterface { + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt); + + event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); +} diff --git a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..4bb6e645 --- /dev/null +++ b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + **/ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an admin as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IAaveOracle.sol b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IAaveOracle.sol new file mode 100644 index 00000000..0ad9b47f --- /dev/null +++ b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IAaveOracle.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IPriceOracleGetter} from './IPriceOracleGetter.sol'; +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IAaveOracle + * @author Aave + * @notice Defines the basic interface for the Aave Oracle + */ +interface IAaveOracle is IPriceOracleGetter { + /** + * @dev Emitted after the base currency is set + * @param baseCurrency The base currency of used for price quotes + * @param baseCurrencyUnit The unit of the base currency + */ + event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); + + /** + * @dev Emitted after the price source of an asset is updated + * @param asset The address of the asset + * @param source The price source of the asset + */ + event AssetSourceUpdated(address indexed asset, address indexed source); + + /** + * @dev Emitted after the address of fallback oracle is updated + * @param fallbackOracle The address of the fallback oracle + */ + event FallbackOracleUpdated(address indexed fallbackOracle); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Sets or replaces price sources of assets + * @param assets The addresses of the assets + * @param sources The addresses of the price sources + */ + function setAssetSources(address[] calldata assets, address[] calldata sources) external; + + /** + * @notice Sets the fallback oracle + * @param fallbackOracle The address of the fallback oracle + */ + function setFallbackOracle(address fallbackOracle) external; + + /** + * @notice Returns a list of prices from a list of assets addresses + * @param assets The list of assets addresses + * @return The prices of the given assets + */ + function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); + + /** + * @notice Returns the address of the source for an asset address + * @param asset The address of the asset + * @return The address of the source + */ + function getSourceOfAsset(address asset) external view returns (address); + + /** + * @notice Returns the address of the fallback oracle + * @return The address of the fallback oracle + */ + function getFallbackOracle() external view returns (address); +} diff --git a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..01a126bd --- /dev/null +++ b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + **/ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + **/ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + **/ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + **/ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + **/ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + **/ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + **/ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + **/ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + **/ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..92c1c466 --- /dev/null +++ b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + **/ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + **/ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + **/ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + **/ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/misc/AaveOracle.sol b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/misc/AaveOracle.sol new file mode 100644 index 00000000..99afe286 --- /dev/null +++ b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/misc/AaveOracle.sol @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {AggregatorInterface} from '../dependencies/chainlink/AggregatorInterface.sol'; +import {Errors} from '../protocol/libraries/helpers/Errors.sol'; +import {IACLManager} from '../interfaces/IACLManager.sol'; +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {IPriceOracleGetter} from '../interfaces/IPriceOracleGetter.sol'; +import {IAaveOracle} from '../interfaces/IAaveOracle.sol'; + +/** + * @title AaveOracle + * @author Aave + * @notice Contract to get asset prices, manage price sources and update the fallback oracle + * - Use of Chainlink Aggregators as first source of price + * - If the returned price by a Chainlink aggregator is <= 0, the call is forwarded to a fallback oracle + * - Owned by the Aave governance + */ +contract AaveOracle is IAaveOracle { + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + // Map of asset price sources (asset => priceSource) + mapping(address => AggregatorInterface) private assetsSources; + + IPriceOracleGetter private _fallbackOracle; + address public immutable override BASE_CURRENCY; + uint256 public immutable override BASE_CURRENCY_UNIT; + + /** + * @dev Only asset listing or pool admin can call functions marked by this modifier. + **/ + modifier onlyAssetListingOrPoolAdmins() { + _onlyAssetListingOrPoolAdmins(); + _; + } + + /** + * @notice Constructor + * @param provider The address of the new PoolAddressesProvider + * @param assets The addresses of the assets + * @param sources The address of the source of each asset + * @param fallbackOracle The address of the fallback oracle to use if the data of an + * aggregator is not consistent + * @param baseCurrency The base currency used for the price quotes. If USD is used, base currency is 0x0 + * @param baseCurrencyUnit The unit of the base currency + */ + constructor( + IPoolAddressesProvider provider, + address[] memory assets, + address[] memory sources, + address fallbackOracle, + address baseCurrency, + uint256 baseCurrencyUnit + ) { + ADDRESSES_PROVIDER = provider; + _setFallbackOracle(fallbackOracle); + _setAssetsSources(assets, sources); + BASE_CURRENCY = baseCurrency; + BASE_CURRENCY_UNIT = baseCurrencyUnit; + emit BaseCurrencySet(baseCurrency, baseCurrencyUnit); + } + + /// @inheritdoc IAaveOracle + function setAssetSources(address[] calldata assets, address[] calldata sources) + external + override + onlyAssetListingOrPoolAdmins + { + _setAssetsSources(assets, sources); + } + + /// @inheritdoc IAaveOracle + function setFallbackOracle(address fallbackOracle) + external + override + onlyAssetListingOrPoolAdmins + { + _setFallbackOracle(fallbackOracle); + } + + /** + * @notice Internal function to set the sources for each asset + * @param assets The addresses of the assets + * @param sources The address of the source of each asset + */ + function _setAssetsSources(address[] memory assets, address[] memory sources) internal { + require(assets.length == sources.length, Errors.INCONSISTENT_PARAMS_LENGTH); + for (uint256 i = 0; i < assets.length; i++) { + assetsSources[assets[i]] = AggregatorInterface(sources[i]); + emit AssetSourceUpdated(assets[i], sources[i]); + } + } + + /** + * @notice Internal function to set the fallback oracle + * @param fallbackOracle The address of the fallback oracle + */ + function _setFallbackOracle(address fallbackOracle) internal { + _fallbackOracle = IPriceOracleGetter(fallbackOracle); + emit FallbackOracleUpdated(fallbackOracle); + } + + /// @inheritdoc IPriceOracleGetter + function getAssetPrice(address asset) public view override returns (uint256) { + AggregatorInterface source = assetsSources[asset]; + + if (asset == BASE_CURRENCY) { + return BASE_CURRENCY_UNIT; + } else if (address(source) == address(0)) { + return _fallbackOracle.getAssetPrice(asset); + } else { + int256 price = source.latestAnswer(); + if (price > 0) { + return uint256(price); + } else { + return _fallbackOracle.getAssetPrice(asset); + } + } + } + + /// @inheritdoc IAaveOracle + function getAssetsPrices(address[] calldata assets) + external + view + override + returns (uint256[] memory) + { + uint256[] memory prices = new uint256[](assets.length); + for (uint256 i = 0; i < assets.length; i++) { + prices[i] = getAssetPrice(assets[i]); + } + return prices; + } + + /// @inheritdoc IAaveOracle + function getSourceOfAsset(address asset) external view override returns (address) { + return address(assetsSources[asset]); + } + + /// @inheritdoc IAaveOracle + function getFallbackOracle() external view returns (address) { + return address(_fallbackOracle); + } + + function _onlyAssetListingOrPoolAdmins() internal view { + IACLManager aclManager = IACLManager(ADDRESSES_PROVIDER.getACLManager()); + require( + aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), + Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN + ); + } +} diff --git a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..640e4632 --- /dev/null +++ b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' + string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER.sol new file mode 100644 index 00000000..9478e368 --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER.sol @@ -0,0 +1,855 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity =0.8.10; + +// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // According to EIP-1052, 0x0 is the value returned for not-yet created accounts + // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned + // for accounts without code, i.e. `keccak256('')` + bytes32 codehash; + bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; + // solhint-disable-next-line no-inline-assembly + assembly { + codehash := extcodehash(account) + } + return (codehash != accountHash && codehash != 0x0); + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + // solhint-disable-next-line avoid-low-level-calls, avoid-call-value + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } +} + +// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol + +/** + * @title Proxy + * @dev Implements delegation of calls to other contracts, with proper + * forwarding of return values and bubbling of failures. + * It defines a fallback function that delegates all calls to the address + * returned by the abstract _implementation() internal function. + */ +abstract contract Proxy { + /** + * @dev Fallback function. + * Will run if no other function in the contract matches the call data. + * Implemented entirely in `_fallback`. + */ + fallback() external payable { + _fallback(); + } + + /** + * @return The Address of the implementation. + */ + function _implementation() internal view virtual returns (address); + + /** + * @dev Delegates execution to an implementation contract. + * This is a low level function that doesn't return to its internal call site. + * It will return to the external caller whatever the implementation returns. + * @param implementation Address to delegate. + */ + function _delegate(address implementation) internal { + //solium-disable-next-line + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + /** + * @dev Function that is run as the first thing in the fallback function. + * Can be redefined in derived contracts to add functionality. + * Redefinitions must call super._willFallback(). + */ + function _willFallback() internal virtual {} + + /** + * @dev fallback implementation. + * Extracted to enable manual triggering. + */ + function _fallback() internal { + _willFallback(); + _delegate(_implementation()); + } +} + +// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + **/ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + **/ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + **/ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + **/ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + **/ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + **/ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + **/ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + **/ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + **/ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} + +// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol + +/** + * @title BaseUpgradeabilityProxy + * @dev This contract implements a proxy that allows to change the + * implementation address to which it will delegate. + * Such a change is called an implementation upgrade. + */ +contract BaseUpgradeabilityProxy is Proxy { + /** + * @dev Emitted when the implementation is upgraded. + * @param implementation Address of the new implementation. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Storage slot with the address of the current implementation. + * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is + * validated in the constructor. + */ + bytes32 internal constant IMPLEMENTATION_SLOT = + 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + /** + * @dev Returns the current implementation. + * @return impl Address of the current implementation + */ + function _implementation() internal view override returns (address impl) { + bytes32 slot = IMPLEMENTATION_SLOT; + //solium-disable-next-line + assembly { + impl := sload(slot) + } + } + + /** + * @dev Upgrades the proxy to a new implementation. + * @param newImplementation Address of the new implementation. + */ + function _upgradeTo(address newImplementation) internal { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + } + + /** + * @dev Sets the implementation address of the proxy. + * @param newImplementation Address of the new implementation. + */ + function _setImplementation(address newImplementation) internal { + require( + Address.isContract(newImplementation), + 'Cannot set a proxy implementation to a non-contract address' + ); + + bytes32 slot = IMPLEMENTATION_SLOT; + + //solium-disable-next-line + assembly { + sstore(slot, newImplementation) + } + } +} + +// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol + +/** + * @title InitializableUpgradeabilityProxy + * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing + * implementation and init data. + */ +contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { + /** + * @dev Contract initializer. + * @param _logic Address of the initial implementation. + * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. + */ + function initialize(address _logic, bytes memory _data) public payable { + require(_implementation() == address(0)); + assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); + _setImplementation(_logic); + if (_data.length > 0) { + (bool success, ) = _logic.delegatecall(_data); + require(success); + } + } +} + +// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol + +/** + * @title BaseImmutableAdminUpgradeabilityProxy + * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern + * @notice This contract combines an upgradeability proxy with an authorization + * mechanism for administrative tasks. + * @dev The admin role is stored in an immutable, which helps saving transactions costs + * All external functions in this contract must be guarded by the + * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity + * feature proposal that would enable this to be done automatically. + */ +contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + address internal immutable _admin; + + /** + * @dev Constructor. + * @param admin The address of the admin + */ + constructor(address admin) { + _admin = admin; + } + + modifier ifAdmin() { + if (msg.sender == _admin) { + _; + } else { + _fallback(); + } + } + + /** + * @notice Return the admin address + * @return The address of the proxy admin. + */ + function admin() external ifAdmin returns (address) { + return _admin; + } + + /** + * @notice Return the implementation address + * @return The address of the implementation. + */ + function implementation() external ifAdmin returns (address) { + return _implementation(); + } + + /** + * @notice Upgrade the backing implementation of the proxy. + * @dev Only the admin can call this function. + * @param newImplementation The address of the new implementation. + */ + function upgradeTo(address newImplementation) external ifAdmin { + _upgradeTo(newImplementation); + } + + /** + * @notice Upgrade the backing implementation of the proxy and call a function + * on the new implementation. + * @dev This is useful to initialize the proxied contract. + * @param newImplementation The address of the new implementation. + * @param data Data to send as msg.data in the low level call. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + */ + function upgradeToAndCall( + address newImplementation, + bytes calldata data + ) external payable ifAdmin { + _upgradeTo(newImplementation); + (bool success, ) = newImplementation.delegatecall(data); + require(success); + } + + /** + * @notice Only fall back when the sender is not the admin. + */ + function _willFallback() internal virtual override { + require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); + super._willFallback(); + } +} + +// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol + +/** + * @title InitializableAdminUpgradeabilityProxy + * @author Aave + * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function + */ +contract InitializableImmutableAdminUpgradeabilityProxy is + BaseImmutableAdminUpgradeabilityProxy, + InitializableUpgradeabilityProxy +{ + /** + * @dev Constructor. + * @param admin The address of the admin + */ + constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { + // Intentionally left blank + } + + /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy + function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { + BaseImmutableAdminUpgradeabilityProxy._willFallback(); + } +} + +// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol + +/** + * @title PoolAddressesProvider + * @author Aave + * @notice Main registry of addresses part of or connected to the protocol, including permissioned roles + * @dev Acts as factory of proxies and admin of those, so with right to change its implementations + * @dev Owned by the Aave Governance + **/ +contract PoolAddressesProvider is Ownable, IPoolAddressesProvider { + // Identifier of the Aave Market + string private _marketId; + + // Map of registered addresses (identifier => registeredAddress) + mapping(bytes32 => address) private _addresses; + + // Main identifiers + bytes32 private constant POOL = 'POOL'; + bytes32 private constant POOL_CONFIGURATOR = 'POOL_CONFIGURATOR'; + bytes32 private constant PRICE_ORACLE = 'PRICE_ORACLE'; + bytes32 private constant ACL_MANAGER = 'ACL_MANAGER'; + bytes32 private constant ACL_ADMIN = 'ACL_ADMIN'; + bytes32 private constant PRICE_ORACLE_SENTINEL = 'PRICE_ORACLE_SENTINEL'; + bytes32 private constant DATA_PROVIDER = 'DATA_PROVIDER'; + + /** + * @dev Constructor. + * @param marketId The identifier of the market. + * @param owner The owner address of this contract. + */ + constructor(string memory marketId, address owner) { + _setMarketId(marketId); + transferOwnership(owner); + } + + /// @inheritdoc IPoolAddressesProvider + function getMarketId() external view override returns (string memory) { + return _marketId; + } + + /// @inheritdoc IPoolAddressesProvider + function setMarketId(string memory newMarketId) external override onlyOwner { + _setMarketId(newMarketId); + } + + /// @inheritdoc IPoolAddressesProvider + function getAddress(bytes32 id) public view override returns (address) { + return _addresses[id]; + } + + /// @inheritdoc IPoolAddressesProvider + function setAddress(bytes32 id, address newAddress) external override onlyOwner { + address oldAddress = _addresses[id]; + _addresses[id] = newAddress; + emit AddressSet(id, oldAddress, newAddress); + } + + /// @inheritdoc IPoolAddressesProvider + function setAddressAsProxy( + bytes32 id, + address newImplementationAddress + ) external override onlyOwner { + address proxyAddress = _addresses[id]; + address oldImplementationAddress = _getProxyImplementation(id); + _updateImpl(id, newImplementationAddress); + emit AddressSetAsProxy(id, proxyAddress, oldImplementationAddress, newImplementationAddress); + } + + /// @inheritdoc IPoolAddressesProvider + function getPool() external view override returns (address) { + return getAddress(POOL); + } + + /// @inheritdoc IPoolAddressesProvider + function setPoolImpl(address newPoolImpl) external override onlyOwner { + address oldPoolImpl = _getProxyImplementation(POOL); + _updateImpl(POOL, newPoolImpl); + emit PoolUpdated(oldPoolImpl, newPoolImpl); + } + + /// @inheritdoc IPoolAddressesProvider + function getPoolConfigurator() external view override returns (address) { + return getAddress(POOL_CONFIGURATOR); + } + + /// @inheritdoc IPoolAddressesProvider + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external override onlyOwner { + address oldPoolConfiguratorImpl = _getProxyImplementation(POOL_CONFIGURATOR); + _updateImpl(POOL_CONFIGURATOR, newPoolConfiguratorImpl); + emit PoolConfiguratorUpdated(oldPoolConfiguratorImpl, newPoolConfiguratorImpl); + } + + /// @inheritdoc IPoolAddressesProvider + function getPriceOracle() external view override returns (address) { + return getAddress(PRICE_ORACLE); + } + + /// @inheritdoc IPoolAddressesProvider + function setPriceOracle(address newPriceOracle) external override onlyOwner { + address oldPriceOracle = _addresses[PRICE_ORACLE]; + _addresses[PRICE_ORACLE] = newPriceOracle; + emit PriceOracleUpdated(oldPriceOracle, newPriceOracle); + } + + /// @inheritdoc IPoolAddressesProvider + function getACLManager() external view override returns (address) { + return getAddress(ACL_MANAGER); + } + + /// @inheritdoc IPoolAddressesProvider + function setACLManager(address newAclManager) external override onlyOwner { + address oldAclManager = _addresses[ACL_MANAGER]; + _addresses[ACL_MANAGER] = newAclManager; + emit ACLManagerUpdated(oldAclManager, newAclManager); + } + + /// @inheritdoc IPoolAddressesProvider + function getACLAdmin() external view override returns (address) { + return getAddress(ACL_ADMIN); + } + + /// @inheritdoc IPoolAddressesProvider + function setACLAdmin(address newAclAdmin) external override onlyOwner { + address oldAclAdmin = _addresses[ACL_ADMIN]; + _addresses[ACL_ADMIN] = newAclAdmin; + emit ACLAdminUpdated(oldAclAdmin, newAclAdmin); + } + + /// @inheritdoc IPoolAddressesProvider + function getPriceOracleSentinel() external view override returns (address) { + return getAddress(PRICE_ORACLE_SENTINEL); + } + + /// @inheritdoc IPoolAddressesProvider + function setPriceOracleSentinel(address newPriceOracleSentinel) external override onlyOwner { + address oldPriceOracleSentinel = _addresses[PRICE_ORACLE_SENTINEL]; + _addresses[PRICE_ORACLE_SENTINEL] = newPriceOracleSentinel; + emit PriceOracleSentinelUpdated(oldPriceOracleSentinel, newPriceOracleSentinel); + } + + /// @inheritdoc IPoolAddressesProvider + function getPoolDataProvider() external view override returns (address) { + return getAddress(DATA_PROVIDER); + } + + /// @inheritdoc IPoolAddressesProvider + function setPoolDataProvider(address newDataProvider) external override onlyOwner { + address oldDataProvider = _addresses[DATA_PROVIDER]; + _addresses[DATA_PROVIDER] = newDataProvider; + emit PoolDataProviderUpdated(oldDataProvider, newDataProvider); + } + + /** + * @notice Internal function to update the implementation of a specific proxied component of the protocol. + * @dev If there is no proxy registered with the given identifier, it creates the proxy setting `newAddress` + * as implementation and calls the initialize() function on the proxy + * @dev If there is already a proxy registered, it just updates the implementation to `newAddress` and + * calls the initialize() function via upgradeToAndCall() in the proxy + * @param id The id of the proxy to be updated + * @param newAddress The address of the new implementation + **/ + function _updateImpl(bytes32 id, address newAddress) internal { + address proxyAddress = _addresses[id]; + InitializableImmutableAdminUpgradeabilityProxy proxy; + bytes memory params = abi.encodeWithSignature('initialize(address)', address(this)); + + if (proxyAddress == address(0)) { + proxy = new InitializableImmutableAdminUpgradeabilityProxy(address(this)); + _addresses[id] = proxyAddress = address(proxy); + proxy.initialize(newAddress, params); + emit ProxyCreated(id, proxyAddress, newAddress); + } else { + proxy = InitializableImmutableAdminUpgradeabilityProxy(payable(proxyAddress)); + proxy.upgradeToAndCall(newAddress, params); + } + } + + /** + * @notice Updates the identifier of the Aave market. + * @param newMarketId The new id of the market + **/ + function _setMarketId(string memory newMarketId) internal { + string memory oldMarketId = _marketId; + _marketId = newMarketId; + emit MarketIdSet(oldMarketId, newMarketId); + } + + /** + * @notice Returns the the implementation contract of the proxy contract by its identifier. + * @dev It returns ZERO if there is no registered address with the given id + * @dev It reverts if the registered address with the given id is not `InitializableImmutableAdminUpgradeabilityProxy` + * @param id The id + * @return The address of the implementation contract + */ + function _getProxyImplementation(bytes32 id) internal returns (address) { + address proxyAddress = _addresses[id]; + if (proxyAddress == address(0)) { + return address(0); + } else { + address payable payableProxyAddress = payable(proxyAddress); + return InitializableImmutableAdminUpgradeabilityProxy(payableProxyAddress).implementation(); + } + } +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..c6dcfda7 --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // According to EIP-1052, 0x0 is the value returned for not-yet created accounts + // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned + // for accounts without code, i.e. `keccak256('')` + bytes32 codehash; + bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; + // solhint-disable-next-line no-inline-assembly + assembly { + codehash := extcodehash(account) + } + return (codehash != accountHash && codehash != 0x0); + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + // solhint-disable-next-line avoid-low-level-calls, avoid-call-value + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..445ee640 --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol new file mode 100644 index 00000000..020feeca --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.10; + +import './Context.sol'; + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol new file mode 100644 index 00000000..bf52cd59 --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import './Proxy.sol'; +import '../contracts/Address.sol'; + +/** + * @title BaseUpgradeabilityProxy + * @dev This contract implements a proxy that allows to change the + * implementation address to which it will delegate. + * Such a change is called an implementation upgrade. + */ +contract BaseUpgradeabilityProxy is Proxy { + /** + * @dev Emitted when the implementation is upgraded. + * @param implementation Address of the new implementation. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Storage slot with the address of the current implementation. + * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is + * validated in the constructor. + */ + bytes32 internal constant IMPLEMENTATION_SLOT = + 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + /** + * @dev Returns the current implementation. + * @return impl Address of the current implementation + */ + function _implementation() internal view override returns (address impl) { + bytes32 slot = IMPLEMENTATION_SLOT; + //solium-disable-next-line + assembly { + impl := sload(slot) + } + } + + /** + * @dev Upgrades the proxy to a new implementation. + * @param newImplementation Address of the new implementation. + */ + function _upgradeTo(address newImplementation) internal { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + } + + /** + * @dev Sets the implementation address of the proxy. + * @param newImplementation Address of the new implementation. + */ + function _setImplementation(address newImplementation) internal { + require( + Address.isContract(newImplementation), + 'Cannot set a proxy implementation to a non-contract address' + ); + + bytes32 slot = IMPLEMENTATION_SLOT; + + //solium-disable-next-line + assembly { + sstore(slot, newImplementation) + } + } +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol new file mode 100644 index 00000000..5ecec083 --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import './BaseUpgradeabilityProxy.sol'; + +/** + * @title InitializableUpgradeabilityProxy + * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing + * implementation and init data. + */ +contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { + /** + * @dev Contract initializer. + * @param _logic Address of the initial implementation. + * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. + */ + function initialize(address _logic, bytes memory _data) public payable { + require(_implementation() == address(0)); + assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); + _setImplementation(_logic); + if (_data.length > 0) { + (bool success, ) = _logic.delegatecall(_data); + require(success); + } + } +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol new file mode 100644 index 00000000..44b790da --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +/** + * @title Proxy + * @dev Implements delegation of calls to other contracts, with proper + * forwarding of return values and bubbling of failures. + * It defines a fallback function that delegates all calls to the address + * returned by the abstract _implementation() internal function. + */ +abstract contract Proxy { + /** + * @dev Fallback function. + * Will run if no other function in the contract matches the call data. + * Implemented entirely in `_fallback`. + */ + fallback() external payable { + _fallback(); + } + + /** + * @return The Address of the implementation. + */ + function _implementation() internal view virtual returns (address); + + /** + * @dev Delegates execution to an implementation contract. + * This is a low level function that doesn't return to its internal call site. + * It will return to the external caller whatever the implementation returns. + * @param implementation Address to delegate. + */ + function _delegate(address implementation) internal { + //solium-disable-next-line + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + /** + * @dev Function that is run as the first thing in the fallback function. + * Can be redefined in derived contracts to add functionality. + * Redefinitions must call super._willFallback(). + */ + function _willFallback() internal virtual {} + + /** + * @dev fallback implementation. + * Extracted to enable manual triggering. + */ + function _fallback() internal { + _willFallback(); + _delegate(_implementation()); + } +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..01a126bd --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + **/ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + **/ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + **/ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + **/ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + **/ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + **/ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + **/ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + **/ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + **/ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol new file mode 100644 index 00000000..073e92f3 --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol @@ -0,0 +1,210 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {Ownable} from '../../dependencies/openzeppelin/contracts/Ownable.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {InitializableImmutableAdminUpgradeabilityProxy} from '../libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; + +/** + * @title PoolAddressesProvider + * @author Aave + * @notice Main registry of addresses part of or connected to the protocol, including permissioned roles + * @dev Acts as factory of proxies and admin of those, so with right to change its implementations + * @dev Owned by the Aave Governance + **/ +contract PoolAddressesProvider is Ownable, IPoolAddressesProvider { + // Identifier of the Aave Market + string private _marketId; + + // Map of registered addresses (identifier => registeredAddress) + mapping(bytes32 => address) private _addresses; + + // Main identifiers + bytes32 private constant POOL = 'POOL'; + bytes32 private constant POOL_CONFIGURATOR = 'POOL_CONFIGURATOR'; + bytes32 private constant PRICE_ORACLE = 'PRICE_ORACLE'; + bytes32 private constant ACL_MANAGER = 'ACL_MANAGER'; + bytes32 private constant ACL_ADMIN = 'ACL_ADMIN'; + bytes32 private constant PRICE_ORACLE_SENTINEL = 'PRICE_ORACLE_SENTINEL'; + bytes32 private constant DATA_PROVIDER = 'DATA_PROVIDER'; + + /** + * @dev Constructor. + * @param marketId The identifier of the market. + * @param owner The owner address of this contract. + */ + constructor(string memory marketId, address owner) { + _setMarketId(marketId); + transferOwnership(owner); + } + + /// @inheritdoc IPoolAddressesProvider + function getMarketId() external view override returns (string memory) { + return _marketId; + } + + /// @inheritdoc IPoolAddressesProvider + function setMarketId(string memory newMarketId) external override onlyOwner { + _setMarketId(newMarketId); + } + + /// @inheritdoc IPoolAddressesProvider + function getAddress(bytes32 id) public view override returns (address) { + return _addresses[id]; + } + + /// @inheritdoc IPoolAddressesProvider + function setAddress(bytes32 id, address newAddress) external override onlyOwner { + address oldAddress = _addresses[id]; + _addresses[id] = newAddress; + emit AddressSet(id, oldAddress, newAddress); + } + + /// @inheritdoc IPoolAddressesProvider + function setAddressAsProxy(bytes32 id, address newImplementationAddress) + external + override + onlyOwner + { + address proxyAddress = _addresses[id]; + address oldImplementationAddress = _getProxyImplementation(id); + _updateImpl(id, newImplementationAddress); + emit AddressSetAsProxy(id, proxyAddress, oldImplementationAddress, newImplementationAddress); + } + + /// @inheritdoc IPoolAddressesProvider + function getPool() external view override returns (address) { + return getAddress(POOL); + } + + /// @inheritdoc IPoolAddressesProvider + function setPoolImpl(address newPoolImpl) external override onlyOwner { + address oldPoolImpl = _getProxyImplementation(POOL); + _updateImpl(POOL, newPoolImpl); + emit PoolUpdated(oldPoolImpl, newPoolImpl); + } + + /// @inheritdoc IPoolAddressesProvider + function getPoolConfigurator() external view override returns (address) { + return getAddress(POOL_CONFIGURATOR); + } + + /// @inheritdoc IPoolAddressesProvider + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external override onlyOwner { + address oldPoolConfiguratorImpl = _getProxyImplementation(POOL_CONFIGURATOR); + _updateImpl(POOL_CONFIGURATOR, newPoolConfiguratorImpl); + emit PoolConfiguratorUpdated(oldPoolConfiguratorImpl, newPoolConfiguratorImpl); + } + + /// @inheritdoc IPoolAddressesProvider + function getPriceOracle() external view override returns (address) { + return getAddress(PRICE_ORACLE); + } + + /// @inheritdoc IPoolAddressesProvider + function setPriceOracle(address newPriceOracle) external override onlyOwner { + address oldPriceOracle = _addresses[PRICE_ORACLE]; + _addresses[PRICE_ORACLE] = newPriceOracle; + emit PriceOracleUpdated(oldPriceOracle, newPriceOracle); + } + + /// @inheritdoc IPoolAddressesProvider + function getACLManager() external view override returns (address) { + return getAddress(ACL_MANAGER); + } + + /// @inheritdoc IPoolAddressesProvider + function setACLManager(address newAclManager) external override onlyOwner { + address oldAclManager = _addresses[ACL_MANAGER]; + _addresses[ACL_MANAGER] = newAclManager; + emit ACLManagerUpdated(oldAclManager, newAclManager); + } + + /// @inheritdoc IPoolAddressesProvider + function getACLAdmin() external view override returns (address) { + return getAddress(ACL_ADMIN); + } + + /// @inheritdoc IPoolAddressesProvider + function setACLAdmin(address newAclAdmin) external override onlyOwner { + address oldAclAdmin = _addresses[ACL_ADMIN]; + _addresses[ACL_ADMIN] = newAclAdmin; + emit ACLAdminUpdated(oldAclAdmin, newAclAdmin); + } + + /// @inheritdoc IPoolAddressesProvider + function getPriceOracleSentinel() external view override returns (address) { + return getAddress(PRICE_ORACLE_SENTINEL); + } + + /// @inheritdoc IPoolAddressesProvider + function setPriceOracleSentinel(address newPriceOracleSentinel) external override onlyOwner { + address oldPriceOracleSentinel = _addresses[PRICE_ORACLE_SENTINEL]; + _addresses[PRICE_ORACLE_SENTINEL] = newPriceOracleSentinel; + emit PriceOracleSentinelUpdated(oldPriceOracleSentinel, newPriceOracleSentinel); + } + + /// @inheritdoc IPoolAddressesProvider + function getPoolDataProvider() external view override returns (address) { + return getAddress(DATA_PROVIDER); + } + + /// @inheritdoc IPoolAddressesProvider + function setPoolDataProvider(address newDataProvider) external override onlyOwner { + address oldDataProvider = _addresses[DATA_PROVIDER]; + _addresses[DATA_PROVIDER] = newDataProvider; + emit PoolDataProviderUpdated(oldDataProvider, newDataProvider); + } + + /** + * @notice Internal function to update the implementation of a specific proxied component of the protocol. + * @dev If there is no proxy registered with the given identifier, it creates the proxy setting `newAddress` + * as implementation and calls the initialize() function on the proxy + * @dev If there is already a proxy registered, it just updates the implementation to `newAddress` and + * calls the initialize() function via upgradeToAndCall() in the proxy + * @param id The id of the proxy to be updated + * @param newAddress The address of the new implementation + **/ + function _updateImpl(bytes32 id, address newAddress) internal { + address proxyAddress = _addresses[id]; + InitializableImmutableAdminUpgradeabilityProxy proxy; + bytes memory params = abi.encodeWithSignature('initialize(address)', address(this)); + + if (proxyAddress == address(0)) { + proxy = new InitializableImmutableAdminUpgradeabilityProxy(address(this)); + _addresses[id] = proxyAddress = address(proxy); + proxy.initialize(newAddress, params); + emit ProxyCreated(id, proxyAddress, newAddress); + } else { + proxy = InitializableImmutableAdminUpgradeabilityProxy(payable(proxyAddress)); + proxy.upgradeToAndCall(newAddress, params); + } + } + + /** + * @notice Updates the identifier of the Aave market. + * @param newMarketId The new id of the market + **/ + function _setMarketId(string memory newMarketId) internal { + string memory oldMarketId = _marketId; + _marketId = newMarketId; + emit MarketIdSet(oldMarketId, newMarketId); + } + + /** + * @notice Returns the the implementation contract of the proxy contract by its identifier. + * @dev It returns ZERO if there is no registered address with the given id + * @dev It reverts if the registered address with the given id is not `InitializableImmutableAdminUpgradeabilityProxy` + * @param id The id + * @return The address of the implementation contract + */ + function _getProxyImplementation(bytes32 id) internal returns (address) { + address proxyAddress = _addresses[id]; + if (proxyAddress == address(0)) { + return address(0); + } else { + address payable payableProxyAddress = payable(proxyAddress); + return InitializableImmutableAdminUpgradeabilityProxy(payableProxyAddress).implementation(); + } + } +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..87550c2e --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {BaseUpgradeabilityProxy} from '../../../dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol'; + +/** + * @title BaseImmutableAdminUpgradeabilityProxy + * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern + * @notice This contract combines an upgradeability proxy with an authorization + * mechanism for administrative tasks. + * @dev The admin role is stored in an immutable, which helps saving transactions costs + * All external functions in this contract must be guarded by the + * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity + * feature proposal that would enable this to be done automatically. + */ +contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + address internal immutable _admin; + + /** + * @dev Constructor. + * @param admin The address of the admin + */ + constructor(address admin) { + _admin = admin; + } + + modifier ifAdmin() { + if (msg.sender == _admin) { + _; + } else { + _fallback(); + } + } + + /** + * @notice Return the admin address + * @return The address of the proxy admin. + */ + function admin() external ifAdmin returns (address) { + return _admin; + } + + /** + * @notice Return the implementation address + * @return The address of the implementation. + */ + function implementation() external ifAdmin returns (address) { + return _implementation(); + } + + /** + * @notice Upgrade the backing implementation of the proxy. + * @dev Only the admin can call this function. + * @param newImplementation The address of the new implementation. + */ + function upgradeTo(address newImplementation) external ifAdmin { + _upgradeTo(newImplementation); + } + + /** + * @notice Upgrade the backing implementation of the proxy and call a function + * on the new implementation. + * @dev This is useful to initialize the proxied contract. + * @param newImplementation The address of the new implementation. + * @param data Data to send as msg.data in the low level call. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + */ + function upgradeToAndCall(address newImplementation, bytes calldata data) + external + payable + ifAdmin + { + _upgradeTo(newImplementation); + (bool success, ) = newImplementation.delegatecall(data); + require(success); + } + + /** + * @notice Only fall back when the sender is not the admin. + */ + function _willFallback() internal virtual override { + require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); + super._willFallback(); + } +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..655e5f9e --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {InitializableUpgradeabilityProxy} from '../../../dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol'; +import {Proxy} from '../../../dependencies/openzeppelin/upgradeability/Proxy.sol'; +import {BaseImmutableAdminUpgradeabilityProxy} from './BaseImmutableAdminUpgradeabilityProxy.sol'; + +/** + * @title InitializableAdminUpgradeabilityProxy + * @author Aave + * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function + */ +contract InitializableImmutableAdminUpgradeabilityProxy is + BaseImmutableAdminUpgradeabilityProxy, + InitializableUpgradeabilityProxy +{ + /** + * @dev Constructor. + * @param admin The address of the admin + */ + constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { + // Intentionally left blank + } + + /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy + function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { + BaseImmutableAdminUpgradeabilityProxy._willFallback(); + } +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY.sol new file mode 100644 index 00000000..b396e1f7 --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY.sol @@ -0,0 +1,349 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity =0.8.10; + +// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol + +/** + * @title IPoolAddressesProviderRegistry + * @author Aave + * @notice Defines the basic interface for an Aave Pool Addresses Provider Registry. + **/ +interface IPoolAddressesProviderRegistry { + /** + * @dev Emitted when a new AddressesProvider is registered. + * @param addressesProvider The address of the registered PoolAddressesProvider + * @param id The id of the registered PoolAddressesProvider + */ + event AddressesProviderRegistered(address indexed addressesProvider, uint256 indexed id); + + /** + * @dev Emitted when an AddressesProvider is unregistered. + * @param addressesProvider The address of the unregistered PoolAddressesProvider + * @param id The id of the unregistered PoolAddressesProvider + */ + event AddressesProviderUnregistered(address indexed addressesProvider, uint256 indexed id); + + /** + * @notice Returns the list of registered addresses providers + * @return The list of addresses providers + **/ + function getAddressesProvidersList() external view returns (address[] memory); + + /** + * @notice Returns the id of a registered PoolAddressesProvider + * @param addressesProvider The address of the PoolAddressesProvider + * @return The id of the PoolAddressesProvider or 0 if is not registered + */ + function getAddressesProviderIdByAddress( + address addressesProvider + ) external view returns (uint256); + + /** + * @notice Returns the address of a registered PoolAddressesProvider + * @param id The id of the market + * @return The address of the PoolAddressesProvider with the given id or zero address if it is not registered + */ + function getAddressesProviderAddressById(uint256 id) external view returns (address); + + /** + * @notice Registers an addresses provider + * @dev The PoolAddressesProvider must not already be registered in the registry + * @dev The id must not be used by an already registered PoolAddressesProvider + * @param provider The address of the new PoolAddressesProvider + * @param id The id for the new PoolAddressesProvider, referring to the market it belongs to + **/ + function registerAddressesProvider(address provider, uint256 id) external; + + /** + * @notice Removes an addresses provider from the list of registered addresses providers + * @param provider The PoolAddressesProvider address + **/ + function unregisterAddressesProvider(address provider) external; +} + +// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' + string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 +} + +// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} + +// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol + +/** + * @title PoolAddressesProviderRegistry + * @author Aave + * @notice Main registry of PoolAddressesProvider of Aave markets. + * @dev Used for indexing purposes of Aave protocol's markets. The id assigned to a PoolAddressesProvider refers to the + * market it is connected with, for example with `1` for the Aave main market and `2` for the next created. + **/ +contract PoolAddressesProviderRegistry is Ownable, IPoolAddressesProviderRegistry { + // Map of address provider ids (addressesProvider => id) + mapping(address => uint256) private _addressesProviderToId; + // Map of id to address provider (id => addressesProvider) + mapping(uint256 => address) private _idToAddressesProvider; + // List of addresses providers + address[] private _addressesProvidersList; + // Map of address provider list indexes (addressesProvider => indexInList) + mapping(address => uint256) private _addressesProvidersIndexes; + + /** + * @dev Constructor. + * @param owner The owner address of this contract. + */ + constructor(address owner) { + transferOwnership(owner); + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function getAddressesProvidersList() external view override returns (address[] memory) { + return _addressesProvidersList; + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function registerAddressesProvider(address provider, uint256 id) external override onlyOwner { + require(id != 0, Errors.INVALID_ADDRESSES_PROVIDER_ID); + require(_idToAddressesProvider[id] == address(0), Errors.INVALID_ADDRESSES_PROVIDER_ID); + require(_addressesProviderToId[provider] == 0, Errors.ADDRESSES_PROVIDER_ALREADY_ADDED); + + _addressesProviderToId[provider] = id; + _idToAddressesProvider[id] = provider; + + _addToAddressesProvidersList(provider); + emit AddressesProviderRegistered(provider, id); + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function unregisterAddressesProvider(address provider) external override onlyOwner { + require(_addressesProviderToId[provider] != 0, Errors.ADDRESSES_PROVIDER_NOT_REGISTERED); + uint256 oldId = _addressesProviderToId[provider]; + _idToAddressesProvider[oldId] = address(0); + _addressesProviderToId[provider] = 0; + + _removeFromAddressesProvidersList(provider); + + emit AddressesProviderUnregistered(provider, oldId); + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function getAddressesProviderIdByAddress( + address addressesProvider + ) external view override returns (uint256) { + return _addressesProviderToId[addressesProvider]; + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function getAddressesProviderAddressById(uint256 id) external view override returns (address) { + return _idToAddressesProvider[id]; + } + + /** + * @notice Adds the addresses provider address to the list. + * @param provider The address of the PoolAddressesProvider + */ + function _addToAddressesProvidersList(address provider) internal { + _addressesProvidersIndexes[provider] = _addressesProvidersList.length; + _addressesProvidersList.push(provider); + } + + /** + * @notice Removes the addresses provider address from the list. + * @param provider The address of the PoolAddressesProvider + */ + function _removeFromAddressesProvidersList(address provider) internal { + uint256 index = _addressesProvidersIndexes[provider]; + + _addressesProvidersIndexes[provider] = 0; + + // Swap the index of the last addresses provider in the list with the index of the provider to remove + uint256 lastIndex = _addressesProvidersList.length - 1; + if (index < lastIndex) { + address lastProvider = _addressesProvidersList[lastIndex]; + _addressesProvidersList[index] = lastProvider; + _addressesProvidersIndexes[lastProvider] = index; + } + _addressesProvidersList.pop(); + } +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..445ee640 --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol new file mode 100644 index 00000000..020feeca --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.10; + +import './Context.sol'; + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol new file mode 100644 index 00000000..a48ff207 --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title IPoolAddressesProviderRegistry + * @author Aave + * @notice Defines the basic interface for an Aave Pool Addresses Provider Registry. + **/ +interface IPoolAddressesProviderRegistry { + /** + * @dev Emitted when a new AddressesProvider is registered. + * @param addressesProvider The address of the registered PoolAddressesProvider + * @param id The id of the registered PoolAddressesProvider + */ + event AddressesProviderRegistered(address indexed addressesProvider, uint256 indexed id); + + /** + * @dev Emitted when an AddressesProvider is unregistered. + * @param addressesProvider The address of the unregistered PoolAddressesProvider + * @param id The id of the unregistered PoolAddressesProvider + */ + event AddressesProviderUnregistered(address indexed addressesProvider, uint256 indexed id); + + /** + * @notice Returns the list of registered addresses providers + * @return The list of addresses providers + **/ + function getAddressesProvidersList() external view returns (address[] memory); + + /** + * @notice Returns the id of a registered PoolAddressesProvider + * @param addressesProvider The address of the PoolAddressesProvider + * @return The id of the PoolAddressesProvider or 0 if is not registered + */ + function getAddressesProviderIdByAddress(address addressesProvider) + external + view + returns (uint256); + + /** + * @notice Returns the address of a registered PoolAddressesProvider + * @param id The id of the market + * @return The address of the PoolAddressesProvider with the given id or zero address if it is not registered + */ + function getAddressesProviderAddressById(uint256 id) external view returns (address); + + /** + * @notice Registers an addresses provider + * @dev The PoolAddressesProvider must not already be registered in the registry + * @dev The id must not be used by an already registered PoolAddressesProvider + * @param provider The address of the new PoolAddressesProvider + * @param id The id for the new PoolAddressesProvider, referring to the market it belongs to + **/ + function registerAddressesProvider(address provider, uint256 id) external; + + /** + * @notice Removes an addresses provider from the list of registered addresses providers + * @param provider The PoolAddressesProvider address + **/ + function unregisterAddressesProvider(address provider) external; +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol new file mode 100644 index 00000000..f5cb3d37 --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {Ownable} from '../../dependencies/openzeppelin/contracts/Ownable.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; +import {IPoolAddressesProviderRegistry} from '../../interfaces/IPoolAddressesProviderRegistry.sol'; + +/** + * @title PoolAddressesProviderRegistry + * @author Aave + * @notice Main registry of PoolAddressesProvider of Aave markets. + * @dev Used for indexing purposes of Aave protocol's markets. The id assigned to a PoolAddressesProvider refers to the + * market it is connected with, for example with `1` for the Aave main market and `2` for the next created. + **/ +contract PoolAddressesProviderRegistry is Ownable, IPoolAddressesProviderRegistry { + // Map of address provider ids (addressesProvider => id) + mapping(address => uint256) private _addressesProviderToId; + // Map of id to address provider (id => addressesProvider) + mapping(uint256 => address) private _idToAddressesProvider; + // List of addresses providers + address[] private _addressesProvidersList; + // Map of address provider list indexes (addressesProvider => indexInList) + mapping(address => uint256) private _addressesProvidersIndexes; + + /** + * @dev Constructor. + * @param owner The owner address of this contract. + */ + constructor(address owner) { + transferOwnership(owner); + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function getAddressesProvidersList() external view override returns (address[] memory) { + return _addressesProvidersList; + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function registerAddressesProvider(address provider, uint256 id) external override onlyOwner { + require(id != 0, Errors.INVALID_ADDRESSES_PROVIDER_ID); + require(_idToAddressesProvider[id] == address(0), Errors.INVALID_ADDRESSES_PROVIDER_ID); + require(_addressesProviderToId[provider] == 0, Errors.ADDRESSES_PROVIDER_ALREADY_ADDED); + + _addressesProviderToId[provider] = id; + _idToAddressesProvider[id] = provider; + + _addToAddressesProvidersList(provider); + emit AddressesProviderRegistered(provider, id); + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function unregisterAddressesProvider(address provider) external override onlyOwner { + require(_addressesProviderToId[provider] != 0, Errors.ADDRESSES_PROVIDER_NOT_REGISTERED); + uint256 oldId = _addressesProviderToId[provider]; + _idToAddressesProvider[oldId] = address(0); + _addressesProviderToId[provider] = 0; + + _removeFromAddressesProvidersList(provider); + + emit AddressesProviderUnregistered(provider, oldId); + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function getAddressesProviderIdByAddress(address addressesProvider) + external + view + override + returns (uint256) + { + return _addressesProviderToId[addressesProvider]; + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function getAddressesProviderAddressById(uint256 id) external view override returns (address) { + return _idToAddressesProvider[id]; + } + + /** + * @notice Adds the addresses provider address to the list. + * @param provider The address of the PoolAddressesProvider + */ + function _addToAddressesProvidersList(address provider) internal { + _addressesProvidersIndexes[provider] = _addressesProvidersList.length; + _addressesProvidersList.push(provider); + } + + /** + * @notice Removes the addresses provider address from the list. + * @param provider The address of the PoolAddressesProvider + */ + function _removeFromAddressesProvidersList(address provider) internal { + uint256 index = _addressesProvidersIndexes[provider]; + + _addressesProvidersIndexes[provider] = 0; + + // Swap the index of the last addresses provider in the list with the index of the provider to remove + uint256 lastIndex = _addressesProvidersList.length - 1; + if (index < lastIndex) { + address lastProvider = _addressesProvidersList[lastIndex]; + _addressesProvidersList[index] = lastProvider; + _addressesProvidersIndexes[lastProvider] = index; + } + _addressesProvidersList.pop(); + } +} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..640e4632 --- /dev/null +++ b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' + string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL.sol new file mode 100644 index 00000000..09a7d9d6 --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL.sol @@ -0,0 +1,4995 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol + +/** + * @title Proxy + * @dev Implements delegation of calls to other contracts, with proper + * forwarding of return values and bubbling of failures. + * It defines a fallback function that delegates all calls to the address + * returned by the abstract _implementation() internal function. + */ +abstract contract Proxy { + /** + * @dev Fallback function. + * Will run if no other function in the contract matches the call data. + * Implemented entirely in `_fallback`. + */ + fallback() external payable { + _fallback(); + } + + /** + * @dev Fallback function that will run if call data is empty. + * IMPORTANT. receive() on implementation contracts will be unreachable + */ + receive() external payable { + _fallback(); + } + + /** + * @return The Address of the implementation. + */ + function _implementation() internal view virtual returns (address); + + /** + * @dev Delegates execution to an implementation contract. + * This is a low level function that doesn't return to its internal call site. + * It will return to the external caller whatever the implementation returns. + * @param implementation Address to delegate. + */ + function _delegate(address implementation) internal { + //solium-disable-next-line + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + /** + * @dev Function that is run as the first thing in the fallback function. + * Can be redefined in derived contracts to add functionality. + * Redefinitions must call super._willFallback(). + */ + function _willFallback() internal virtual {} + + /** + * @dev fallback implementation. + * Extracted to enable manual triggering. + */ + function _fallback() internal { + _willFallback(); + _delegate(_implementation()); + } +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol + +library ConfiguratorInputTypes { + struct InitReserveInput { + address aTokenImpl; + address variableDebtTokenImpl; + bool useVirtualBalance; + address interestRateStrategyAddress; + address underlyingAsset; + address treasury; + address incentivesController; + string aTokenName; + string aTokenSymbol; + string variableDebtTokenName; + string variableDebtTokenSymbol; + bytes params; + bytes interestRateData; + } + + struct UpdateATokenInput { + address asset; + address treasury; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } + + struct UpdateDebtTokenInput { + address asset; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol + +/** + * @title IPoolDataProvider + * @author Aave + * @notice Defines the basic interface of a PoolDataProvider + */ +interface IPoolDataProvider { + struct TokenData { + string symbol; + address tokenAddress; + } + + /** + * @notice Returns the address for the PoolAddressesProvider contract. + * @return The address for the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the list of the existing reserves in the pool. + * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. + * @return The list of reserves, pairs of symbols and addresses + */ + function getAllReservesTokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the list of the existing ATokens in the pool. + * @return The list of ATokens, pairs of symbols and addresses + */ + function getAllATokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the configuration data of the reserve + * @dev Not returning borrow and supply caps for compatibility, nor pause flag + * @param asset The address of the underlying asset of the reserve + * @return decimals The number of decimals of the reserve + * @return ltv The ltv of the reserve + * @return liquidationThreshold The liquidationThreshold of the reserve + * @return liquidationBonus The liquidationBonus of the reserve + * @return reserveFactor The reserveFactor of the reserve + * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise + * @return borrowingEnabled True if borrowing is enabled, false otherwise + * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise + * @return isActive True if it is active, false otherwise + * @return isFrozen True if it is frozen, false otherwise + */ + function getReserveConfigurationData( + address asset + ) + external + view + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ); + + /** + * @notice Returns the caps parameters of the reserve + * @param asset The address of the underlying asset of the reserve + * @return borrowCap The borrow cap of the reserve + * @return supplyCap The supply cap of the reserve + */ + function getReserveCaps( + address asset + ) external view returns (uint256 borrowCap, uint256 supplyCap); + + /** + * @notice Returns if the pool is paused + * @param asset The address of the underlying asset of the reserve + * @return isPaused True if the pool is paused, false otherwise + */ + function getPaused(address asset) external view returns (bool isPaused); + + /** + * @notice Returns the siloed borrowing flag + * @param asset The address of the underlying asset of the reserve + * @return True if the asset is siloed for borrowing + */ + function getSiloedBorrowing(address asset) external view returns (bool); + + /** + * @notice Returns the protocol fee on the liquidation bonus + * @param asset The address of the underlying asset of the reserve + * @return The protocol fee on liquidation + */ + function getLiquidationProtocolFee(address asset) external view returns (uint256); + + /** + * @notice Returns the unbacked mint cap of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The unbacked mint cap of the reserve + */ + function getUnbackedMintCap(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The debt ceiling of the reserve + */ + function getDebtCeiling(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling decimals + * @return The debt ceiling decimals + */ + function getDebtCeilingDecimals() external pure returns (uint256); + + /** + * @notice Returns the reserve data + * @param asset The address of the underlying asset of the reserve + * @return unbacked The amount of unbacked tokens + * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted + * @return totalAToken The total supply of the aToken + * @return totalStableDebt The total stable debt of the reserve + * @return totalVariableDebt The total variable debt of the reserve + * @return liquidityRate The liquidity rate of the reserve + * @return variableBorrowRate The variable borrow rate of the reserve + * @return stableBorrowRate The stable borrow rate of the reserve + * @return averageStableBorrowRate The average stable borrow rate of the reserve + * @return liquidityIndex The liquidity index of the reserve + * @return variableBorrowIndex The variable borrow index of the reserve + * @return lastUpdateTimestamp The timestamp of the last update of the reserve + */ + function getReserveData( + address asset + ) + external + view + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ); + + /** + * @notice Returns the total supply of aTokens for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total supply of the aToken + */ + function getATokenTotalSupply(address asset) external view returns (uint256); + + /** + * @notice Returns the total debt for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total debt for asset + */ + function getTotalDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the user data in a reserve + * @param asset The address of the underlying asset of the reserve + * @param user The address of the user + * @return currentATokenBalance The current AToken balance of the user + * @return currentStableDebt The current stable debt of the user + * @return currentVariableDebt The current variable debt of the user + * @return principalStableDebt The principal stable debt of the user + * @return scaledVariableDebt The scaled variable debt of the user + * @return stableBorrowRate The stable borrow rate of the user + * @return liquidityRate The liquidity rate of the reserve + * @return stableRateLastUpdated The timestamp of the last update of the user stable rate + * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false + * otherwise + */ + function getUserReserveData( + address asset, + address user + ) + external + view + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ); + + /** + * @notice Returns the token addresses of the reserve + * @param asset The address of the underlying asset of the reserve + * @return aTokenAddress The AToken address of the reserve + * @return stableDebtTokenAddress DEPRECATED in v3.2.0 + * @return variableDebtTokenAddress The VariableDebtToken address of the reserve + */ + function getReserveTokensAddresses( + address asset + ) + external + view + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ); + + /** + * @notice Returns the address of the Interest Rate strategy + * @param asset The address of the underlying asset of the reserve + * @return irStrategyAddress The address of the Interest Rate strategy + */ + function getInterestRateStrategyAddress( + address asset + ) external view returns (address irStrategyAddress); + + /** + * @notice Returns whether the reserve has FlashLoans enabled or disabled + * @param asset The address of the underlying asset of the reserve + * @return True if FlashLoans are enabled, false otherwise + */ + function getFlashLoanEnabled(address asset) external view returns (bool); + + /** + * @notice Returns whether virtual accounting is enabled/not for a reserve + * @param asset The address of the underlying asset of the reserve + * @return True if active, false otherwise + */ + function getIsVirtualAccActive(address asset) external view returns (bool); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint256); +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol + +/** + * @title BaseUpgradeabilityProxy + * @dev This contract implements a proxy that allows to change the + * implementation address to which it will delegate. + * Such a change is called an implementation upgrade. + */ +contract BaseUpgradeabilityProxy is Proxy { + /** + * @dev Emitted when the implementation is upgraded. + * @param implementation Address of the new implementation. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Storage slot with the address of the current implementation. + * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is + * validated in the constructor. + */ + bytes32 internal constant IMPLEMENTATION_SLOT = + 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + /** + * @dev Returns the current implementation. + * @return impl Address of the current implementation + */ + function _implementation() internal view override returns (address impl) { + bytes32 slot = IMPLEMENTATION_SLOT; + //solium-disable-next-line + assembly { + impl := sload(slot) + } + } + + /** + * @dev Upgrades the proxy to a new implementation. + * @param newImplementation Address of the new implementation. + */ + function _upgradeTo(address newImplementation) internal { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + } + + /** + * @dev Sets the implementation address of the proxy. + * @param newImplementation Address of the new implementation. + */ + function _setImplementation(address newImplementation) internal { + require( + Address.isContract(newImplementation), + 'Cannot set a proxy implementation to a non-contract address' + ); + + bytes32 slot = IMPLEMENTATION_SLOT; + + //solium-disable-next-line + assembly { + sstore(slot, newImplementation) + } + } +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol + +/** + * @title InitializableUpgradeabilityProxy + * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing + * implementation and init data. + */ +contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { + /** + * @dev Contract initializer. + * @param _logic Address of the initial implementation. + * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. + */ + function initialize(address _logic, bytes memory _data) public payable { + require(_implementation() == address(0)); + assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); + _setImplementation(_logic); + if (_data.length > 0) { + (bool success, ) = _logic.delegatecall(_data); + require(success); + } + } +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol + +/** + * @title IDefaultInterestRateStrategyV2 + * @author BGD Labs + * @notice Interface of the default interest rate strategy used by the Aave protocol + */ +interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { + /** + * @notice Holds the interest rate data for a given reserve + * + * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This + * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. + * + * @param optimalUsageRatio The optimal usage ratio, in bps + * @param baseVariableBorrowRate The base variable borrow rate, in bps + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps + */ + struct InterestRateData { + uint16 optimalUsageRatio; + uint32 baseVariableBorrowRate; + uint32 variableRateSlope1; + uint32 variableRateSlope2; + } + + /** + * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, + * used in in-memory calculations. + * + * @param optimalUsageRatio The optimal usage ratio + * @param baseVariableBorrowRate The base variable borrow rate + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio + */ + struct InterestRateDataRay { + uint256 optimalUsageRatio; + uint256 baseVariableBorrowRate; + uint256 variableRateSlope1; + uint256 variableRateSlope2; + } + + /** + * @notice emitted when new interest rate data is set in a reserve + * + * @param reserve address of the reserve that has new interest rate data set + * @param optimalUsageRatio The optimal usage ratio, in bps + * @param baseVariableBorrowRate The base variable borrow rate, in bps + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps + */ + event RateDataUpdate( + address indexed reserve, + uint256 optimalUsageRatio, + uint256 baseVariableBorrowRate, + uint256 variableRateSlope1, + uint256 variableRateSlope2 + ); + + /** + * @notice Returns the address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the maximum value achievable for variable borrow rate, in bps + * @return The maximum rate + */ + function MAX_BORROW_RATE() external view returns (uint256); + + /** + * @notice Returns the minimum optimal point, in bps + * @return The optimal point + */ + function MIN_OPTIMAL_POINT() external view returns (uint256); + + /** + * @notice Returns the maximum optimal point, in bps + * @return The optimal point + */ + function MAX_OPTIMAL_POINT() external view returns (uint256); + + /** + * notice Returns the full InterestRateData object for the given reserve, in ray + * + * @param reserve The reserve to get the data of + * + * @return The InterestRateDataRay object for the given reserve + */ + function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); + + /** + * notice Returns the full InterestRateDataRay object for the given reserve, in bps + * + * @param reserve The reserve to get the data of + * + * @return The InterestRateData object for the given reserve + */ + function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); + + /** + * @notice Returns the optimal usage rate for the given reserve in ray + * + * @param reserve The reserve to get the optimal usage rate of + * + * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate + */ + function getOptimalUsageRatio(address reserve) external view returns (uint256); + + /** + * @notice Returns the variable rate slope below optimal usage ratio in ray + * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO + * + * @param reserve The reserve to get the variable rate slope 1 of + * + * @return The variable rate slope + */ + function getVariableRateSlope1(address reserve) external view returns (uint256); + + /** + * @notice Returns the variable rate slope above optimal usage ratio in ray + * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO + * + * @param reserve The reserve to get the variable rate slope 2 of + * + * @return The variable rate slope + */ + function getVariableRateSlope2(address reserve) external view returns (uint256); + + /** + * @notice Returns the base variable borrow rate, in ray + * + * @param reserve The reserve to get the base variable borrow rate of + * + * @return The base variable borrow rate + */ + function getBaseVariableBorrowRate(address reserve) external view returns (uint256); + + /** + * @notice Returns the maximum variable borrow rate, in ray + * + * @param reserve The reserve to get the maximum variable borrow rate of + * + * @return The maximum variable borrow rate + */ + function getMaxVariableBorrowRate(address reserve) external view returns (uint256); + + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The reserve interest rate data to apply to the given reserve + * Being specific to this custom implementation, with custom struct type, + * overloading the function on the generic interface + */ + function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol + +/** + * @title BaseImmutableAdminUpgradeabilityProxy + * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern + * @notice This contract combines an upgradeability proxy with an authorization + * mechanism for administrative tasks. + * @dev The admin role is stored in an immutable, which helps saving transactions costs + * All external functions in this contract must be guarded by the + * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity + * feature proposal that would enable this to be done automatically. + */ +contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + address internal immutable _admin; + + /** + * @dev Constructor. + * @param admin_ The address of the admin + */ + constructor(address admin_) { + _admin = admin_; + } + + modifier ifAdmin() { + if (msg.sender == _admin) { + _; + } else { + _fallback(); + } + } + + /** + * @notice Return the admin address + * @return The address of the proxy admin. + */ + function admin() external ifAdmin returns (address) { + return _admin; + } + + /** + * @notice Return the implementation address + * @return The address of the implementation. + */ + function implementation() external ifAdmin returns (address) { + return _implementation(); + } + + /** + * @notice Upgrade the backing implementation of the proxy. + * @dev Only the admin can call this function. + * @param newImplementation The address of the new implementation. + */ + function upgradeTo(address newImplementation) external ifAdmin { + _upgradeTo(newImplementation); + } + + /** + * @notice Upgrade the backing implementation of the proxy and call a function + * on the new implementation. + * @dev This is useful to initialize the proxied contract. + * @param newImplementation The address of the new implementation. + * @param data Data to send as msg.data in the low level call. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + */ + function upgradeToAndCall( + address newImplementation, + bytes calldata data + ) external payable ifAdmin { + _upgradeTo(newImplementation); + (bool success, ) = newImplementation.delegatecall(data); + require(success); + } + + /** + * @notice Only fall back when the sender is not the admin. + */ + function _willFallback() internal virtual override { + require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); + super._willFallback(); + } +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolConfigurator.sol + +/** + * @title IPoolConfigurator + * @author Aave + * @notice Defines the basic interface for a Pool configurator. + */ +interface IPoolConfigurator { + /** + * @dev Emitted when a reserve is initialized. + * @param asset The address of the underlying asset of the reserve + * @param aToken The address of the associated aToken contract + * @param stableDebtToken, DEPRECATED in v3.2.0 + * @param variableDebtToken The address of the associated variable rate debt token + * @param interestRateStrategyAddress The address of the interest rate strategy for the reserve + */ + event ReserveInitialized( + address indexed asset, + address indexed aToken, + address stableDebtToken, + address variableDebtToken, + address interestRateStrategyAddress + ); + + /** + * @dev Emitted when borrowing is enabled or disabled on a reserve. + * @param asset The address of the underlying asset of the reserve + * @param enabled True if borrowing is enabled, false otherwise + */ + event ReserveBorrowing(address indexed asset, bool enabled); + + /** + * @dev Emitted when flashloans are enabled or disabled on a reserve. + * @param asset The address of the underlying asset of the reserve + * @param enabled True if flashloans are enabled, false otherwise + */ + event ReserveFlashLoaning(address indexed asset, bool enabled); + + /** + * @dev Emitted when the ltv is set for the frozen asset. + * @param asset The address of the underlying asset of the reserve + * @param ltv The loan to value of the asset when used as collateral + */ + event PendingLtvChanged(address indexed asset, uint256 ltv); + + /** + * @dev Emitted when the collateralization risk parameters for the specified asset are updated. + * @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 + */ + event CollateralConfigurationChanged( + address indexed asset, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus + ); + + /** + * @dev Emitted when a reserve is activated or deactivated + * @param asset The address of the underlying asset of the reserve + * @param active True if reserve is active, false otherwise + */ + event ReserveActive(address indexed asset, bool active); + + /** + * @dev Emitted when a reserve is frozen or unfrozen + * @param asset The address of the underlying asset of the reserve + * @param frozen True if reserve is frozen, false otherwise + */ + event ReserveFrozen(address indexed asset, bool frozen); + + /** + * @dev Emitted when a reserve is paused or unpaused + * @param asset The address of the underlying asset of the reserve + * @param paused True if reserve is paused, false otherwise + */ + event ReservePaused(address indexed asset, bool paused); + + /** + * @dev Emitted when a reserve is dropped. + * @param asset The address of the underlying asset of the reserve + */ + event ReserveDropped(address indexed asset); + + /** + * @dev Emitted when a reserve factor is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldReserveFactor The old reserve factor, expressed in bps + * @param newReserveFactor The new reserve factor, expressed in bps + */ + event ReserveFactorChanged( + address indexed asset, + uint256 oldReserveFactor, + uint256 newReserveFactor + ); + + /** + * @dev Emitted when the borrow cap of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldBorrowCap The old borrow cap + * @param newBorrowCap The new borrow cap + */ + event BorrowCapChanged(address indexed asset, uint256 oldBorrowCap, uint256 newBorrowCap); + + /** + * @dev Emitted when the supply cap of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldSupplyCap The old supply cap + * @param newSupplyCap The new supply cap + */ + event SupplyCapChanged(address indexed asset, uint256 oldSupplyCap, uint256 newSupplyCap); + + /** + * @dev Emitted when the liquidation protocol fee of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldFee The old liquidation protocol fee, expressed in bps + * @param newFee The new liquidation protocol fee, expressed in bps + */ + event LiquidationProtocolFeeChanged(address indexed asset, uint256 oldFee, uint256 newFee); + + /** + * @dev Emitted when the liquidation grace period is updated. + * @param asset The address of the underlying asset of the reserve + * @param gracePeriodUntil Timestamp until when liquidations will not be allowed post-unpause + */ + event LiquidationGracePeriodChanged(address indexed asset, uint40 gracePeriodUntil); + + /** + * @dev Emitted when the liquidation grace period is disabled. + * @param asset The address of the underlying asset of the reserve + */ + event LiquidationGracePeriodDisabled(address indexed asset); + + /** + * @dev Emitted when the unbacked mint cap of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldUnbackedMintCap The old unbacked mint cap + * @param newUnbackedMintCap The new unbacked mint cap + */ + event UnbackedMintCapChanged( + address indexed asset, + uint256 oldUnbackedMintCap, + uint256 newUnbackedMintCap + ); + + /** + * @dev Emitted when an collateral configuration of an asset in an eMode is changed. + * @param asset The address of the underlying asset of the reserve + * @param categoryId The eMode category + * @param collateral True if the asset is enabled as collateral in the eMode, false otherwise. + */ + event AssetCollateralInEModeChanged(address indexed asset, uint8 categoryId, bool collateral); + + /** + * @dev Emitted when the borrowable configuration of an asset in an eMode changed. + * @param asset The address of the underlying asset of the reserve + * @param categoryId The eMode category + * @param borrowable True if the asset is enabled as borrowable in the eMode, false otherwise. + */ + event AssetBorrowableInEModeChanged(address indexed asset, uint8 categoryId, bool borrowable); + + /** + * @dev Emitted when a new eMode category is added or an existing category is altered. + * @param categoryId The new eMode category id + * @param ltv The ltv for the asset category in eMode + * @param liquidationThreshold The liquidationThreshold for the asset category in eMode + * @param liquidationBonus The liquidationBonus for the asset category in eMode + * @param oracle DEPRECATED in v3.2.0 + * @param label A human readable identifier for the category + */ + event EModeCategoryAdded( + uint8 indexed categoryId, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + address oracle, + string label + ); + + /** + * @dev Emitted when a reserve interest strategy contract is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldStrategy The address of the old interest strategy contract + * @param newStrategy The address of the new interest strategy contract + */ + event ReserveInterestRateStrategyChanged( + address indexed asset, + address oldStrategy, + address newStrategy + ); + + /** + * @dev Emitted when the data of a reserve interest strategy contract is updated. + * @param asset The address of the underlying asset of the reserve + * @param data abi encoded data + */ + event ReserveInterestRateDataChanged(address indexed asset, address indexed strategy, bytes data); + + /** + * @dev Emitted when an aToken implementation is upgraded. + * @param asset The address of the underlying asset of the reserve + * @param proxy The aToken proxy address + * @param implementation The new aToken implementation + */ + event ATokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @dev Emitted when the implementation of a variable debt token is upgraded. + * @param asset The address of the underlying asset of the reserve + * @param proxy The variable debt token proxy address + * @param implementation The new aToken implementation + */ + event VariableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @dev Emitted when the debt ceiling of an asset is set. + * @param asset The address of the underlying asset of the reserve + * @param oldDebtCeiling The old debt ceiling + * @param newDebtCeiling The new debt ceiling + */ + event DebtCeilingChanged(address indexed asset, uint256 oldDebtCeiling, uint256 newDebtCeiling); + + /** + * @dev Emitted when the the siloed borrowing state for an asset is changed. + * @param asset The address of the underlying asset of the reserve + * @param oldState The old siloed borrowing state + * @param newState The new siloed borrowing state + */ + event SiloedBorrowingChanged(address indexed asset, bool oldState, bool newState); + + /** + * @dev Emitted when the bridge protocol fee is updated. + * @param oldBridgeProtocolFee The old protocol fee, expressed in bps + * @param newBridgeProtocolFee The new protocol fee, expressed in bps + */ + event BridgeProtocolFeeUpdated(uint256 oldBridgeProtocolFee, uint256 newBridgeProtocolFee); + + /** + * @dev Emitted when the total premium on flashloans is updated. + * @param oldFlashloanPremiumTotal The old premium, expressed in bps + * @param newFlashloanPremiumTotal The new premium, expressed in bps + */ + event FlashloanPremiumTotalUpdated( + uint128 oldFlashloanPremiumTotal, + uint128 newFlashloanPremiumTotal + ); + + /** + * @dev Emitted when the part of the premium that goes to protocol is updated. + * @param oldFlashloanPremiumToProtocol The old premium, expressed in bps + * @param newFlashloanPremiumToProtocol The new premium, expressed in bps + */ + event FlashloanPremiumToProtocolUpdated( + uint128 oldFlashloanPremiumToProtocol, + uint128 newFlashloanPremiumToProtocol + ); + + /** + * @dev Emitted when the reserve is set as borrowable/non borrowable in isolation mode. + * @param asset The address of the underlying asset of the reserve + * @param borrowable True if the reserve is borrowable in isolation, false otherwise + */ + event BorrowableInIsolationChanged(address asset, bool borrowable); + + /** + * @notice Initializes multiple reserves. + * @dev param useVirtualBalance of the input struct should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param input The array of initialization parameters + */ + function initReserves(ConfiguratorInputTypes.InitReserveInput[] calldata input) external; + + /** + * @dev Updates the aToken implementation for the reserve. + * @param input The aToken update parameters + */ + function updateAToken(ConfiguratorInputTypes.UpdateATokenInput calldata input) external; + + /** + * @notice Updates the variable debt token implementation for the asset. + * @param input The variableDebtToken update parameters + */ + function updateVariableDebtToken( + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external; + + /** + * @notice Configures borrowing on a reserve. + * @param asset The address of the underlying asset of the reserve + * @param enabled True if borrowing needs to be enabled, false otherwise + */ + function setReserveBorrowing(address asset, bool enabled) external; + + /** + * @notice Configures the reserve collateralization parameters. + * @dev All the values are expressed in bps. A value of 10000, results in 100.00% + * @dev The `liquidationBonus` is always above 100%. A value of 105% means the liquidator will receive a 5% bonus + * @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 + */ + function configureReserveAsCollateral( + address asset, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus + ) external; + + /** + * @notice Enable or disable flashloans on a reserve + * @param asset The address of the underlying asset of the reserve + * @param enabled True if flashloans need to be enabled, false otherwise + */ + function setReserveFlashLoaning(address asset, bool enabled) external; + + /** + * @notice Activate or deactivate a reserve + * @param asset The address of the underlying asset of the reserve + * @param active True if the reserve needs to be active, false otherwise + */ + function setReserveActive(address asset, bool active) external; + + /** + * @notice Freeze or unfreeze a reserve. A frozen reserve doesn't allow any new supply, borrow + * or rate swap but allows repayments, liquidations, rate rebalances and withdrawals. + * @param asset The address of the underlying asset of the reserve + * @param freeze True if the reserve needs to be frozen, false otherwise + */ + function setReserveFreeze(address asset, bool freeze) external; + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the + * borrowed amount will be accumulated in the isolated collateral's total debt exposure + * @dev Only assets of the same family (e.g. USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations + * @param asset The address of the underlying asset of the reserve + * @param borrowable True if the asset should be borrowable in isolation, false otherwise + */ + function setBorrowableInIsolation(address asset, bool borrowable) external; + + /** + * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, + * swap interest rate, liquidate, atoken transfers). + * @param asset The address of the underlying asset of the reserve + * @param paused True if pausing the reserve, false if unpausing + * @param gracePeriod Count of seconds after unpause during which liquidations will not be available + * - Only applicable whenever unpausing (`paused` as false) + * - Passing 0 means no grace period + * - Capped to maximum MAX_GRACE_PERIOD + */ + function setReservePause(address asset, bool paused, uint40 gracePeriod) external; + + /** + * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, + * swap interest rate, liquidate, atoken transfers). + * @dev Version with no grace period + * @param asset The address of the underlying asset of the reserve + * @param paused True if pausing the reserve, false if unpausing + */ + function setReservePause(address asset, bool paused) external; + + /** + * @notice Disables liquidation grace period for the asset. The liquidation grace period is set in the past + * so that liquidations are allowed for the asset. + * @param asset The address of the underlying asset of the reserve + */ + function disableLiquidationGracePeriod(address asset) external; + + /** + * @notice Updates the reserve factor of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newReserveFactor The new reserve factor of the reserve + */ + function setReserveFactor(address asset, uint256 newReserveFactor) external; + + /** + * @notice Sets the interest rate strategy of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newRateStrategyAddress The address of the new interest strategy contract + * @param rateData bytes-encoded rate data. In this format in order to allow the rate strategy contract + * to de-structure custom data + */ + function setReserveInterestRateStrategyAddress( + address asset, + address newRateStrategyAddress, + bytes calldata rateData + ) external; + + /** + * @notice Sets interest rate data for a reserve + * @param asset The address of the underlying asset of the reserve + * @param rateData bytes-encoded rate data. In this format in order to allow the rate strategy contract + * to de-structure custom data + */ + function setReserveInterestRateData(address asset, bytes calldata rateData) external; + + /** + * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions + * are suspended. + * @param paused True if protocol needs to be paused, false otherwise + * @param gracePeriod Count of seconds after unpause during which liquidations will not be available + * - Only applicable whenever unpausing (`paused` as false) + * - Passing 0 means no grace period + * - Capped to maximum MAX_GRACE_PERIOD + */ + function setPoolPause(bool paused, uint40 gracePeriod) external; + + /** + * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions + * are suspended. + * @dev Version with no grace period + * @param paused True if protocol needs to be paused, false otherwise + */ + function setPoolPause(bool paused) external; + + /** + * @notice Updates the borrow cap of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newBorrowCap The new borrow cap of the reserve + */ + function setBorrowCap(address asset, uint256 newBorrowCap) external; + + /** + * @notice Updates the supply cap of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newSupplyCap The new supply cap of the reserve + */ + function setSupplyCap(address asset, uint256 newSupplyCap) external; + + /** + * @notice Updates the liquidation protocol fee of reserve. + * @param asset The address of the underlying asset of the reserve + * @param newFee The new liquidation protocol fee of the reserve, expressed in bps + */ + function setLiquidationProtocolFee(address asset, uint256 newFee) external; + + /** + * @notice Updates the unbacked mint cap of reserve. + * @param asset The address of the underlying asset of the reserve + * @param newUnbackedMintCap The new unbacked mint cap of the reserve + */ + function setUnbackedMintCap(address asset, uint256 newUnbackedMintCap) external; + + /** + * @notice Enables/disables an asset to be borrowable in a selected eMode. + * - eMode.borrowable always has less priority then reserve.borrowable + * @param asset The address of the underlying asset of the reserve + * @param categoryId The eMode categoryId + * @param borrowable True if the asset should be borrowable in the given eMode category, false otherwise. + */ + function setAssetBorrowableInEMode(address asset, uint8 categoryId, bool borrowable) external; + + /** + * @notice Enables/disables an asset to be collateral in a selected eMode. + * @param asset The address of the underlying asset of the reserve + * @param categoryId The eMode categoryId + * @param collateral True if the asset should be collateral in the given eMode category, false otherwise. + */ + function setAssetCollateralInEMode(address asset, uint8 categoryId, bool collateral) external; + + /** + * @notice Adds a new efficiency mode (eMode) category or alters a existing one. + * @param categoryId The id of the category to be configured + * @param ltv The ltv associated with the category + * @param liquidationThreshold The liquidation threshold associated with the category + * @param liquidationBonus The liquidation bonus associated with the category + * @param label A label identifying the category + */ + function setEModeCategory( + uint8 categoryId, + uint16 ltv, + uint16 liquidationThreshold, + uint16 liquidationBonus, + string calldata label + ) external; + + /** + * @notice Drops a reserve entirely. + * @param asset The address of the reserve to drop + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the bridge fee collected by the protocol reserves. + * @param newBridgeProtocolFee The part of the fee sent to the protocol treasury, expressed in bps + */ + function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external; + + /** + * @notice Updates the total flash loan premium. + * Total flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra balance + * - A part is collected by the protocol reserves + * @dev Expressed in bps + * @dev The premium is calculated on the total amount borrowed + * @param newFlashloanPremiumTotal The total flashloan premium + */ + function updateFlashloanPremiumTotal(uint128 newFlashloanPremiumTotal) external; + + /** + * @notice Updates the flash loan premium collected by protocol reserves + * @dev Expressed in bps + * @dev The premium to protocol is calculated on the total flashloan premium + * @param newFlashloanPremiumToProtocol The part of the flashloan premium sent to the protocol treasury + */ + function updateFlashloanPremiumToProtocol(uint128 newFlashloanPremiumToProtocol) external; + + /** + * @notice Sets the debt ceiling for an asset. + * @param newDebtCeiling The new debt ceiling + */ + function setDebtCeiling(address asset, uint256 newDebtCeiling) external; + + /** + * @notice Sets siloed borrowing for an asset + * @param siloed The new siloed borrowing state + */ + function setSiloedBorrowing(address asset, bool siloed) external; + + /** + * @notice Gets pending ltv value + * @param asset The new siloed borrowing state + */ + function getPendingLtv(address asset) external view returns (uint256); + + /** + * @notice Gets the address of the external ConfiguratorLogic + */ + function getConfiguratorLogic() external view returns (address); + + /** + * @notice Gets the maximum liquidations grace period allowed, in seconds + */ + function MAX_GRACE_PERIOD() external view returns (uint40); +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol + +/** + * @title InitializableAdminUpgradeabilityProxy + * @author Aave + * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function + */ +contract InitializableImmutableAdminUpgradeabilityProxy is + BaseImmutableAdminUpgradeabilityProxy, + InitializableUpgradeabilityProxy +{ + /** + * @dev Constructor. + * @param admin The address of the admin + */ + constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { + // Intentionally left blank + } + + /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy + function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { + BaseImmutableAdminUpgradeabilityProxy._willFallback(); + } +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol + +/** + * @title ConfiguratorLogic library + * @author Aave + * @notice Implements the functions to initialize reserves and update aTokens and debtTokens + */ +library ConfiguratorLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPoolConfigurator` for descriptions + event ReserveInitialized( + address indexed asset, + address indexed aToken, + address stableDebtToken, + address variableDebtToken, + address interestRateStrategyAddress + ); + event ATokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + event VariableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @notice Initialize a reserve by creating and initializing aToken and variable debt token + * @dev Emits the `ReserveInitialized` event + * @param pool The Pool in which the reserve will be initialized + * @param input The needed parameters for the initialization + */ + function executeInitReserve( + IPool pool, + ConfiguratorInputTypes.InitReserveInput calldata input + ) external { + // It is an assumption that the asset listed is non-malicious, and the external call doesn't create re-entrancies + uint8 underlyingAssetDecimals = IERC20Detailed(input.underlyingAsset).decimals(); + require(underlyingAssetDecimals > 5, Errors.INVALID_DECIMALS); + + address aTokenProxyAddress = _initTokenWithProxy( + input.aTokenImpl, + abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + pool, + input.treasury, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.aTokenName, + input.aTokenSymbol, + input.params + ) + ); + + address variableDebtTokenProxyAddress = _initTokenWithProxy( + input.variableDebtTokenImpl, + abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + pool, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.variableDebtTokenName, + input.variableDebtTokenSymbol, + input.params + ) + ); + + pool.initReserve( + input.underlyingAsset, + aTokenProxyAddress, + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + + DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); + + currentConfig.setDecimals(underlyingAssetDecimals); + + currentConfig.setActive(true); + currentConfig.setPaused(false); + currentConfig.setFrozen(false); + currentConfig.setVirtualAccActive(input.useVirtualBalance); + + pool.setConfiguration(input.underlyingAsset, currentConfig); + + IReserveInterestRateStrategy(input.interestRateStrategyAddress).setInterestRateParams( + input.underlyingAsset, + input.interestRateData + ); + + emit ReserveInitialized( + input.underlyingAsset, + aTokenProxyAddress, + address(0), + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + } + + /** + * @notice Updates the aToken implementation and initializes it + * @dev Emits the `ATokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the aToken + * @param input The parameters needed for the initialize call + */ + function executeUpdateAToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateATokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + cachedPool, + input.treasury, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); + + emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); + } + + /** + * @notice Updates the variable debt token implementation and initializes it + * @dev Emits the `VariableDebtTokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the variable debt token + * @param input The parameters needed for the initialize call + */ + function executeUpdateVariableDebtToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + cachedPool, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation( + reserveData.variableDebtTokenAddress, + input.implementation, + encodedCall + ); + + emit VariableDebtTokenUpgraded( + input.asset, + reserveData.variableDebtTokenAddress, + input.implementation + ); + } + + /** + * @notice Creates a new proxy and initializes the implementation + * @param implementation The address of the implementation + * @param initParams The parameters that is passed to the implementation to initialize + * @return The address of initialized proxy + */ + function _initTokenWithProxy( + address implementation, + bytes memory initParams + ) internal returns (address) { + InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( + address(this) + ); + + proxy.initialize(implementation, initParams); + + return address(proxy); + } + + /** + * @notice Upgrades the implementation and makes call to the proxy + * @dev The call is used to initialize the new implementation. + * @param proxyAddress The address of the proxy + * @param implementation The address of the new implementation + * @param initParams The parameters to the call after the upgrade + */ + function _upgradeTokenImplementation( + address proxyAddress, + address implementation, + bytes memory initParams + ) internal { + InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( + payable(proxyAddress) + ); + + proxy.upgradeToAndCall(implementation, initParams); + } +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/pool/PoolConfigurator.sol + +/** + * @title PoolConfigurator + * @author Aave + * @dev Implements the configuration methods for the Aave protocol + */ +abstract contract PoolConfigurator is VersionedInitializable, IPoolConfigurator { + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + IPoolAddressesProvider internal _addressesProvider; + IPool internal _pool; + + mapping(address => uint256) internal _pendingLtv; + + uint40 public constant MAX_GRACE_PERIOD = 4 hours; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + _onlyPoolAdmin(); + _; + } + + /** + * @dev Only emergency or pool admin can call functions marked by this modifier. + */ + modifier onlyEmergencyOrPoolAdmin() { + _onlyPoolOrEmergencyAdmin(); + _; + } + + /** + * @dev Only asset listing or pool admin can call functions marked by this modifier. + */ + modifier onlyAssetListingOrPoolAdmins() { + _onlyAssetListingOrPoolAdmins(); + _; + } + + /** + * @dev Only risk or pool admin can call functions marked by this modifier. + */ + modifier onlyRiskOrPoolAdmins() { + _onlyRiskOrPoolAdmins(); + _; + } + + /** + * @dev Only risk, pool or emergency admin can call functions marked by this modifier. + */ + modifier onlyRiskOrPoolOrEmergencyAdmins() { + _onlyRiskOrPoolOrEmergencyAdmins(); + _; + } + + function initialize(IPoolAddressesProvider provider) public virtual; + + /// @inheritdoc IPoolConfigurator + function initReserves( + ConfiguratorInputTypes.InitReserveInput[] calldata input + ) external override onlyAssetListingOrPoolAdmins { + IPool cachedPool = _pool; + + for (uint256 i = 0; i < input.length; i++) { + ConfiguratorLogic.executeInitReserve(cachedPool, input[i]); + emit ReserveInterestRateDataChanged( + input[i].underlyingAsset, + input[i].interestRateStrategyAddress, + input[i].interestRateData + ); + } + } + + /// @inheritdoc IPoolConfigurator + function dropReserve(address asset) external override onlyPoolAdmin { + _pool.dropReserve(asset); + emit ReserveDropped(asset); + } + + /// @inheritdoc IPoolConfigurator + function updateAToken( + ConfiguratorInputTypes.UpdateATokenInput calldata input + ) external override onlyPoolAdmin { + ConfiguratorLogic.executeUpdateAToken(_pool, input); + } + + /// @inheritdoc IPoolConfigurator + function updateVariableDebtToken( + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external override onlyPoolAdmin { + ConfiguratorLogic.executeUpdateVariableDebtToken(_pool, input); + } + + /// @inheritdoc IPoolConfigurator + function setReserveBorrowing(address asset, bool enabled) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setBorrowingEnabled(enabled); + _pool.setConfiguration(asset, currentConfig); + emit ReserveBorrowing(asset, enabled); + } + + /// @inheritdoc IPoolConfigurator + function configureReserveAsCollateral( + address asset, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus + ) external override onlyRiskOrPoolAdmins { + //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_RESERVE_PARAMS); + + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + if (liquidationThreshold != 0) { + //liquidation bonus must be bigger than 100.00%, otherwise the liquidator would receive less + //collateral than needed to cover the debt + require(liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_PARAMS); + + //if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment + //a loan is taken there is enough collateral available to cover the liquidation bonus + require( + liquidationThreshold.percentMul(liquidationBonus) <= PercentageMath.PERCENTAGE_FACTOR, + Errors.INVALID_RESERVE_PARAMS + ); + } else { + require(liquidationBonus == 0, Errors.INVALID_RESERVE_PARAMS); + //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 supplied + _checkNoSuppliers(asset); + } + + uint256 newLtv = ltv; + + if (currentConfig.getFrozen()) { + _pendingLtv[asset] = ltv; + newLtv = 0; + + emit PendingLtvChanged(asset, ltv); + } else { + currentConfig.setLtv(ltv); + } + + currentConfig.setLiquidationThreshold(liquidationThreshold); + currentConfig.setLiquidationBonus(liquidationBonus); + + _pool.setConfiguration(asset, currentConfig); + + emit CollateralConfigurationChanged(asset, newLtv, liquidationThreshold, liquidationBonus); + } + + /// @inheritdoc IPoolConfigurator + function setReserveFlashLoaning( + address asset, + bool enabled + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + currentConfig.setFlashLoanEnabled(enabled); + _pool.setConfiguration(asset, currentConfig); + emit ReserveFlashLoaning(asset, enabled); + } + + /// @inheritdoc IPoolConfigurator + function setReserveActive(address asset, bool active) external override onlyPoolAdmin { + if (!active) _checkNoSuppliers(asset); + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setActive(active); + _pool.setConfiguration(asset, currentConfig); + emit ReserveActive(asset, active); + } + + /// @inheritdoc IPoolConfigurator + function setReserveFreeze( + address asset, + bool freeze + ) external override onlyRiskOrPoolOrEmergencyAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + require(freeze != currentConfig.getFrozen(), Errors.INVALID_FREEZE_STATE); + + currentConfig.setFrozen(freeze); + + uint256 ltvSet; + uint256 pendingLtvSet; + + if (freeze) { + pendingLtvSet = currentConfig.getLtv(); + _pendingLtv[asset] = pendingLtvSet; + currentConfig.setLtv(0); + } else { + ltvSet = _pendingLtv[asset]; + currentConfig.setLtv(ltvSet); + delete _pendingLtv[asset]; + } + + emit PendingLtvChanged(asset, pendingLtvSet); + emit CollateralConfigurationChanged( + asset, + ltvSet, + currentConfig.getLiquidationThreshold(), + currentConfig.getLiquidationBonus() + ); + + _pool.setConfiguration(asset, currentConfig); + emit ReserveFrozen(asset, freeze); + } + + /// @inheritdoc IPoolConfigurator + function setBorrowableInIsolation( + address asset, + bool borrowable + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setBorrowableInIsolation(borrowable); + _pool.setConfiguration(asset, currentConfig); + emit BorrowableInIsolationChanged(asset, borrowable); + } + + /// @inheritdoc IPoolConfigurator + function setReservePause( + address asset, + bool paused, + uint40 gracePeriod + ) public override onlyEmergencyOrPoolAdmin { + if (!paused && gracePeriod != 0) { + require(gracePeriod <= MAX_GRACE_PERIOD, Errors.INVALID_GRACE_PERIOD); + + uint40 until = uint40(block.timestamp) + gracePeriod; + _pool.setLiquidationGracePeriod(asset, until); + emit LiquidationGracePeriodChanged(asset, until); + } + + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setPaused(paused); + _pool.setConfiguration(asset, currentConfig); + emit ReservePaused(asset, paused); + } + + /// @inheritdoc IPoolConfigurator + function setReservePause(address asset, bool paused) external override onlyEmergencyOrPoolAdmin { + setReservePause(asset, paused, 0); + } + + /// @inheritdoc IPoolConfigurator + function disableLiquidationGracePeriod(address asset) external override onlyEmergencyOrPoolAdmin { + // set the liquidation grace period in the past to disable liquidation grace period + _pool.setLiquidationGracePeriod(asset, 0); + + emit LiquidationGracePeriodDisabled(asset); + } + + /// @inheritdoc IPoolConfigurator + function setReserveFactor( + address asset, + uint256 newReserveFactor + ) external override onlyRiskOrPoolAdmins { + require(newReserveFactor <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + _pool.syncIndexesState(asset); + + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldReserveFactor = currentConfig.getReserveFactor(); + currentConfig.setReserveFactor(newReserveFactor); + _pool.setConfiguration(asset, currentConfig); + emit ReserveFactorChanged(asset, oldReserveFactor, newReserveFactor); + + _pool.syncRatesState(asset); + } + + /// @inheritdoc IPoolConfigurator + function setDebtCeiling( + address asset, + uint256 newDebtCeiling + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + uint256 oldDebtCeiling = currentConfig.getDebtCeiling(); + if (currentConfig.getLiquidationThreshold() != 0 && oldDebtCeiling == 0) { + _checkNoSuppliers(asset); + } + currentConfig.setDebtCeiling(newDebtCeiling); + _pool.setConfiguration(asset, currentConfig); + + if (newDebtCeiling == 0) { + _pool.resetIsolationModeTotalDebt(asset); + } + + emit DebtCeilingChanged(asset, oldDebtCeiling, newDebtCeiling); + } + + /// @inheritdoc IPoolConfigurator + function setSiloedBorrowing( + address asset, + bool newSiloed + ) external override onlyRiskOrPoolAdmins { + if (newSiloed) { + _checkNoBorrowers(asset); + } + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + bool oldSiloed = currentConfig.getSiloedBorrowing(); + + currentConfig.setSiloedBorrowing(newSiloed); + + _pool.setConfiguration(asset, currentConfig); + + emit SiloedBorrowingChanged(asset, oldSiloed, newSiloed); + } + + /// @inheritdoc IPoolConfigurator + function setBorrowCap( + address asset, + uint256 newBorrowCap + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldBorrowCap = currentConfig.getBorrowCap(); + currentConfig.setBorrowCap(newBorrowCap); + _pool.setConfiguration(asset, currentConfig); + emit BorrowCapChanged(asset, oldBorrowCap, newBorrowCap); + } + + /// @inheritdoc IPoolConfigurator + function setSupplyCap( + address asset, + uint256 newSupplyCap + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldSupplyCap = currentConfig.getSupplyCap(); + currentConfig.setSupplyCap(newSupplyCap); + _pool.setConfiguration(asset, currentConfig); + emit SupplyCapChanged(asset, oldSupplyCap, newSupplyCap); + } + + /// @inheritdoc IPoolConfigurator + function setLiquidationProtocolFee( + address asset, + uint256 newFee + ) external override onlyRiskOrPoolAdmins { + require(newFee <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_LIQUIDATION_PROTOCOL_FEE); + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldFee = currentConfig.getLiquidationProtocolFee(); + currentConfig.setLiquidationProtocolFee(newFee); + _pool.setConfiguration(asset, currentConfig); + emit LiquidationProtocolFeeChanged(asset, oldFee, newFee); + } + + /// @inheritdoc IPoolConfigurator + function setEModeCategory( + uint8 categoryId, + uint16 ltv, + uint16 liquidationThreshold, + uint16 liquidationBonus, + string calldata label + ) external override onlyRiskOrPoolAdmins { + require(ltv != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); + require(liquidationThreshold != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); + + // 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_EMODE_CATEGORY_PARAMS); + require( + liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, + Errors.INVALID_EMODE_CATEGORY_PARAMS + ); + + // if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment + // a loan is taken there is enough collateral available to cover the liquidation bonus + require( + uint256(liquidationThreshold).percentMul(liquidationBonus) <= + PercentageMath.PERCENTAGE_FACTOR, + Errors.INVALID_EMODE_CATEGORY_PARAMS + ); + + DataTypes.EModeCategoryBaseConfiguration memory categoryData; + categoryData.ltv = ltv; + categoryData.liquidationThreshold = liquidationThreshold; + categoryData.liquidationBonus = liquidationBonus; + categoryData.label = label; + + _pool.configureEModeCategory(categoryId, categoryData); + emit EModeCategoryAdded( + categoryId, + ltv, + liquidationThreshold, + liquidationBonus, + address(0), + label + ); + } + + /// @inheritdoc IPoolConfigurator + function setAssetCollateralInEMode( + address asset, + uint8 categoryId, + bool allowed + ) external override onlyRiskOrPoolAdmins { + uint128 collateralBitmap = _pool.getEModeCategoryCollateralBitmap(categoryId); + DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); + require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED); + collateralBitmap = EModeConfiguration.setReserveBitmapBit( + collateralBitmap, + reserveData.id, + allowed + ); + _pool.configureEModeCategoryCollateralBitmap(categoryId, collateralBitmap); + emit AssetCollateralInEModeChanged(asset, categoryId, allowed); + } + + /// @inheritdoc IPoolConfigurator + function setAssetBorrowableInEMode( + address asset, + uint8 categoryId, + bool borrowable + ) external override onlyRiskOrPoolAdmins { + uint128 borrowableBitmap = _pool.getEModeCategoryBorrowableBitmap(categoryId); + DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); + require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED); + borrowableBitmap = EModeConfiguration.setReserveBitmapBit( + borrowableBitmap, + reserveData.id, + borrowable + ); + _pool.configureEModeCategoryBorrowableBitmap(categoryId, borrowableBitmap); + emit AssetBorrowableInEModeChanged(asset, categoryId, borrowable); + } + + /// @inheritdoc IPoolConfigurator + function setUnbackedMintCap( + address asset, + uint256 newUnbackedMintCap + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldUnbackedMintCap = currentConfig.getUnbackedMintCap(); + currentConfig.setUnbackedMintCap(newUnbackedMintCap); + _pool.setConfiguration(asset, currentConfig); + emit UnbackedMintCapChanged(asset, oldUnbackedMintCap, newUnbackedMintCap); + } + + /// @inheritdoc IPoolConfigurator + function setReserveInterestRateData( + address asset, + bytes calldata rateData + ) external onlyRiskOrPoolAdmins { + DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset); + _updateInterestRateStrategy(asset, reserve, reserve.interestRateStrategyAddress, rateData); + } + + /// @inheritdoc IPoolConfigurator + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress, + bytes calldata rateData + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset); + _updateInterestRateStrategy(asset, reserve, rateStrategyAddress, rateData); + } + + /// @inheritdoc IPoolConfigurator + function setPoolPause(bool paused, uint40 gracePeriod) public override onlyEmergencyOrPoolAdmin { + address[] memory reserves = _pool.getReservesList(); + + for (uint256 i = 0; i < reserves.length; i++) { + if (reserves[i] != address(0)) { + setReservePause(reserves[i], paused, gracePeriod); + } + } + } + + /// @inheritdoc IPoolConfigurator + function setPoolPause(bool paused) external override onlyEmergencyOrPoolAdmin { + setPoolPause(paused, 0); + } + + /// @inheritdoc IPoolConfigurator + function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external override onlyPoolAdmin { + require( + newBridgeProtocolFee <= PercentageMath.PERCENTAGE_FACTOR, + Errors.BRIDGE_PROTOCOL_FEE_INVALID + ); + uint256 oldBridgeProtocolFee = _pool.BRIDGE_PROTOCOL_FEE(); + _pool.updateBridgeProtocolFee(newBridgeProtocolFee); + emit BridgeProtocolFeeUpdated(oldBridgeProtocolFee, newBridgeProtocolFee); + } + + /// @inheritdoc IPoolConfigurator + function updateFlashloanPremiumTotal( + uint128 newFlashloanPremiumTotal + ) external override onlyPoolAdmin { + require( + newFlashloanPremiumTotal <= PercentageMath.PERCENTAGE_FACTOR, + Errors.FLASHLOAN_PREMIUM_INVALID + ); + uint128 oldFlashloanPremiumTotal = _pool.FLASHLOAN_PREMIUM_TOTAL(); + _pool.updateFlashloanPremiums(newFlashloanPremiumTotal, _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL()); + emit FlashloanPremiumTotalUpdated(oldFlashloanPremiumTotal, newFlashloanPremiumTotal); + } + + /// @inheritdoc IPoolConfigurator + function updateFlashloanPremiumToProtocol( + uint128 newFlashloanPremiumToProtocol + ) external override onlyPoolAdmin { + require( + newFlashloanPremiumToProtocol <= PercentageMath.PERCENTAGE_FACTOR, + Errors.FLASHLOAN_PREMIUM_INVALID + ); + uint128 oldFlashloanPremiumToProtocol = _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL(); + _pool.updateFlashloanPremiums(_pool.FLASHLOAN_PREMIUM_TOTAL(), newFlashloanPremiumToProtocol); + emit FlashloanPremiumToProtocolUpdated( + oldFlashloanPremiumToProtocol, + newFlashloanPremiumToProtocol + ); + } + + /// @inheritdoc IPoolConfigurator + function getPendingLtv(address asset) external view override returns (uint256) { + return _pendingLtv[asset]; + } + + /// @inheritdoc IPoolConfigurator + function getConfiguratorLogic() external pure returns (address) { + return address(ConfiguratorLogic); + } + + function _updateInterestRateStrategy( + address asset, + DataTypes.ReserveDataLegacy memory reserve, + address newRateStrategyAddress, + bytes calldata rateData + ) internal { + address oldRateStrategyAddress = reserve.interestRateStrategyAddress; + + _pool.syncIndexesState(asset); + + IDefaultInterestRateStrategyV2(newRateStrategyAddress).setInterestRateParams(asset, rateData); + emit ReserveInterestRateDataChanged(asset, newRateStrategyAddress, rateData); + + if (oldRateStrategyAddress != newRateStrategyAddress) { + _pool.setReserveInterestRateStrategyAddress(asset, newRateStrategyAddress); + emit ReserveInterestRateStrategyChanged( + asset, + oldRateStrategyAddress, + newRateStrategyAddress + ); + } + + _pool.syncRatesState(asset); + } + + function _checkNoSuppliers(address asset) internal view { + DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); + uint256 totalSupplied = IPoolDataProvider(_addressesProvider.getPoolDataProvider()) + .getATokenTotalSupply(asset); + + require( + totalSupplied == 0 && reserveData.accruedToTreasury == 0, + Errors.RESERVE_LIQUIDITY_NOT_ZERO + ); + } + + function _checkNoBorrowers(address asset) internal view { + uint256 totalDebt = IPoolDataProvider(_addressesProvider.getPoolDataProvider()).getTotalDebt( + asset + ); + require(totalDebt == 0, Errors.RESERVE_DEBT_NOT_ZERO); + } + + function _onlyPoolAdmin() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + } + + function _onlyPoolOrEmergencyAdmin() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isPoolAdmin(msg.sender) || aclManager.isEmergencyAdmin(msg.sender), + Errors.CALLER_NOT_POOL_OR_EMERGENCY_ADMIN + ); + } + + function _onlyAssetListingOrPoolAdmins() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), + Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN + ); + } + + function _onlyRiskOrPoolAdmins() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isRiskAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), + Errors.CALLER_NOT_RISK_OR_POOL_ADMIN + ); + } + + function _onlyRiskOrPoolOrEmergencyAdmins() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isRiskAdmin(msg.sender) || + aclManager.isPoolAdmin(msg.sender) || + aclManager.isEmergencyAdmin(msg.sender), + Errors.CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN + ); + } +} + +// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/instances/PoolConfiguratorInstance.sol + +contract PoolConfiguratorInstance is PoolConfigurator { + uint256 public constant CONFIGURATOR_REVISION = 4; + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure virtual override returns (uint256) { + return CONFIGURATOR_REVISION; + } + + function initialize(IPoolAddressesProvider provider) public virtual override initializer { + _addressesProvider = provider; + _pool = IPool(_addressesProvider.getPool()); + } +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol new file mode 100644 index 00000000..aec817cb --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import './Proxy.sol'; +import '../contracts/Address.sol'; + +/** + * @title BaseUpgradeabilityProxy + * @dev This contract implements a proxy that allows to change the + * implementation address to which it will delegate. + * Such a change is called an implementation upgrade. + */ +contract BaseUpgradeabilityProxy is Proxy { + /** + * @dev Emitted when the implementation is upgraded. + * @param implementation Address of the new implementation. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Storage slot with the address of the current implementation. + * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is + * validated in the constructor. + */ + bytes32 internal constant IMPLEMENTATION_SLOT = + 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + /** + * @dev Returns the current implementation. + * @return impl Address of the current implementation + */ + function _implementation() internal view override returns (address impl) { + bytes32 slot = IMPLEMENTATION_SLOT; + //solium-disable-next-line + assembly { + impl := sload(slot) + } + } + + /** + * @dev Upgrades the proxy to a new implementation. + * @param newImplementation Address of the new implementation. + */ + function _upgradeTo(address newImplementation) internal { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + } + + /** + * @dev Sets the implementation address of the proxy. + * @param newImplementation Address of the new implementation. + */ + function _setImplementation(address newImplementation) internal { + require( + Address.isContract(newImplementation), + 'Cannot set a proxy implementation to a non-contract address' + ); + + bytes32 slot = IMPLEMENTATION_SLOT; + + //solium-disable-next-line + assembly { + sstore(slot, newImplementation) + } + } +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol new file mode 100644 index 00000000..4b43fa6a --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import './BaseUpgradeabilityProxy.sol'; + +/** + * @title InitializableUpgradeabilityProxy + * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing + * implementation and init data. + */ +contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { + /** + * @dev Contract initializer. + * @param _logic Address of the initial implementation. + * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. + */ + function initialize(address _logic, bytes memory _data) public payable { + require(_implementation() == address(0)); + assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); + _setImplementation(_logic); + if (_data.length > 0) { + (bool success, ) = _logic.delegatecall(_data); + require(success); + } + } +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol new file mode 100644 index 00000000..53589441 --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title Proxy + * @dev Implements delegation of calls to other contracts, with proper + * forwarding of return values and bubbling of failures. + * It defines a fallback function that delegates all calls to the address + * returned by the abstract _implementation() internal function. + */ +abstract contract Proxy { + /** + * @dev Fallback function. + * Will run if no other function in the contract matches the call data. + * Implemented entirely in `_fallback`. + */ + fallback() external payable { + _fallback(); + } + + /** + * @dev Fallback function that will run if call data is empty. + * IMPORTANT. receive() on implementation contracts will be unreachable + */ + receive() external payable { + _fallback(); + } + + /** + * @return The Address of the implementation. + */ + function _implementation() internal view virtual returns (address); + + /** + * @dev Delegates execution to an implementation contract. + * This is a low level function that doesn't return to its internal call site. + * It will return to the external caller whatever the implementation returns. + * @param implementation Address to delegate. + */ + function _delegate(address implementation) internal { + //solium-disable-next-line + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + /** + * @dev Function that is run as the first thing in the fallback function. + * Can be redefined in derived contracts to add functionality. + * Redefinitions must call super._willFallback(). + */ + function _willFallback() internal virtual {} + + /** + * @dev fallback implementation. + * Extracted to enable manual triggering. + */ + function _fallback() internal { + _willFallback(); + _delegate(_implementation()); + } +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/instances/PoolConfiguratorInstance.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/instances/PoolConfiguratorInstance.sol new file mode 100644 index 00000000..8d2e4939 --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/instances/PoolConfiguratorInstance.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {PoolConfigurator, IPoolAddressesProvider, IPool, VersionedInitializable} from '../protocol/pool/PoolConfigurator.sol'; + +contract PoolConfiguratorInstance is PoolConfigurator { + uint256 public constant CONFIGURATOR_REVISION = 4; + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure virtual override returns (uint256) { + return CONFIGURATOR_REVISION; + } + + function initialize(IPoolAddressesProvider provider) public virtual override initializer { + _addressesProvider = provider; + _pool = IPool(_addressesProvider.getPool()); + } +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol new file mode 100644 index 00000000..938e2d8f --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IReserveInterestRateStrategy} from './IReserveInterestRateStrategy.sol'; +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IDefaultInterestRateStrategyV2 + * @author BGD Labs + * @notice Interface of the default interest rate strategy used by the Aave protocol + */ +interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { + /** + * @notice Holds the interest rate data for a given reserve + * + * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This + * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. + * + * @param optimalUsageRatio The optimal usage ratio, in bps + * @param baseVariableBorrowRate The base variable borrow rate, in bps + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps + */ + struct InterestRateData { + uint16 optimalUsageRatio; + uint32 baseVariableBorrowRate; + uint32 variableRateSlope1; + uint32 variableRateSlope2; + } + + /** + * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, + * used in in-memory calculations. + * + * @param optimalUsageRatio The optimal usage ratio + * @param baseVariableBorrowRate The base variable borrow rate + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio + */ + struct InterestRateDataRay { + uint256 optimalUsageRatio; + uint256 baseVariableBorrowRate; + uint256 variableRateSlope1; + uint256 variableRateSlope2; + } + + /** + * @notice emitted when new interest rate data is set in a reserve + * + * @param reserve address of the reserve that has new interest rate data set + * @param optimalUsageRatio The optimal usage ratio, in bps + * @param baseVariableBorrowRate The base variable borrow rate, in bps + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps + */ + event RateDataUpdate( + address indexed reserve, + uint256 optimalUsageRatio, + uint256 baseVariableBorrowRate, + uint256 variableRateSlope1, + uint256 variableRateSlope2 + ); + + /** + * @notice Returns the address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the maximum value achievable for variable borrow rate, in bps + * @return The maximum rate + */ + function MAX_BORROW_RATE() external view returns (uint256); + + /** + * @notice Returns the minimum optimal point, in bps + * @return The optimal point + */ + function MIN_OPTIMAL_POINT() external view returns (uint256); + + /** + * @notice Returns the maximum optimal point, in bps + * @return The optimal point + */ + function MAX_OPTIMAL_POINT() external view returns (uint256); + + /** + * notice Returns the full InterestRateData object for the given reserve, in ray + * + * @param reserve The reserve to get the data of + * + * @return The InterestRateDataRay object for the given reserve + */ + function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); + + /** + * notice Returns the full InterestRateDataRay object for the given reserve, in bps + * + * @param reserve The reserve to get the data of + * + * @return The InterestRateData object for the given reserve + */ + function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); + + /** + * @notice Returns the optimal usage rate for the given reserve in ray + * + * @param reserve The reserve to get the optimal usage rate of + * + * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate + */ + function getOptimalUsageRatio(address reserve) external view returns (uint256); + + /** + * @notice Returns the variable rate slope below optimal usage ratio in ray + * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO + * + * @param reserve The reserve to get the variable rate slope 1 of + * + * @return The variable rate slope + */ + function getVariableRateSlope1(address reserve) external view returns (uint256); + + /** + * @notice Returns the variable rate slope above optimal usage ratio in ray + * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO + * + * @param reserve The reserve to get the variable rate slope 2 of + * + * @return The variable rate slope + */ + function getVariableRateSlope2(address reserve) external view returns (uint256); + + /** + * @notice Returns the base variable borrow rate, in ray + * + * @param reserve The reserve to get the base variable borrow rate of + * + * @return The base variable borrow rate + */ + function getBaseVariableBorrowRate(address reserve) external view returns (uint256); + + /** + * @notice Returns the maximum variable borrow rate, in ray + * + * @param reserve The reserve to get the maximum variable borrow rate of + * + * @return The maximum variable borrow rate + */ + function getMaxVariableBorrowRate(address reserve) external view returns (uint256); + + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The reserve interest rate data to apply to the given reserve + * Being specific to this custom implementation, with custom struct type, + * overloading the function on the generic interface + */ + function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolConfigurator.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolConfigurator.sol new file mode 100644 index 00000000..977d316e --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolConfigurator.sol @@ -0,0 +1,551 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {ConfiguratorInputTypes} from '../protocol/libraries/types/ConfiguratorInputTypes.sol'; +import {IDefaultInterestRateStrategyV2} from './IDefaultInterestRateStrategyV2.sol'; + +/** + * @title IPoolConfigurator + * @author Aave + * @notice Defines the basic interface for a Pool configurator. + */ +interface IPoolConfigurator { + /** + * @dev Emitted when a reserve is initialized. + * @param asset The address of the underlying asset of the reserve + * @param aToken The address of the associated aToken contract + * @param stableDebtToken, DEPRECATED in v3.2.0 + * @param variableDebtToken The address of the associated variable rate debt token + * @param interestRateStrategyAddress The address of the interest rate strategy for the reserve + */ + event ReserveInitialized( + address indexed asset, + address indexed aToken, + address stableDebtToken, + address variableDebtToken, + address interestRateStrategyAddress + ); + + /** + * @dev Emitted when borrowing is enabled or disabled on a reserve. + * @param asset The address of the underlying asset of the reserve + * @param enabled True if borrowing is enabled, false otherwise + */ + event ReserveBorrowing(address indexed asset, bool enabled); + + /** + * @dev Emitted when flashloans are enabled or disabled on a reserve. + * @param asset The address of the underlying asset of the reserve + * @param enabled True if flashloans are enabled, false otherwise + */ + event ReserveFlashLoaning(address indexed asset, bool enabled); + + /** + * @dev Emitted when the ltv is set for the frozen asset. + * @param asset The address of the underlying asset of the reserve + * @param ltv The loan to value of the asset when used as collateral + */ + event PendingLtvChanged(address indexed asset, uint256 ltv); + + /** + * @dev Emitted when the collateralization risk parameters for the specified asset are updated. + * @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 + */ + event CollateralConfigurationChanged( + address indexed asset, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus + ); + + /** + * @dev Emitted when a reserve is activated or deactivated + * @param asset The address of the underlying asset of the reserve + * @param active True if reserve is active, false otherwise + */ + event ReserveActive(address indexed asset, bool active); + + /** + * @dev Emitted when a reserve is frozen or unfrozen + * @param asset The address of the underlying asset of the reserve + * @param frozen True if reserve is frozen, false otherwise + */ + event ReserveFrozen(address indexed asset, bool frozen); + + /** + * @dev Emitted when a reserve is paused or unpaused + * @param asset The address of the underlying asset of the reserve + * @param paused True if reserve is paused, false otherwise + */ + event ReservePaused(address indexed asset, bool paused); + + /** + * @dev Emitted when a reserve is dropped. + * @param asset The address of the underlying asset of the reserve + */ + event ReserveDropped(address indexed asset); + + /** + * @dev Emitted when a reserve factor is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldReserveFactor The old reserve factor, expressed in bps + * @param newReserveFactor The new reserve factor, expressed in bps + */ + event ReserveFactorChanged( + address indexed asset, + uint256 oldReserveFactor, + uint256 newReserveFactor + ); + + /** + * @dev Emitted when the borrow cap of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldBorrowCap The old borrow cap + * @param newBorrowCap The new borrow cap + */ + event BorrowCapChanged(address indexed asset, uint256 oldBorrowCap, uint256 newBorrowCap); + + /** + * @dev Emitted when the supply cap of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldSupplyCap The old supply cap + * @param newSupplyCap The new supply cap + */ + event SupplyCapChanged(address indexed asset, uint256 oldSupplyCap, uint256 newSupplyCap); + + /** + * @dev Emitted when the liquidation protocol fee of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldFee The old liquidation protocol fee, expressed in bps + * @param newFee The new liquidation protocol fee, expressed in bps + */ + event LiquidationProtocolFeeChanged(address indexed asset, uint256 oldFee, uint256 newFee); + + /** + * @dev Emitted when the liquidation grace period is updated. + * @param asset The address of the underlying asset of the reserve + * @param gracePeriodUntil Timestamp until when liquidations will not be allowed post-unpause + */ + event LiquidationGracePeriodChanged(address indexed asset, uint40 gracePeriodUntil); + + /** + * @dev Emitted when the liquidation grace period is disabled. + * @param asset The address of the underlying asset of the reserve + */ + event LiquidationGracePeriodDisabled(address indexed asset); + + /** + * @dev Emitted when the unbacked mint cap of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldUnbackedMintCap The old unbacked mint cap + * @param newUnbackedMintCap The new unbacked mint cap + */ + event UnbackedMintCapChanged( + address indexed asset, + uint256 oldUnbackedMintCap, + uint256 newUnbackedMintCap + ); + + /** + * @dev Emitted when an collateral configuration of an asset in an eMode is changed. + * @param asset The address of the underlying asset of the reserve + * @param categoryId The eMode category + * @param collateral True if the asset is enabled as collateral in the eMode, false otherwise. + */ + event AssetCollateralInEModeChanged(address indexed asset, uint8 categoryId, bool collateral); + + /** + * @dev Emitted when the borrowable configuration of an asset in an eMode changed. + * @param asset The address of the underlying asset of the reserve + * @param categoryId The eMode category + * @param borrowable True if the asset is enabled as borrowable in the eMode, false otherwise. + */ + event AssetBorrowableInEModeChanged(address indexed asset, uint8 categoryId, bool borrowable); + + /** + * @dev Emitted when a new eMode category is added or an existing category is altered. + * @param categoryId The new eMode category id + * @param ltv The ltv for the asset category in eMode + * @param liquidationThreshold The liquidationThreshold for the asset category in eMode + * @param liquidationBonus The liquidationBonus for the asset category in eMode + * @param oracle DEPRECATED in v3.2.0 + * @param label A human readable identifier for the category + */ + event EModeCategoryAdded( + uint8 indexed categoryId, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + address oracle, + string label + ); + + /** + * @dev Emitted when a reserve interest strategy contract is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldStrategy The address of the old interest strategy contract + * @param newStrategy The address of the new interest strategy contract + */ + event ReserveInterestRateStrategyChanged( + address indexed asset, + address oldStrategy, + address newStrategy + ); + + /** + * @dev Emitted when the data of a reserve interest strategy contract is updated. + * @param asset The address of the underlying asset of the reserve + * @param data abi encoded data + */ + event ReserveInterestRateDataChanged(address indexed asset, address indexed strategy, bytes data); + + /** + * @dev Emitted when an aToken implementation is upgraded. + * @param asset The address of the underlying asset of the reserve + * @param proxy The aToken proxy address + * @param implementation The new aToken implementation + */ + event ATokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @dev Emitted when the implementation of a variable debt token is upgraded. + * @param asset The address of the underlying asset of the reserve + * @param proxy The variable debt token proxy address + * @param implementation The new aToken implementation + */ + event VariableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @dev Emitted when the debt ceiling of an asset is set. + * @param asset The address of the underlying asset of the reserve + * @param oldDebtCeiling The old debt ceiling + * @param newDebtCeiling The new debt ceiling + */ + event DebtCeilingChanged(address indexed asset, uint256 oldDebtCeiling, uint256 newDebtCeiling); + + /** + * @dev Emitted when the the siloed borrowing state for an asset is changed. + * @param asset The address of the underlying asset of the reserve + * @param oldState The old siloed borrowing state + * @param newState The new siloed borrowing state + */ + event SiloedBorrowingChanged(address indexed asset, bool oldState, bool newState); + + /** + * @dev Emitted when the bridge protocol fee is updated. + * @param oldBridgeProtocolFee The old protocol fee, expressed in bps + * @param newBridgeProtocolFee The new protocol fee, expressed in bps + */ + event BridgeProtocolFeeUpdated(uint256 oldBridgeProtocolFee, uint256 newBridgeProtocolFee); + + /** + * @dev Emitted when the total premium on flashloans is updated. + * @param oldFlashloanPremiumTotal The old premium, expressed in bps + * @param newFlashloanPremiumTotal The new premium, expressed in bps + */ + event FlashloanPremiumTotalUpdated( + uint128 oldFlashloanPremiumTotal, + uint128 newFlashloanPremiumTotal + ); + + /** + * @dev Emitted when the part of the premium that goes to protocol is updated. + * @param oldFlashloanPremiumToProtocol The old premium, expressed in bps + * @param newFlashloanPremiumToProtocol The new premium, expressed in bps + */ + event FlashloanPremiumToProtocolUpdated( + uint128 oldFlashloanPremiumToProtocol, + uint128 newFlashloanPremiumToProtocol + ); + + /** + * @dev Emitted when the reserve is set as borrowable/non borrowable in isolation mode. + * @param asset The address of the underlying asset of the reserve + * @param borrowable True if the reserve is borrowable in isolation, false otherwise + */ + event BorrowableInIsolationChanged(address asset, bool borrowable); + + /** + * @notice Initializes multiple reserves. + * @dev param useVirtualBalance of the input struct should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param input The array of initialization parameters + */ + function initReserves(ConfiguratorInputTypes.InitReserveInput[] calldata input) external; + + /** + * @dev Updates the aToken implementation for the reserve. + * @param input The aToken update parameters + */ + function updateAToken(ConfiguratorInputTypes.UpdateATokenInput calldata input) external; + + /** + * @notice Updates the variable debt token implementation for the asset. + * @param input The variableDebtToken update parameters + */ + function updateVariableDebtToken( + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external; + + /** + * @notice Configures borrowing on a reserve. + * @param asset The address of the underlying asset of the reserve + * @param enabled True if borrowing needs to be enabled, false otherwise + */ + function setReserveBorrowing(address asset, bool enabled) external; + + /** + * @notice Configures the reserve collateralization parameters. + * @dev All the values are expressed in bps. A value of 10000, results in 100.00% + * @dev The `liquidationBonus` is always above 100%. A value of 105% means the liquidator will receive a 5% bonus + * @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 + */ + function configureReserveAsCollateral( + address asset, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus + ) external; + + /** + * @notice Enable or disable flashloans on a reserve + * @param asset The address of the underlying asset of the reserve + * @param enabled True if flashloans need to be enabled, false otherwise + */ + function setReserveFlashLoaning(address asset, bool enabled) external; + + /** + * @notice Activate or deactivate a reserve + * @param asset The address of the underlying asset of the reserve + * @param active True if the reserve needs to be active, false otherwise + */ + function setReserveActive(address asset, bool active) external; + + /** + * @notice Freeze or unfreeze a reserve. A frozen reserve doesn't allow any new supply, borrow + * or rate swap but allows repayments, liquidations, rate rebalances and withdrawals. + * @param asset The address of the underlying asset of the reserve + * @param freeze True if the reserve needs to be frozen, false otherwise + */ + function setReserveFreeze(address asset, bool freeze) external; + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the + * borrowed amount will be accumulated in the isolated collateral's total debt exposure + * @dev Only assets of the same family (e.g. USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations + * @param asset The address of the underlying asset of the reserve + * @param borrowable True if the asset should be borrowable in isolation, false otherwise + */ + function setBorrowableInIsolation(address asset, bool borrowable) external; + + /** + * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, + * swap interest rate, liquidate, atoken transfers). + * @param asset The address of the underlying asset of the reserve + * @param paused True if pausing the reserve, false if unpausing + * @param gracePeriod Count of seconds after unpause during which liquidations will not be available + * - Only applicable whenever unpausing (`paused` as false) + * - Passing 0 means no grace period + * - Capped to maximum MAX_GRACE_PERIOD + */ + function setReservePause(address asset, bool paused, uint40 gracePeriod) external; + + /** + * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, + * swap interest rate, liquidate, atoken transfers). + * @dev Version with no grace period + * @param asset The address of the underlying asset of the reserve + * @param paused True if pausing the reserve, false if unpausing + */ + function setReservePause(address asset, bool paused) external; + + /** + * @notice Disables liquidation grace period for the asset. The liquidation grace period is set in the past + * so that liquidations are allowed for the asset. + * @param asset The address of the underlying asset of the reserve + */ + function disableLiquidationGracePeriod(address asset) external; + + /** + * @notice Updates the reserve factor of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newReserveFactor The new reserve factor of the reserve + */ + function setReserveFactor(address asset, uint256 newReserveFactor) external; + + /** + * @notice Sets the interest rate strategy of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newRateStrategyAddress The address of the new interest strategy contract + * @param rateData bytes-encoded rate data. In this format in order to allow the rate strategy contract + * to de-structure custom data + */ + function setReserveInterestRateStrategyAddress( + address asset, + address newRateStrategyAddress, + bytes calldata rateData + ) external; + + /** + * @notice Sets interest rate data for a reserve + * @param asset The address of the underlying asset of the reserve + * @param rateData bytes-encoded rate data. In this format in order to allow the rate strategy contract + * to de-structure custom data + */ + function setReserveInterestRateData(address asset, bytes calldata rateData) external; + + /** + * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions + * are suspended. + * @param paused True if protocol needs to be paused, false otherwise + * @param gracePeriod Count of seconds after unpause during which liquidations will not be available + * - Only applicable whenever unpausing (`paused` as false) + * - Passing 0 means no grace period + * - Capped to maximum MAX_GRACE_PERIOD + */ + function setPoolPause(bool paused, uint40 gracePeriod) external; + + /** + * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions + * are suspended. + * @dev Version with no grace period + * @param paused True if protocol needs to be paused, false otherwise + */ + function setPoolPause(bool paused) external; + + /** + * @notice Updates the borrow cap of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newBorrowCap The new borrow cap of the reserve + */ + function setBorrowCap(address asset, uint256 newBorrowCap) external; + + /** + * @notice Updates the supply cap of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newSupplyCap The new supply cap of the reserve + */ + function setSupplyCap(address asset, uint256 newSupplyCap) external; + + /** + * @notice Updates the liquidation protocol fee of reserve. + * @param asset The address of the underlying asset of the reserve + * @param newFee The new liquidation protocol fee of the reserve, expressed in bps + */ + function setLiquidationProtocolFee(address asset, uint256 newFee) external; + + /** + * @notice Updates the unbacked mint cap of reserve. + * @param asset The address of the underlying asset of the reserve + * @param newUnbackedMintCap The new unbacked mint cap of the reserve + */ + function setUnbackedMintCap(address asset, uint256 newUnbackedMintCap) external; + + /** + * @notice Enables/disables an asset to be borrowable in a selected eMode. + * - eMode.borrowable always has less priority then reserve.borrowable + * @param asset The address of the underlying asset of the reserve + * @param categoryId The eMode categoryId + * @param borrowable True if the asset should be borrowable in the given eMode category, false otherwise. + */ + function setAssetBorrowableInEMode(address asset, uint8 categoryId, bool borrowable) external; + + /** + * @notice Enables/disables an asset to be collateral in a selected eMode. + * @param asset The address of the underlying asset of the reserve + * @param categoryId The eMode categoryId + * @param collateral True if the asset should be collateral in the given eMode category, false otherwise. + */ + function setAssetCollateralInEMode(address asset, uint8 categoryId, bool collateral) external; + + /** + * @notice Adds a new efficiency mode (eMode) category or alters a existing one. + * @param categoryId The id of the category to be configured + * @param ltv The ltv associated with the category + * @param liquidationThreshold The liquidation threshold associated with the category + * @param liquidationBonus The liquidation bonus associated with the category + * @param label A label identifying the category + */ + function setEModeCategory( + uint8 categoryId, + uint16 ltv, + uint16 liquidationThreshold, + uint16 liquidationBonus, + string calldata label + ) external; + + /** + * @notice Drops a reserve entirely. + * @param asset The address of the reserve to drop + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the bridge fee collected by the protocol reserves. + * @param newBridgeProtocolFee The part of the fee sent to the protocol treasury, expressed in bps + */ + function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external; + + /** + * @notice Updates the total flash loan premium. + * Total flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra balance + * - A part is collected by the protocol reserves + * @dev Expressed in bps + * @dev The premium is calculated on the total amount borrowed + * @param newFlashloanPremiumTotal The total flashloan premium + */ + function updateFlashloanPremiumTotal(uint128 newFlashloanPremiumTotal) external; + + /** + * @notice Updates the flash loan premium collected by protocol reserves + * @dev Expressed in bps + * @dev The premium to protocol is calculated on the total flashloan premium + * @param newFlashloanPremiumToProtocol The part of the flashloan premium sent to the protocol treasury + */ + function updateFlashloanPremiumToProtocol(uint128 newFlashloanPremiumToProtocol) external; + + /** + * @notice Sets the debt ceiling for an asset. + * @param newDebtCeiling The new debt ceiling + */ + function setDebtCeiling(address asset, uint256 newDebtCeiling) external; + + /** + * @notice Sets siloed borrowing for an asset + * @param siloed The new siloed borrowing state + */ + function setSiloedBorrowing(address asset, bool siloed) external; + + /** + * @notice Gets pending ltv value + * @param asset The new siloed borrowing state + */ + function getPendingLtv(address asset) external view returns (uint256); + + /** + * @notice Gets the address of the external ConfiguratorLogic + */ + function getConfiguratorLogic() external view returns (address); + + /** + * @notice Gets the maximum liquidations grace period allowed, in seconds + */ + function MAX_GRACE_PERIOD() external view returns (uint40); +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol new file mode 100644 index 00000000..a9df8903 --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol @@ -0,0 +1,250 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPoolDataProvider + * @author Aave + * @notice Defines the basic interface of a PoolDataProvider + */ +interface IPoolDataProvider { + struct TokenData { + string symbol; + address tokenAddress; + } + + /** + * @notice Returns the address for the PoolAddressesProvider contract. + * @return The address for the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the list of the existing reserves in the pool. + * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. + * @return The list of reserves, pairs of symbols and addresses + */ + function getAllReservesTokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the list of the existing ATokens in the pool. + * @return The list of ATokens, pairs of symbols and addresses + */ + function getAllATokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the configuration data of the reserve + * @dev Not returning borrow and supply caps for compatibility, nor pause flag + * @param asset The address of the underlying asset of the reserve + * @return decimals The number of decimals of the reserve + * @return ltv The ltv of the reserve + * @return liquidationThreshold The liquidationThreshold of the reserve + * @return liquidationBonus The liquidationBonus of the reserve + * @return reserveFactor The reserveFactor of the reserve + * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise + * @return borrowingEnabled True if borrowing is enabled, false otherwise + * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise + * @return isActive True if it is active, false otherwise + * @return isFrozen True if it is frozen, false otherwise + */ + function getReserveConfigurationData( + address asset + ) + external + view + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ); + + /** + * @notice Returns the caps parameters of the reserve + * @param asset The address of the underlying asset of the reserve + * @return borrowCap The borrow cap of the reserve + * @return supplyCap The supply cap of the reserve + */ + function getReserveCaps( + address asset + ) external view returns (uint256 borrowCap, uint256 supplyCap); + + /** + * @notice Returns if the pool is paused + * @param asset The address of the underlying asset of the reserve + * @return isPaused True if the pool is paused, false otherwise + */ + function getPaused(address asset) external view returns (bool isPaused); + + /** + * @notice Returns the siloed borrowing flag + * @param asset The address of the underlying asset of the reserve + * @return True if the asset is siloed for borrowing + */ + function getSiloedBorrowing(address asset) external view returns (bool); + + /** + * @notice Returns the protocol fee on the liquidation bonus + * @param asset The address of the underlying asset of the reserve + * @return The protocol fee on liquidation + */ + function getLiquidationProtocolFee(address asset) external view returns (uint256); + + /** + * @notice Returns the unbacked mint cap of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The unbacked mint cap of the reserve + */ + function getUnbackedMintCap(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The debt ceiling of the reserve + */ + function getDebtCeiling(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling decimals + * @return The debt ceiling decimals + */ + function getDebtCeilingDecimals() external pure returns (uint256); + + /** + * @notice Returns the reserve data + * @param asset The address of the underlying asset of the reserve + * @return unbacked The amount of unbacked tokens + * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted + * @return totalAToken The total supply of the aToken + * @return totalStableDebt The total stable debt of the reserve + * @return totalVariableDebt The total variable debt of the reserve + * @return liquidityRate The liquidity rate of the reserve + * @return variableBorrowRate The variable borrow rate of the reserve + * @return stableBorrowRate The stable borrow rate of the reserve + * @return averageStableBorrowRate The average stable borrow rate of the reserve + * @return liquidityIndex The liquidity index of the reserve + * @return variableBorrowIndex The variable borrow index of the reserve + * @return lastUpdateTimestamp The timestamp of the last update of the reserve + */ + function getReserveData( + address asset + ) + external + view + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ); + + /** + * @notice Returns the total supply of aTokens for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total supply of the aToken + */ + function getATokenTotalSupply(address asset) external view returns (uint256); + + /** + * @notice Returns the total debt for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total debt for asset + */ + function getTotalDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the user data in a reserve + * @param asset The address of the underlying asset of the reserve + * @param user The address of the user + * @return currentATokenBalance The current AToken balance of the user + * @return currentStableDebt The current stable debt of the user + * @return currentVariableDebt The current variable debt of the user + * @return principalStableDebt The principal stable debt of the user + * @return scaledVariableDebt The scaled variable debt of the user + * @return stableBorrowRate The stable borrow rate of the user + * @return liquidityRate The liquidity rate of the reserve + * @return stableRateLastUpdated The timestamp of the last update of the user stable rate + * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false + * otherwise + */ + function getUserReserveData( + address asset, + address user + ) + external + view + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ); + + /** + * @notice Returns the token addresses of the reserve + * @param asset The address of the underlying asset of the reserve + * @return aTokenAddress The AToken address of the reserve + * @return stableDebtTokenAddress DEPRECATED in v3.2.0 + * @return variableDebtTokenAddress The VariableDebtToken address of the reserve + */ + function getReserveTokensAddresses( + address asset + ) + external + view + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ); + + /** + * @notice Returns the address of the Interest Rate strategy + * @param asset The address of the underlying asset of the reserve + * @return irStrategyAddress The address of the Interest Rate strategy + */ + function getInterestRateStrategyAddress( + address asset + ) external view returns (address irStrategyAddress); + + /** + * @notice Returns whether the reserve has FlashLoans enabled or disabled + * @param asset The address of the underlying asset of the reserve + * @return True if FlashLoans are enabled, false otherwise + */ + function getFlashLoanEnabled(address asset) external view returns (bool); + + /** + * @notice Returns whether virtual accounting is enabled/not for a reserve + * @param asset The address of the underlying asset of the reserve + * @return True if active, false otherwise + */ + function getIsVirtualAccActive(address asset) external view returns (bool); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..252b4a4b --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {BaseUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol'; + +/** + * @title BaseImmutableAdminUpgradeabilityProxy + * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern + * @notice This contract combines an upgradeability proxy with an authorization + * mechanism for administrative tasks. + * @dev The admin role is stored in an immutable, which helps saving transactions costs + * All external functions in this contract must be guarded by the + * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity + * feature proposal that would enable this to be done automatically. + */ +contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + address internal immutable _admin; + + /** + * @dev Constructor. + * @param admin_ The address of the admin + */ + constructor(address admin_) { + _admin = admin_; + } + + modifier ifAdmin() { + if (msg.sender == _admin) { + _; + } else { + _fallback(); + } + } + + /** + * @notice Return the admin address + * @return The address of the proxy admin. + */ + function admin() external ifAdmin returns (address) { + return _admin; + } + + /** + * @notice Return the implementation address + * @return The address of the implementation. + */ + function implementation() external ifAdmin returns (address) { + return _implementation(); + } + + /** + * @notice Upgrade the backing implementation of the proxy. + * @dev Only the admin can call this function. + * @param newImplementation The address of the new implementation. + */ + function upgradeTo(address newImplementation) external ifAdmin { + _upgradeTo(newImplementation); + } + + /** + * @notice Upgrade the backing implementation of the proxy and call a function + * on the new implementation. + * @dev This is useful to initialize the proxied contract. + * @param newImplementation The address of the new implementation. + * @param data Data to send as msg.data in the low level call. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + */ + function upgradeToAndCall( + address newImplementation, + bytes calldata data + ) external payable ifAdmin { + _upgradeTo(newImplementation); + (bool success, ) = newImplementation.delegatecall(data); + require(success); + } + + /** + * @notice Only fall back when the sender is not the admin. + */ + function _willFallback() internal virtual override { + require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); + super._willFallback(); + } +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..6913a19d --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {InitializableUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol'; +import {Proxy} from '../../dependencies/openzeppelin/upgradeability/Proxy.sol'; +import {BaseImmutableAdminUpgradeabilityProxy} from './BaseImmutableAdminUpgradeabilityProxy.sol'; + +/** + * @title InitializableAdminUpgradeabilityProxy + * @author Aave + * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function + */ +contract InitializableImmutableAdminUpgradeabilityProxy is + BaseImmutableAdminUpgradeabilityProxy, + InitializableUpgradeabilityProxy +{ + /** + * @dev Constructor. + * @param admin The address of the admin + */ + constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { + // Intentionally left blank + } + + /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy + function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { + BaseImmutableAdminUpgradeabilityProxy._willFallback(); + } +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol new file mode 100644 index 00000000..1070227a --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol new file mode 100644 index 00000000..c6b08dcc --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol @@ -0,0 +1,223 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IPool} from '../../../interfaces/IPool.sol'; +import {IInitializableAToken} from '../../../interfaces/IInitializableAToken.sol'; +import {IInitializableDebtToken} from '../../../interfaces/IInitializableDebtToken.sol'; +import {InitializableImmutableAdminUpgradeabilityProxy} from '../../../misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {ConfiguratorInputTypes} from '../types/ConfiguratorInputTypes.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; + +/** + * @title ConfiguratorLogic library + * @author Aave + * @notice Implements the functions to initialize reserves and update aTokens and debtTokens + */ +library ConfiguratorLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPoolConfigurator` for descriptions + event ReserveInitialized( + address indexed asset, + address indexed aToken, + address stableDebtToken, + address variableDebtToken, + address interestRateStrategyAddress + ); + event ATokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + event VariableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @notice Initialize a reserve by creating and initializing aToken and variable debt token + * @dev Emits the `ReserveInitialized` event + * @param pool The Pool in which the reserve will be initialized + * @param input The needed parameters for the initialization + */ + function executeInitReserve( + IPool pool, + ConfiguratorInputTypes.InitReserveInput calldata input + ) external { + // It is an assumption that the asset listed is non-malicious, and the external call doesn't create re-entrancies + uint8 underlyingAssetDecimals = IERC20Detailed(input.underlyingAsset).decimals(); + require(underlyingAssetDecimals > 5, Errors.INVALID_DECIMALS); + + address aTokenProxyAddress = _initTokenWithProxy( + input.aTokenImpl, + abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + pool, + input.treasury, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.aTokenName, + input.aTokenSymbol, + input.params + ) + ); + + address variableDebtTokenProxyAddress = _initTokenWithProxy( + input.variableDebtTokenImpl, + abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + pool, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.variableDebtTokenName, + input.variableDebtTokenSymbol, + input.params + ) + ); + + pool.initReserve( + input.underlyingAsset, + aTokenProxyAddress, + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + + DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); + + currentConfig.setDecimals(underlyingAssetDecimals); + + currentConfig.setActive(true); + currentConfig.setPaused(false); + currentConfig.setFrozen(false); + currentConfig.setVirtualAccActive(input.useVirtualBalance); + + pool.setConfiguration(input.underlyingAsset, currentConfig); + + IReserveInterestRateStrategy(input.interestRateStrategyAddress).setInterestRateParams( + input.underlyingAsset, + input.interestRateData + ); + + emit ReserveInitialized( + input.underlyingAsset, + aTokenProxyAddress, + address(0), + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + } + + /** + * @notice Updates the aToken implementation and initializes it + * @dev Emits the `ATokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the aToken + * @param input The parameters needed for the initialize call + */ + function executeUpdateAToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateATokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + cachedPool, + input.treasury, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); + + emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); + } + + /** + * @notice Updates the variable debt token implementation and initializes it + * @dev Emits the `VariableDebtTokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the variable debt token + * @param input The parameters needed for the initialize call + */ + function executeUpdateVariableDebtToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + cachedPool, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation( + reserveData.variableDebtTokenAddress, + input.implementation, + encodedCall + ); + + emit VariableDebtTokenUpgraded( + input.asset, + reserveData.variableDebtTokenAddress, + input.implementation + ); + } + + /** + * @notice Creates a new proxy and initializes the implementation + * @param implementation The address of the implementation + * @param initParams The parameters that is passed to the implementation to initialize + * @return The address of initialized proxy + */ + function _initTokenWithProxy( + address implementation, + bytes memory initParams + ) internal returns (address) { + InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( + address(this) + ); + + proxy.initialize(implementation, initParams); + + return address(proxy); + } + + /** + * @notice Upgrades the implementation and makes call to the proxy + * @dev The call is used to initialize the new implementation. + * @param proxyAddress The address of the proxy + * @param implementation The address of the new implementation + * @param initParams The parameters to the call after the upgrade + */ + function _upgradeTokenImplementation( + address proxyAddress, + address implementation, + bytes memory initParams + ) internal { + InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( + payable(proxyAddress) + ); + + proxy.upgradeToAndCall(implementation, initParams); + } +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol new file mode 100644 index 00000000..7894871b --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library ConfiguratorInputTypes { + struct InitReserveInput { + address aTokenImpl; + address variableDebtTokenImpl; + bool useVirtualBalance; + address interestRateStrategyAddress; + address underlyingAsset; + address treasury; + address incentivesController; + string aTokenName; + string aTokenSymbol; + string variableDebtTokenName; + string variableDebtTokenSymbol; + bytes params; + bytes interestRateData; + } + + struct UpdateATokenInput { + address asset; + address treasury; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } + + struct UpdateDebtTokenInput { + address asset; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/pool/PoolConfigurator.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/pool/PoolConfigurator.sol new file mode 100644 index 00000000..778ee79b --- /dev/null +++ b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/pool/PoolConfigurator.sol @@ -0,0 +1,630 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {VersionedInitializable} from '../../misc/aave-upgradeability/VersionedInitializable.sol'; +import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; +import {EModeConfiguration} from '../libraries/configuration/EModeConfiguration.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {IDefaultInterestRateStrategyV2} from '../../interfaces/IDefaultInterestRateStrategyV2.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; +import {PercentageMath} from '../libraries/math/PercentageMath.sol'; +import {DataTypes} from '../libraries/types/DataTypes.sol'; +import {ConfiguratorLogic} from '../libraries/logic/ConfiguratorLogic.sol'; +import {ConfiguratorInputTypes} from '../libraries/types/ConfiguratorInputTypes.sol'; +import {IPoolConfigurator} from '../../interfaces/IPoolConfigurator.sol'; +import {IPool} from '../../interfaces/IPool.sol'; +import {IACLManager} from '../../interfaces/IACLManager.sol'; +import {IPoolDataProvider} from '../../interfaces/IPoolDataProvider.sol'; +import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; + +/** + * @title PoolConfigurator + * @author Aave + * @dev Implements the configuration methods for the Aave protocol + */ +abstract contract PoolConfigurator is VersionedInitializable, IPoolConfigurator { + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + IPoolAddressesProvider internal _addressesProvider; + IPool internal _pool; + + mapping(address => uint256) internal _pendingLtv; + + uint40 public constant MAX_GRACE_PERIOD = 4 hours; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + _onlyPoolAdmin(); + _; + } + + /** + * @dev Only emergency or pool admin can call functions marked by this modifier. + */ + modifier onlyEmergencyOrPoolAdmin() { + _onlyPoolOrEmergencyAdmin(); + _; + } + + /** + * @dev Only asset listing or pool admin can call functions marked by this modifier. + */ + modifier onlyAssetListingOrPoolAdmins() { + _onlyAssetListingOrPoolAdmins(); + _; + } + + /** + * @dev Only risk or pool admin can call functions marked by this modifier. + */ + modifier onlyRiskOrPoolAdmins() { + _onlyRiskOrPoolAdmins(); + _; + } + + /** + * @dev Only risk, pool or emergency admin can call functions marked by this modifier. + */ + modifier onlyRiskOrPoolOrEmergencyAdmins() { + _onlyRiskOrPoolOrEmergencyAdmins(); + _; + } + + function initialize(IPoolAddressesProvider provider) public virtual; + + /// @inheritdoc IPoolConfigurator + function initReserves( + ConfiguratorInputTypes.InitReserveInput[] calldata input + ) external override onlyAssetListingOrPoolAdmins { + IPool cachedPool = _pool; + + for (uint256 i = 0; i < input.length; i++) { + ConfiguratorLogic.executeInitReserve(cachedPool, input[i]); + emit ReserveInterestRateDataChanged( + input[i].underlyingAsset, + input[i].interestRateStrategyAddress, + input[i].interestRateData + ); + } + } + + /// @inheritdoc IPoolConfigurator + function dropReserve(address asset) external override onlyPoolAdmin { + _pool.dropReserve(asset); + emit ReserveDropped(asset); + } + + /// @inheritdoc IPoolConfigurator + function updateAToken( + ConfiguratorInputTypes.UpdateATokenInput calldata input + ) external override onlyPoolAdmin { + ConfiguratorLogic.executeUpdateAToken(_pool, input); + } + + /// @inheritdoc IPoolConfigurator + function updateVariableDebtToken( + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external override onlyPoolAdmin { + ConfiguratorLogic.executeUpdateVariableDebtToken(_pool, input); + } + + /// @inheritdoc IPoolConfigurator + function setReserveBorrowing(address asset, bool enabled) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setBorrowingEnabled(enabled); + _pool.setConfiguration(asset, currentConfig); + emit ReserveBorrowing(asset, enabled); + } + + /// @inheritdoc IPoolConfigurator + function configureReserveAsCollateral( + address asset, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus + ) external override onlyRiskOrPoolAdmins { + //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_RESERVE_PARAMS); + + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + if (liquidationThreshold != 0) { + //liquidation bonus must be bigger than 100.00%, otherwise the liquidator would receive less + //collateral than needed to cover the debt + require(liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_PARAMS); + + //if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment + //a loan is taken there is enough collateral available to cover the liquidation bonus + require( + liquidationThreshold.percentMul(liquidationBonus) <= PercentageMath.PERCENTAGE_FACTOR, + Errors.INVALID_RESERVE_PARAMS + ); + } else { + require(liquidationBonus == 0, Errors.INVALID_RESERVE_PARAMS); + //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 supplied + _checkNoSuppliers(asset); + } + + uint256 newLtv = ltv; + + if (currentConfig.getFrozen()) { + _pendingLtv[asset] = ltv; + newLtv = 0; + + emit PendingLtvChanged(asset, ltv); + } else { + currentConfig.setLtv(ltv); + } + + currentConfig.setLiquidationThreshold(liquidationThreshold); + currentConfig.setLiquidationBonus(liquidationBonus); + + _pool.setConfiguration(asset, currentConfig); + + emit CollateralConfigurationChanged(asset, newLtv, liquidationThreshold, liquidationBonus); + } + + /// @inheritdoc IPoolConfigurator + function setReserveFlashLoaning( + address asset, + bool enabled + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + currentConfig.setFlashLoanEnabled(enabled); + _pool.setConfiguration(asset, currentConfig); + emit ReserveFlashLoaning(asset, enabled); + } + + /// @inheritdoc IPoolConfigurator + function setReserveActive(address asset, bool active) external override onlyPoolAdmin { + if (!active) _checkNoSuppliers(asset); + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setActive(active); + _pool.setConfiguration(asset, currentConfig); + emit ReserveActive(asset, active); + } + + /// @inheritdoc IPoolConfigurator + function setReserveFreeze( + address asset, + bool freeze + ) external override onlyRiskOrPoolOrEmergencyAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + require(freeze != currentConfig.getFrozen(), Errors.INVALID_FREEZE_STATE); + + currentConfig.setFrozen(freeze); + + uint256 ltvSet; + uint256 pendingLtvSet; + + if (freeze) { + pendingLtvSet = currentConfig.getLtv(); + _pendingLtv[asset] = pendingLtvSet; + currentConfig.setLtv(0); + } else { + ltvSet = _pendingLtv[asset]; + currentConfig.setLtv(ltvSet); + delete _pendingLtv[asset]; + } + + emit PendingLtvChanged(asset, pendingLtvSet); + emit CollateralConfigurationChanged( + asset, + ltvSet, + currentConfig.getLiquidationThreshold(), + currentConfig.getLiquidationBonus() + ); + + _pool.setConfiguration(asset, currentConfig); + emit ReserveFrozen(asset, freeze); + } + + /// @inheritdoc IPoolConfigurator + function setBorrowableInIsolation( + address asset, + bool borrowable + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setBorrowableInIsolation(borrowable); + _pool.setConfiguration(asset, currentConfig); + emit BorrowableInIsolationChanged(asset, borrowable); + } + + /// @inheritdoc IPoolConfigurator + function setReservePause( + address asset, + bool paused, + uint40 gracePeriod + ) public override onlyEmergencyOrPoolAdmin { + if (!paused && gracePeriod != 0) { + require(gracePeriod <= MAX_GRACE_PERIOD, Errors.INVALID_GRACE_PERIOD); + + uint40 until = uint40(block.timestamp) + gracePeriod; + _pool.setLiquidationGracePeriod(asset, until); + emit LiquidationGracePeriodChanged(asset, until); + } + + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setPaused(paused); + _pool.setConfiguration(asset, currentConfig); + emit ReservePaused(asset, paused); + } + + /// @inheritdoc IPoolConfigurator + function setReservePause(address asset, bool paused) external override onlyEmergencyOrPoolAdmin { + setReservePause(asset, paused, 0); + } + + /// @inheritdoc IPoolConfigurator + function disableLiquidationGracePeriod(address asset) external override onlyEmergencyOrPoolAdmin { + // set the liquidation grace period in the past to disable liquidation grace period + _pool.setLiquidationGracePeriod(asset, 0); + + emit LiquidationGracePeriodDisabled(asset); + } + + /// @inheritdoc IPoolConfigurator + function setReserveFactor( + address asset, + uint256 newReserveFactor + ) external override onlyRiskOrPoolAdmins { + require(newReserveFactor <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + _pool.syncIndexesState(asset); + + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldReserveFactor = currentConfig.getReserveFactor(); + currentConfig.setReserveFactor(newReserveFactor); + _pool.setConfiguration(asset, currentConfig); + emit ReserveFactorChanged(asset, oldReserveFactor, newReserveFactor); + + _pool.syncRatesState(asset); + } + + /// @inheritdoc IPoolConfigurator + function setDebtCeiling( + address asset, + uint256 newDebtCeiling + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + uint256 oldDebtCeiling = currentConfig.getDebtCeiling(); + if (currentConfig.getLiquidationThreshold() != 0 && oldDebtCeiling == 0) { + _checkNoSuppliers(asset); + } + currentConfig.setDebtCeiling(newDebtCeiling); + _pool.setConfiguration(asset, currentConfig); + + if (newDebtCeiling == 0) { + _pool.resetIsolationModeTotalDebt(asset); + } + + emit DebtCeilingChanged(asset, oldDebtCeiling, newDebtCeiling); + } + + /// @inheritdoc IPoolConfigurator + function setSiloedBorrowing( + address asset, + bool newSiloed + ) external override onlyRiskOrPoolAdmins { + if (newSiloed) { + _checkNoBorrowers(asset); + } + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + bool oldSiloed = currentConfig.getSiloedBorrowing(); + + currentConfig.setSiloedBorrowing(newSiloed); + + _pool.setConfiguration(asset, currentConfig); + + emit SiloedBorrowingChanged(asset, oldSiloed, newSiloed); + } + + /// @inheritdoc IPoolConfigurator + function setBorrowCap( + address asset, + uint256 newBorrowCap + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldBorrowCap = currentConfig.getBorrowCap(); + currentConfig.setBorrowCap(newBorrowCap); + _pool.setConfiguration(asset, currentConfig); + emit BorrowCapChanged(asset, oldBorrowCap, newBorrowCap); + } + + /// @inheritdoc IPoolConfigurator + function setSupplyCap( + address asset, + uint256 newSupplyCap + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldSupplyCap = currentConfig.getSupplyCap(); + currentConfig.setSupplyCap(newSupplyCap); + _pool.setConfiguration(asset, currentConfig); + emit SupplyCapChanged(asset, oldSupplyCap, newSupplyCap); + } + + /// @inheritdoc IPoolConfigurator + function setLiquidationProtocolFee( + address asset, + uint256 newFee + ) external override onlyRiskOrPoolAdmins { + require(newFee <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_LIQUIDATION_PROTOCOL_FEE); + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldFee = currentConfig.getLiquidationProtocolFee(); + currentConfig.setLiquidationProtocolFee(newFee); + _pool.setConfiguration(asset, currentConfig); + emit LiquidationProtocolFeeChanged(asset, oldFee, newFee); + } + + /// @inheritdoc IPoolConfigurator + function setEModeCategory( + uint8 categoryId, + uint16 ltv, + uint16 liquidationThreshold, + uint16 liquidationBonus, + string calldata label + ) external override onlyRiskOrPoolAdmins { + require(ltv != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); + require(liquidationThreshold != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); + + // 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_EMODE_CATEGORY_PARAMS); + require( + liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, + Errors.INVALID_EMODE_CATEGORY_PARAMS + ); + + // if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment + // a loan is taken there is enough collateral available to cover the liquidation bonus + require( + uint256(liquidationThreshold).percentMul(liquidationBonus) <= + PercentageMath.PERCENTAGE_FACTOR, + Errors.INVALID_EMODE_CATEGORY_PARAMS + ); + + DataTypes.EModeCategoryBaseConfiguration memory categoryData; + categoryData.ltv = ltv; + categoryData.liquidationThreshold = liquidationThreshold; + categoryData.liquidationBonus = liquidationBonus; + categoryData.label = label; + + _pool.configureEModeCategory(categoryId, categoryData); + emit EModeCategoryAdded( + categoryId, + ltv, + liquidationThreshold, + liquidationBonus, + address(0), + label + ); + } + + /// @inheritdoc IPoolConfigurator + function setAssetCollateralInEMode( + address asset, + uint8 categoryId, + bool allowed + ) external override onlyRiskOrPoolAdmins { + uint128 collateralBitmap = _pool.getEModeCategoryCollateralBitmap(categoryId); + DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); + require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED); + collateralBitmap = EModeConfiguration.setReserveBitmapBit( + collateralBitmap, + reserveData.id, + allowed + ); + _pool.configureEModeCategoryCollateralBitmap(categoryId, collateralBitmap); + emit AssetCollateralInEModeChanged(asset, categoryId, allowed); + } + + /// @inheritdoc IPoolConfigurator + function setAssetBorrowableInEMode( + address asset, + uint8 categoryId, + bool borrowable + ) external override onlyRiskOrPoolAdmins { + uint128 borrowableBitmap = _pool.getEModeCategoryBorrowableBitmap(categoryId); + DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); + require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED); + borrowableBitmap = EModeConfiguration.setReserveBitmapBit( + borrowableBitmap, + reserveData.id, + borrowable + ); + _pool.configureEModeCategoryBorrowableBitmap(categoryId, borrowableBitmap); + emit AssetBorrowableInEModeChanged(asset, categoryId, borrowable); + } + + /// @inheritdoc IPoolConfigurator + function setUnbackedMintCap( + address asset, + uint256 newUnbackedMintCap + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldUnbackedMintCap = currentConfig.getUnbackedMintCap(); + currentConfig.setUnbackedMintCap(newUnbackedMintCap); + _pool.setConfiguration(asset, currentConfig); + emit UnbackedMintCapChanged(asset, oldUnbackedMintCap, newUnbackedMintCap); + } + + /// @inheritdoc IPoolConfigurator + function setReserveInterestRateData( + address asset, + bytes calldata rateData + ) external onlyRiskOrPoolAdmins { + DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset); + _updateInterestRateStrategy(asset, reserve, reserve.interestRateStrategyAddress, rateData); + } + + /// @inheritdoc IPoolConfigurator + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress, + bytes calldata rateData + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset); + _updateInterestRateStrategy(asset, reserve, rateStrategyAddress, rateData); + } + + /// @inheritdoc IPoolConfigurator + function setPoolPause(bool paused, uint40 gracePeriod) public override onlyEmergencyOrPoolAdmin { + address[] memory reserves = _pool.getReservesList(); + + for (uint256 i = 0; i < reserves.length; i++) { + if (reserves[i] != address(0)) { + setReservePause(reserves[i], paused, gracePeriod); + } + } + } + + /// @inheritdoc IPoolConfigurator + function setPoolPause(bool paused) external override onlyEmergencyOrPoolAdmin { + setPoolPause(paused, 0); + } + + /// @inheritdoc IPoolConfigurator + function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external override onlyPoolAdmin { + require( + newBridgeProtocolFee <= PercentageMath.PERCENTAGE_FACTOR, + Errors.BRIDGE_PROTOCOL_FEE_INVALID + ); + uint256 oldBridgeProtocolFee = _pool.BRIDGE_PROTOCOL_FEE(); + _pool.updateBridgeProtocolFee(newBridgeProtocolFee); + emit BridgeProtocolFeeUpdated(oldBridgeProtocolFee, newBridgeProtocolFee); + } + + /// @inheritdoc IPoolConfigurator + function updateFlashloanPremiumTotal( + uint128 newFlashloanPremiumTotal + ) external override onlyPoolAdmin { + require( + newFlashloanPremiumTotal <= PercentageMath.PERCENTAGE_FACTOR, + Errors.FLASHLOAN_PREMIUM_INVALID + ); + uint128 oldFlashloanPremiumTotal = _pool.FLASHLOAN_PREMIUM_TOTAL(); + _pool.updateFlashloanPremiums(newFlashloanPremiumTotal, _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL()); + emit FlashloanPremiumTotalUpdated(oldFlashloanPremiumTotal, newFlashloanPremiumTotal); + } + + /// @inheritdoc IPoolConfigurator + function updateFlashloanPremiumToProtocol( + uint128 newFlashloanPremiumToProtocol + ) external override onlyPoolAdmin { + require( + newFlashloanPremiumToProtocol <= PercentageMath.PERCENTAGE_FACTOR, + Errors.FLASHLOAN_PREMIUM_INVALID + ); + uint128 oldFlashloanPremiumToProtocol = _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL(); + _pool.updateFlashloanPremiums(_pool.FLASHLOAN_PREMIUM_TOTAL(), newFlashloanPremiumToProtocol); + emit FlashloanPremiumToProtocolUpdated( + oldFlashloanPremiumToProtocol, + newFlashloanPremiumToProtocol + ); + } + + /// @inheritdoc IPoolConfigurator + function getPendingLtv(address asset) external view override returns (uint256) { + return _pendingLtv[asset]; + } + + /// @inheritdoc IPoolConfigurator + function getConfiguratorLogic() external pure returns (address) { + return address(ConfiguratorLogic); + } + + function _updateInterestRateStrategy( + address asset, + DataTypes.ReserveDataLegacy memory reserve, + address newRateStrategyAddress, + bytes calldata rateData + ) internal { + address oldRateStrategyAddress = reserve.interestRateStrategyAddress; + + _pool.syncIndexesState(asset); + + IDefaultInterestRateStrategyV2(newRateStrategyAddress).setInterestRateParams(asset, rateData); + emit ReserveInterestRateDataChanged(asset, newRateStrategyAddress, rateData); + + if (oldRateStrategyAddress != newRateStrategyAddress) { + _pool.setReserveInterestRateStrategyAddress(asset, newRateStrategyAddress); + emit ReserveInterestRateStrategyChanged( + asset, + oldRateStrategyAddress, + newRateStrategyAddress + ); + } + + _pool.syncRatesState(asset); + } + + function _checkNoSuppliers(address asset) internal view { + DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); + uint256 totalSupplied = IPoolDataProvider(_addressesProvider.getPoolDataProvider()) + .getATokenTotalSupply(asset); + + require( + totalSupplied == 0 && reserveData.accruedToTreasury == 0, + Errors.RESERVE_LIQUIDITY_NOT_ZERO + ); + } + + function _checkNoBorrowers(address asset) internal view { + uint256 totalDebt = IPoolDataProvider(_addressesProvider.getPoolDataProvider()).getTotalDebt( + asset + ); + require(totalDebt == 0, Errors.RESERVE_DEBT_NOT_ZERO); + } + + function _onlyPoolAdmin() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + } + + function _onlyPoolOrEmergencyAdmin() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isPoolAdmin(msg.sender) || aclManager.isEmergencyAdmin(msg.sender), + Errors.CALLER_NOT_POOL_OR_EMERGENCY_ADMIN + ); + } + + function _onlyAssetListingOrPoolAdmins() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), + Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN + ); + } + + function _onlyRiskOrPoolAdmins() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isRiskAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), + Errors.CALLER_NOT_RISK_OR_POOL_ADMIN + ); + } + + function _onlyRiskOrPoolOrEmergencyAdmins() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isRiskAdmin(msg.sender) || + aclManager.isPoolAdmin(msg.sender) || + aclManager.isEmergencyAdmin(msg.sender), + Errors.CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN + ); + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC.sol b/downloads/ARBITRUM/POOL_LOGIC.sol new file mode 100644 index 00000000..a04f0bbb --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC.sol @@ -0,0 +1,5723 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} + +// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol + +/** + * @title PoolLogic library + * @author Aave + * @notice Implements the logic for Pool specific functions + */ +library PoolLogic { + using GPv2SafeERC20 for IERC20; + using WadRayMath for uint256; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice Initialize an asset reserve and add the reserve to the list of reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param params Additional parameters needed for initiation + * @return true if appended, false if inserted at existing empty spot + */ + function executeInitReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.InitReserveParams memory params + ) external returns (bool) { + require(Address.isContract(params.asset), Errors.NOT_CONTRACT); + reservesData[params.asset].init( + params.aTokenAddress, + params.variableDebtAddress, + params.interestRateStrategyAddress + ); + + bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || + reservesList[0] == params.asset; + require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); + + for (uint16 i = 0; i < params.reservesCount; i++) { + if (reservesList[i] == address(0)) { + reservesData[params.asset].id = i; + reservesList[i] = params.asset; + return false; + } + } + + require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); + reservesData[params.asset].id = params.reservesCount; + reservesList[params.reservesCount] = params.asset; + return true; + } + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function executeRescueTokens(address token, address to, uint256 amount) external { + IERC20(token).safeTransfer(to, amount); + } + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param reservesData The state of all the reserves + * @param assets The list of reserves for which the minting needs to be executed + */ + function executeMintToTreasury( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] calldata assets + ) external { + for (uint256 i = 0; i < assets.length; i++) { + address assetAddress = assets[i]; + + DataTypes.ReserveData storage reserve = reservesData[assetAddress]; + + // this cover both inactive reserves and invalid reserves since the flag will be 0 for both + if (!reserve.configuration.getActive()) { + continue; + } + + uint256 accruedToTreasury = reserve.accruedToTreasury; + + if (accruedToTreasury != 0) { + reserve.accruedToTreasury = 0; + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); + IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); + + emit MintedToTreasury(assetAddress, amountToMint); + } + } + } + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function executeResetIsolationModeTotalDebt( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset + ) external { + require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); + reservesData[asset].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(asset, 0); + } + + /** + * @notice Sets the liquidation grace period of the asset + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + */ + function executeSetLiquidationGracePeriod( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset, + uint40 until + ) external { + reservesData[asset].liquidationGracePeriodUntil = until; + } + + /** + * @notice Drop a reserve + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param asset The address of the underlying asset of the reserve + */ + function executeDropReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + address asset + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + ValidationLogic.validateDropReserve(reservesList, reserve, asset); + reservesList[reservesData[asset].id] = address(0); + delete reservesData[asset]; + } + + /** + * @notice Returns the user account data across all the reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the calculation + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function executeGetUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ) + { + ( + totalCollateralBase, + totalDebtBase, + ltv, + currentLiquidationThreshold, + healthFactor, + + ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); + + availableBorrowsBase = GenericLogic.calculateAvailableBorrows( + totalCollateralBase, + totalDebtBase, + ltv + ); + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..01e1bcaf --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol @@ -0,0 +1,833 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..e7ba8f7a --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..43987f47 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,583 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..647fc7e7 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..cd5b83c6 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol new file mode 100644 index 00000000..1558fe55 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; + +/** + * @title PoolLogic library + * @author Aave + * @notice Implements the logic for Pool specific functions + */ +library PoolLogic { + using GPv2SafeERC20 for IERC20; + using WadRayMath for uint256; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice Initialize an asset reserve and add the reserve to the list of reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param params Additional parameters needed for initiation + * @return true if appended, false if inserted at existing empty spot + */ + function executeInitReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.InitReserveParams memory params + ) external returns (bool) { + require(Address.isContract(params.asset), Errors.NOT_CONTRACT); + reservesData[params.asset].init( + params.aTokenAddress, + params.variableDebtAddress, + params.interestRateStrategyAddress + ); + + bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || + reservesList[0] == params.asset; + require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); + + for (uint16 i = 0; i < params.reservesCount; i++) { + if (reservesList[i] == address(0)) { + reservesData[params.asset].id = i; + reservesList[i] = params.asset; + return false; + } + } + + require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); + reservesData[params.asset].id = params.reservesCount; + reservesList[params.reservesCount] = params.asset; + return true; + } + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function executeRescueTokens(address token, address to, uint256 amount) external { + IERC20(token).safeTransfer(to, amount); + } + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param reservesData The state of all the reserves + * @param assets The list of reserves for which the minting needs to be executed + */ + function executeMintToTreasury( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] calldata assets + ) external { + for (uint256 i = 0; i < assets.length; i++) { + address assetAddress = assets[i]; + + DataTypes.ReserveData storage reserve = reservesData[assetAddress]; + + // this cover both inactive reserves and invalid reserves since the flag will be 0 for both + if (!reserve.configuration.getActive()) { + continue; + } + + uint256 accruedToTreasury = reserve.accruedToTreasury; + + if (accruedToTreasury != 0) { + reserve.accruedToTreasury = 0; + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); + IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); + + emit MintedToTreasury(assetAddress, amountToMint); + } + } + } + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function executeResetIsolationModeTotalDebt( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset + ) external { + require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); + reservesData[asset].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(asset, 0); + } + + /** + * @notice Sets the liquidation grace period of the asset + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + */ + function executeSetLiquidationGracePeriod( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset, + uint40 until + ) external { + reservesData[asset].liquidationGracePeriodUntil = until; + } + + /** + * @notice Drop a reserve + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param asset The address of the underlying asset of the reserve + */ + function executeDropReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + address asset + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + ValidationLogic.validateDropReserve(reservesList, reserve, asset); + reservesList[reservesData[asset].id] = address(0); + delete reservesData[asset]; + } + + /** + * @notice Returns the user account data across all the reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the calculation + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function executeGetUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ) + { + ( + totalCollateralBase, + totalDebtBase, + ltv, + currentLiquidationThreshold, + healthFactor, + + ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); + + availableBorrowsBase = GenericLogic.calculateAvailableBorrows( + totalCollateralBase, + totalDebtBase, + ltv + ); + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..dd5c637d --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..e08a30e8 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,642 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..9adca939 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC.sol b/downloads/ARBITRUM/SUPPLY_LOGIC.sol new file mode 100644 index 00000000..99515df3 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC.sol @@ -0,0 +1,5822 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} + +// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol + +/** + * @title SupplyLogic library + * @author Aave + * @notice Implements the base logic for supply/withdraw + */ +library SupplyLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. + * @dev Emits the `Supply()` event. + * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as + * collateral. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the supply function + */ + function executeSupply( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSupplyParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, reserve, params.amount, params.onBehalfOf); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, params.amount, 0); + + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + params.onBehalfOf, + params.amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration, + reserveCache.aTokenAddress + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); + } + } + + emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); + } + + /** + * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset + * previously supplied in the Aave protocol. + * @dev Emits the `Withdraw()` event. + * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the withdraw function + * @return The actual amount withdrawn + */ + function executeWithdraw( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteWithdrawParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + require(params.to != reserveCache.aTokenAddress, Errors.WITHDRAW_TO_ATOKEN); + + reserve.updateState(reserveCache); + + uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( + reserveCache.nextLiquidityIndex + ); + + uint256 amountToWithdraw = params.amount; + + if (params.amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + + ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, amountToWithdraw); + + bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); + + if (isCollateral && amountToWithdraw == userBalance) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + params.to, + amountToWithdraw, + reserveCache.nextLiquidityIndex + ); + + if (isCollateral && userConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + params.asset, + msg.sender, + params.reservesCount, + params.oracle, + params.userEModeCategory + ); + } + + emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); + + return amountToWithdraw; + } + + /** + * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid + * collateralization constraints violation. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as + * collateral. + * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param params The additional parameters needed to execute the finalizeTransfer function + */ + function executeFinalizeTransfer( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.FinalizeTransferParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + + ValidationLogic.validateTransfer(reserve); + + uint256 reserveId = reserve.id; + uint256 scaledAmount = params.amount.rayDiv(reserve.getNormalizedIncome()); + + if (params.from != params.to && scaledAmount != 0) { + DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; + + if (fromConfig.isUsingAsCollateral(reserveId)) { + if (fromConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + usersConfig[params.from], + params.asset, + params.from, + params.reservesCount, + params.oracle, + params.fromEModeCategory + ); + } + if (params.balanceFromBefore == params.amount) { + fromConfig.setUsingAsCollateral(reserveId, false); + emit ReserveUsedAsCollateralDisabled(params.asset, params.from); + } + } + + if (params.balanceToBefore == 0) { + DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + toConfig, + reserve.configuration, + reserve.aTokenAddress + ) + ) { + toConfig.setUsingAsCollateral(reserveId, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.to); + } + } + } + } + + /** + * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as + * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor + * checks to ensure collateralization. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. + * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The users configuration mapping that track the supplied/borrowed assets + * @param asset The address of the asset being configured as collateral + * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise + * @param reservesCount The number of initialized reserves + * @param priceOracle The address of the price oracle + * @param userEModeCategory The eMode category chosen by the user + */ + function executeUseReserveAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + bool useAsCollateral, + uint256 reservesCount, + address priceOracle, + uint8 userEModeCategory + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); + + ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); + + if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; + + if (useAsCollateral) { + require( + ValidationLogic.validateUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration + ), + Errors.USER_IN_ISOLATION_MODE_OR_LTV_ZERO + ); + + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, msg.sender); + } else { + userConfig.setUsingAsCollateral(reserve.id, false); + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + asset, + msg.sender, + reservesCount, + priceOracle, + userEModeCategory + ); + + emit ReserveUsedAsCollateralDisabled(asset, msg.sender); + } + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..01e1bcaf --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol @@ -0,0 +1,833 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..e7ba8f7a --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..43987f47 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,583 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..647fc7e7 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..cd5b83c6 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..dd5c637d --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol new file mode 100644 index 00000000..727886e7 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol @@ -0,0 +1,300 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; + +/** + * @title SupplyLogic library + * @author Aave + * @notice Implements the base logic for supply/withdraw + */ +library SupplyLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. + * @dev Emits the `Supply()` event. + * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as + * collateral. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the supply function + */ + function executeSupply( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSupplyParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, reserve, params.amount, params.onBehalfOf); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, params.amount, 0); + + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + params.onBehalfOf, + params.amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration, + reserveCache.aTokenAddress + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); + } + } + + emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); + } + + /** + * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset + * previously supplied in the Aave protocol. + * @dev Emits the `Withdraw()` event. + * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the withdraw function + * @return The actual amount withdrawn + */ + function executeWithdraw( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteWithdrawParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + require(params.to != reserveCache.aTokenAddress, Errors.WITHDRAW_TO_ATOKEN); + + reserve.updateState(reserveCache); + + uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( + reserveCache.nextLiquidityIndex + ); + + uint256 amountToWithdraw = params.amount; + + if (params.amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + + ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, amountToWithdraw); + + bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); + + if (isCollateral && amountToWithdraw == userBalance) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + params.to, + amountToWithdraw, + reserveCache.nextLiquidityIndex + ); + + if (isCollateral && userConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + params.asset, + msg.sender, + params.reservesCount, + params.oracle, + params.userEModeCategory + ); + } + + emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); + + return amountToWithdraw; + } + + /** + * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid + * collateralization constraints violation. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as + * collateral. + * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param params The additional parameters needed to execute the finalizeTransfer function + */ + function executeFinalizeTransfer( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.FinalizeTransferParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + + ValidationLogic.validateTransfer(reserve); + + uint256 reserveId = reserve.id; + uint256 scaledAmount = params.amount.rayDiv(reserve.getNormalizedIncome()); + + if (params.from != params.to && scaledAmount != 0) { + DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; + + if (fromConfig.isUsingAsCollateral(reserveId)) { + if (fromConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + usersConfig[params.from], + params.asset, + params.from, + params.reservesCount, + params.oracle, + params.fromEModeCategory + ); + } + if (params.balanceFromBefore == params.amount) { + fromConfig.setUsingAsCollateral(reserveId, false); + emit ReserveUsedAsCollateralDisabled(params.asset, params.from); + } + } + + if (params.balanceToBefore == 0) { + DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + toConfig, + reserve.configuration, + reserve.aTokenAddress + ) + ) { + toConfig.setUsingAsCollateral(reserveId, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.to); + } + } + } + } + + /** + * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as + * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor + * checks to ensure collateralization. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. + * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The users configuration mapping that track the supplied/borrowed assets + * @param asset The address of the asset being configured as collateral + * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise + * @param reservesCount The number of initialized reserves + * @param priceOracle The address of the price oracle + * @param userEModeCategory The eMode category chosen by the user + */ + function executeUseReserveAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + bool useAsCollateral, + uint256 reservesCount, + address priceOracle, + uint8 userEModeCategory + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); + + ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); + + if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; + + if (useAsCollateral) { + require( + ValidationLogic.validateUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration + ), + Errors.USER_IN_ISOLATION_MODE_OR_LTV_ZERO + ); + + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, msg.sender); + } else { + userConfig.setUsingAsCollateral(reserve.id, false); + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + asset, + msg.sender, + reservesCount, + priceOracle, + userEModeCategory + ); + + emit ReserveUsedAsCollateralDisabled(asset, msg.sender); + } + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..e08a30e8 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,642 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..9adca939 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER.sol new file mode 100644 index 00000000..d31e3f77 --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER.sol @@ -0,0 +1,4044 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol + +/** + * @title IRewardsDistributor + * @author Aave + * @notice Defines the basic interface for a Rewards Distributor. + */ +interface IRewardsDistributor { + /** + * @dev Emitted when the configuration of the rewards of an asset is updated. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param oldEmission The old emissions per second value of the reward distribution + * @param newEmission The new emissions per second value of the reward distribution + * @param oldDistributionEnd The old end timestamp of the reward distribution + * @param newDistributionEnd The new end timestamp of the reward distribution + * @param assetIndex The index of the asset distribution + */ + event AssetConfigUpdated( + address indexed asset, + address indexed reward, + uint256 oldEmission, + uint256 newEmission, + uint256 oldDistributionEnd, + uint256 newDistributionEnd, + uint256 assetIndex + ); + + /** + * @dev Emitted when rewards of an asset are accrued on behalf of a user. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param user The address of the user that rewards are accrued on behalf of + * @param assetIndex The index of the asset distribution + * @param userIndex The index of the asset distribution on behalf of the user + * @param rewardsAccrued The amount of rewards accrued + */ + event Accrued( + address indexed asset, + address indexed reward, + address indexed user, + uint256 assetIndex, + uint256 userIndex, + uint256 rewardsAccrued + ); + + /** + * @dev Sets the end date for the distribution + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Gets the end date for the distribution + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The timestamp with the end of the distribution, in unix time format + **/ + function getDistributionEnd(address asset, address reward) external view returns (uint256); + + /** + * @dev Returns the index of a user on a reward distribution + * @param user Address of the user + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The current user asset index, not including new distributions + **/ + function getUserAssetIndex( + address user, + address asset, + address reward + ) external view returns (uint256); + + /** + * @dev Returns the configuration of the distribution reward for a certain asset + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The index of the asset distribution + * @return The emission per second of the reward distribution + * @return The timestamp of the last update of the index + * @return The timestamp of the distribution end + **/ + function getRewardsData( + address asset, + address reward + ) external view returns (uint256, uint256, uint256, uint256); + + /** + * @dev Calculates the next value of an specific distribution index, with validations. + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The old index of the asset distribution + * @return The new index of the asset distribution + **/ + function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); + + /** + * @dev Returns the list of available reward token addresses of an incentivized asset + * @param asset The incentivized asset + * @return List of rewards addresses of the input asset + **/ + function getRewardsByAsset(address asset) external view returns (address[] memory); + + /** + * @dev Returns the list of available reward addresses + * @return List of rewards supported in this contract + **/ + function getRewardsList() external view returns (address[] memory); + + /** + * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. + * @param user The address of the user + * @param reward The address of the reward token + * @return Unclaimed rewards, not including new distributions + **/ + function getUserAccruedRewards(address user, address reward) external view returns (uint256); + + /** + * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @param reward The address of the reward token + * @return The rewards amount + **/ + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view returns (uint256); + + /** + * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @return The list of reward addresses + * @return The list of unclaimed amount of rewards + **/ + function getAllUserRewards( + address[] calldata assets, + address user + ) external view returns (address[] memory, uint256[] memory); + + /** + * @dev Returns the decimals of an asset to calculate the distribution delta + * @param asset The address to retrieve decimals + * @return The decimals of an underlying asset + */ + function getAssetDecimals(address asset) external view returns (uint8); + + /** + * @dev Returns the address of the emission manager + * @return The address of the EmissionManager + */ + function EMISSION_MANAGER() external view returns (address); + + /** + * @dev Returns the address of the emission manager. + * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. + * @return The address of the EmissionManager + */ + function getEmissionManager() external view returns (address); +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol + +interface ITransferStrategyBase { + event EmergencyWithdrawal( + address indexed caller, + address indexed token, + address indexed to, + uint256 amount + ); + + /** + * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation + * @param to Account to transfer rewards + * @param reward Address of the reward token + * @param amount Amount to transfer to the "to" address parameter + * @return Returns true bool if transfer logic succeeds + */ + function performTransfer(address to, address reward, uint256 amount) external returns (bool); + + /** + * @return Returns the address of the Incentives Controller + */ + function getIncentivesController() external view returns (address); + + /** + * @return Returns the address of the Rewards admin + */ + function getRewardsAdmin() external view returns (address); + + /** + * @dev Perform an emergency token withdrawal only callable by the Rewards admin + * @param token Address of the token to withdraw funds from this contract + * @param to Address of the recipient of the withdrawal + * @param amount Amount of the withdrawal + */ + function emergencyWithdrawal(address token, address to, uint256 amount) external; +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol + +interface IUiIncentiveDataProviderV3 { + struct AggregatedReserveIncentiveData { + address underlyingAsset; + IncentiveData aIncentiveData; + IncentiveData vIncentiveData; + } + + struct IncentiveData { + address tokenAddress; + address incentiveControllerAddress; + RewardInfo[] rewardsTokenInformation; + } + + struct RewardInfo { + string rewardTokenSymbol; + address rewardTokenAddress; + address rewardOracleAddress; + uint256 emissionPerSecond; + uint256 incentivesLastUpdateTimestamp; + uint256 tokenIncentivesIndex; + uint256 emissionEndTimestamp; + int256 rewardPriceFeed; + uint8 rewardTokenDecimals; + uint8 precision; + uint8 priceFeedDecimals; + } + + struct UserReserveIncentiveData { + address underlyingAsset; + UserIncentiveData aTokenIncentivesUserData; + UserIncentiveData vTokenIncentivesUserData; + } + + struct UserIncentiveData { + address tokenAddress; + address incentiveControllerAddress; + UserRewardInfo[] userRewardsInformation; + } + + struct UserRewardInfo { + string rewardTokenSymbol; + address rewardOracleAddress; + address rewardTokenAddress; + uint256 userUnclaimedRewards; + uint256 tokenIncentivesUserIndex; + int256 rewardPriceFeed; + uint8 priceFeedDecimals; + uint8 rewardTokenDecimals; + } + + function getReservesIncentivesData( + IPoolAddressesProvider provider + ) external view returns (AggregatedReserveIncentiveData[] memory); + + function getUserReservesIncentivesData( + IPoolAddressesProvider provider, + address user + ) external view returns (UserReserveIncentiveData[] memory); + + // generic method with full data + function getFullReservesIncentiveData( + IPoolAddressesProvider provider, + address user + ) + external + view + returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory); +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol + +library RewardsDataTypes { + struct RewardsConfigInput { + uint88 emissionPerSecond; + uint256 totalSupply; + uint32 distributionEnd; + address asset; + address reward; + ITransferStrategyBase transferStrategy; + IEACAggregatorProxy rewardOracle; + } + + struct UserAssetBalance { + address asset; + uint256 userBalance; + uint256 totalSupply; + } + + struct UserData { + // Liquidity index of the reward distribution for the user + uint104 index; + // Amount of accrued rewards for the user since last user index update + uint128 accrued; + } + + struct RewardData { + // Liquidity index of the reward distribution + uint104 index; + // Amount of reward tokens distributed per second + uint88 emissionPerSecond; + // Timestamp of the last reward index update + uint32 lastUpdateTimestamp; + // The end of the distribution of rewards (in seconds) + uint32 distributionEnd; + // Map of user addresses and their rewards data (userAddress => userData) + mapping(address => UserData) usersData; + } + + struct AssetData { + // Map of reward token addresses and their data (rewardTokenAddress => rewardData) + mapping(address => RewardData) rewards; + // List of reward token addresses for the asset + mapping(uint128 => address) availableRewards; + // Count of reward tokens for the asset + uint128 availableRewardsCount; + // Number of decimals of the asset + uint8 decimals; + } +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol + +/** + * @title IRewardsController + * @author Aave + * @notice Defines the basic interface for a Rewards Controller. + */ +interface IRewardsController is IRewardsDistributor { + /** + * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user + * @param user The address of the user + * @param claimer The address of the claimer + */ + event ClaimerSet(address indexed user, address indexed claimer); + + /** + * @dev Emitted when rewards are claimed + * @param user The address of the user rewards has been claimed on behalf of + * @param reward The address of the token reward is claimed + * @param to The address of the receiver of the rewards + * @param claimer The address of the claimer + * @param amount The amount of rewards claimed + */ + event RewardsClaimed( + address indexed user, + address indexed reward, + address indexed to, + address claimer, + uint256 amount + ); + + /** + * @dev Emitted when a transfer strategy is installed for the reward distribution + * @param reward The address of the token reward + * @param transferStrategy The address of TransferStrategy contract + */ + event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); + + /** + * @dev Emitted when the reward oracle is updated + * @param reward The address of the token reward + * @param rewardOracle The address of oracle + */ + event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Get the price aggregator oracle address + * @param reward The address of the reward + * @return The price oracle of the reward + */ + function getRewardOracle(address reward) external view returns (address); + + /** + * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) + * @param user The address of the user + * @return The claimer address + */ + function getClaimer(address user) external view returns (address); + + /** + * @dev Returns the Transfer Strategy implementation contract address being used for a reward address + * @param reward The address of the reward + * @return The address of the TransferStrategy contract + */ + function getTransferStrategy(address reward) external view returns (address); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + **/ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + + /** + * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The + * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external returns (uint256); + + /** + * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" + **/ + function claimAllRewards( + address[] calldata assets, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must + * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsToSelf( + address[] calldata assets + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol + +contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { + using UserConfiguration for DataTypes.UserConfigurationMap; + + function getFullReservesIncentiveData( + IPoolAddressesProvider provider, + address user + ) + external + view + override + returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory) + { + return (_getReservesIncentivesData(provider), _getUserReservesIncentivesData(provider, user)); + } + + function getReservesIncentivesData( + IPoolAddressesProvider provider + ) external view override returns (AggregatedReserveIncentiveData[] memory) { + return _getReservesIncentivesData(provider); + } + + function _getReservesIncentivesData( + IPoolAddressesProvider provider + ) private view returns (AggregatedReserveIncentiveData[] memory) { + IPool pool = IPool(provider.getPool()); + address[] memory reserves = pool.getReservesList(); + AggregatedReserveIncentiveData[] + memory reservesIncentiveData = new AggregatedReserveIncentiveData[](reserves.length); + // Iterate through the reserves to get all the information from the (a/s/v) Tokens + for (uint256 i = 0; i < reserves.length; i++) { + AggregatedReserveIncentiveData memory reserveIncentiveData = reservesIncentiveData[i]; + reserveIncentiveData.underlyingAsset = reserves[i]; + + DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); + + // Get aTokens rewards information + IRewardsController aTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) + ); + RewardInfo[] memory aRewardsInformation; + if (address(aTokenIncentiveController) != address(0)) { + address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( + baseData.aTokenAddress + ); + + aRewardsInformation = new RewardInfo[](aTokenRewardAddresses.length); + for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { + RewardInfo memory rewardInformation; + rewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; + + ( + rewardInformation.tokenIncentivesIndex, + rewardInformation.emissionPerSecond, + rewardInformation.incentivesLastUpdateTimestamp, + rewardInformation.emissionEndTimestamp + ) = aTokenIncentiveController.getRewardsData( + baseData.aTokenAddress, + rewardInformation.rewardTokenAddress + ); + + rewardInformation.precision = aTokenIncentiveController.getAssetDecimals( + baseData.aTokenAddress + ); + rewardInformation.rewardTokenDecimals = IERC20Detailed( + rewardInformation.rewardTokenAddress + ).decimals(); + rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) + .symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + rewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( + rewardInformation.rewardTokenAddress + ); + rewardInformation.priceFeedDecimals = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).decimals(); + rewardInformation.rewardPriceFeed = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).latestAnswer(); + + aRewardsInformation[j] = rewardInformation; + } + } + + reserveIncentiveData.aIncentiveData = IncentiveData( + baseData.aTokenAddress, + address(aTokenIncentiveController), + aRewardsInformation + ); + + // Get vTokens rewards information + IRewardsController vTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) + ); + RewardInfo[] memory vRewardsInformation; + if (address(vTokenIncentiveController) != address(0)) { + address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( + baseData.variableDebtTokenAddress + ); + vRewardsInformation = new RewardInfo[](vTokenRewardAddresses.length); + for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { + RewardInfo memory rewardInformation; + rewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; + + ( + rewardInformation.tokenIncentivesIndex, + rewardInformation.emissionPerSecond, + rewardInformation.incentivesLastUpdateTimestamp, + rewardInformation.emissionEndTimestamp + ) = vTokenIncentiveController.getRewardsData( + baseData.variableDebtTokenAddress, + rewardInformation.rewardTokenAddress + ); + + rewardInformation.precision = vTokenIncentiveController.getAssetDecimals( + baseData.variableDebtTokenAddress + ); + rewardInformation.rewardTokenDecimals = IERC20Detailed( + rewardInformation.rewardTokenAddress + ).decimals(); + rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) + .symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + rewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( + rewardInformation.rewardTokenAddress + ); + rewardInformation.priceFeedDecimals = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).decimals(); + rewardInformation.rewardPriceFeed = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).latestAnswer(); + + vRewardsInformation[j] = rewardInformation; + } + } + + reserveIncentiveData.vIncentiveData = IncentiveData( + baseData.variableDebtTokenAddress, + address(vTokenIncentiveController), + vRewardsInformation + ); + } + + return (reservesIncentiveData); + } + + function getUserReservesIncentivesData( + IPoolAddressesProvider provider, + address user + ) external view override returns (UserReserveIncentiveData[] memory) { + return _getUserReservesIncentivesData(provider, user); + } + + function _getUserReservesIncentivesData( + IPoolAddressesProvider provider, + address user + ) private view returns (UserReserveIncentiveData[] memory) { + IPool pool = IPool(provider.getPool()); + address[] memory reserves = pool.getReservesList(); + + UserReserveIncentiveData[] memory userReservesIncentivesData = new UserReserveIncentiveData[]( + user != address(0) ? reserves.length : 0 + ); + + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); + + // user reserve data + userReservesIncentivesData[i].underlyingAsset = reserves[i]; + + IRewardsController aTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) + ); + if (address(aTokenIncentiveController) != address(0)) { + // get all rewards information from the asset + address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( + baseData.aTokenAddress + ); + UserRewardInfo[] memory aUserRewardsInformation = new UserRewardInfo[]( + aTokenRewardAddresses.length + ); + for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { + UserRewardInfo memory userRewardInformation; + userRewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; + + userRewardInformation.tokenIncentivesUserIndex = aTokenIncentiveController + .getUserAssetIndex( + user, + baseData.aTokenAddress, + userRewardInformation.rewardTokenAddress + ); + + userRewardInformation.userUnclaimedRewards = aTokenIncentiveController + .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); + userRewardInformation.rewardTokenDecimals = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).decimals(); + userRewardInformation.rewardTokenSymbol = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + userRewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( + userRewardInformation.rewardTokenAddress + ); + userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).decimals(); + userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).latestAnswer(); + + aUserRewardsInformation[j] = userRewardInformation; + } + + userReservesIncentivesData[i].aTokenIncentivesUserData = UserIncentiveData( + baseData.aTokenAddress, + address(aTokenIncentiveController), + aUserRewardsInformation + ); + } + + // variable debt token + IRewardsController vTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) + ); + if (address(vTokenIncentiveController) != address(0)) { + // get all rewards information from the asset + address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( + baseData.variableDebtTokenAddress + ); + UserRewardInfo[] memory vUserRewardsInformation = new UserRewardInfo[]( + vTokenRewardAddresses.length + ); + for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { + UserRewardInfo memory userRewardInformation; + userRewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; + + userRewardInformation.tokenIncentivesUserIndex = vTokenIncentiveController + .getUserAssetIndex( + user, + baseData.variableDebtTokenAddress, + userRewardInformation.rewardTokenAddress + ); + + userRewardInformation.userUnclaimedRewards = vTokenIncentiveController + .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); + userRewardInformation.rewardTokenDecimals = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).decimals(); + userRewardInformation.rewardTokenSymbol = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + userRewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( + userRewardInformation.rewardTokenAddress + ); + userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).decimals(); + userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).latestAnswer(); + + vUserRewardsInformation[j] = userRewardInformation; + } + + userReservesIncentivesData[i].vTokenIncentivesUserData = UserIncentiveData( + baseData.variableDebtTokenAddress, + address(aTokenIncentiveController), + vUserRewardsInformation + ); + } + } + + return (userReservesIncentivesData); + } +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol new file mode 100644 index 00000000..79a1829d --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol @@ -0,0 +1,294 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../interfaces/IPool.sol'; +import {IncentivizedERC20} from '../protocol/tokenization/base/IncentivizedERC20.sol'; +import {UserConfiguration} from '../../contracts/protocol/libraries/configuration/UserConfiguration.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; +import {IRewardsController} from '../rewards/interfaces/IRewardsController.sol'; +import {IEACAggregatorProxy} from './interfaces/IEACAggregatorProxy.sol'; +import {IUiIncentiveDataProviderV3} from './interfaces/IUiIncentiveDataProviderV3.sol'; + +contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { + using UserConfiguration for DataTypes.UserConfigurationMap; + + function getFullReservesIncentiveData( + IPoolAddressesProvider provider, + address user + ) + external + view + override + returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory) + { + return (_getReservesIncentivesData(provider), _getUserReservesIncentivesData(provider, user)); + } + + function getReservesIncentivesData( + IPoolAddressesProvider provider + ) external view override returns (AggregatedReserveIncentiveData[] memory) { + return _getReservesIncentivesData(provider); + } + + function _getReservesIncentivesData( + IPoolAddressesProvider provider + ) private view returns (AggregatedReserveIncentiveData[] memory) { + IPool pool = IPool(provider.getPool()); + address[] memory reserves = pool.getReservesList(); + AggregatedReserveIncentiveData[] + memory reservesIncentiveData = new AggregatedReserveIncentiveData[](reserves.length); + // Iterate through the reserves to get all the information from the (a/s/v) Tokens + for (uint256 i = 0; i < reserves.length; i++) { + AggregatedReserveIncentiveData memory reserveIncentiveData = reservesIncentiveData[i]; + reserveIncentiveData.underlyingAsset = reserves[i]; + + DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); + + // Get aTokens rewards information + IRewardsController aTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) + ); + RewardInfo[] memory aRewardsInformation; + if (address(aTokenIncentiveController) != address(0)) { + address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( + baseData.aTokenAddress + ); + + aRewardsInformation = new RewardInfo[](aTokenRewardAddresses.length); + for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { + RewardInfo memory rewardInformation; + rewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; + + ( + rewardInformation.tokenIncentivesIndex, + rewardInformation.emissionPerSecond, + rewardInformation.incentivesLastUpdateTimestamp, + rewardInformation.emissionEndTimestamp + ) = aTokenIncentiveController.getRewardsData( + baseData.aTokenAddress, + rewardInformation.rewardTokenAddress + ); + + rewardInformation.precision = aTokenIncentiveController.getAssetDecimals( + baseData.aTokenAddress + ); + rewardInformation.rewardTokenDecimals = IERC20Detailed( + rewardInformation.rewardTokenAddress + ).decimals(); + rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) + .symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + rewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( + rewardInformation.rewardTokenAddress + ); + rewardInformation.priceFeedDecimals = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).decimals(); + rewardInformation.rewardPriceFeed = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).latestAnswer(); + + aRewardsInformation[j] = rewardInformation; + } + } + + reserveIncentiveData.aIncentiveData = IncentiveData( + baseData.aTokenAddress, + address(aTokenIncentiveController), + aRewardsInformation + ); + + // Get vTokens rewards information + IRewardsController vTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) + ); + RewardInfo[] memory vRewardsInformation; + if (address(vTokenIncentiveController) != address(0)) { + address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( + baseData.variableDebtTokenAddress + ); + vRewardsInformation = new RewardInfo[](vTokenRewardAddresses.length); + for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { + RewardInfo memory rewardInformation; + rewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; + + ( + rewardInformation.tokenIncentivesIndex, + rewardInformation.emissionPerSecond, + rewardInformation.incentivesLastUpdateTimestamp, + rewardInformation.emissionEndTimestamp + ) = vTokenIncentiveController.getRewardsData( + baseData.variableDebtTokenAddress, + rewardInformation.rewardTokenAddress + ); + + rewardInformation.precision = vTokenIncentiveController.getAssetDecimals( + baseData.variableDebtTokenAddress + ); + rewardInformation.rewardTokenDecimals = IERC20Detailed( + rewardInformation.rewardTokenAddress + ).decimals(); + rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) + .symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + rewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( + rewardInformation.rewardTokenAddress + ); + rewardInformation.priceFeedDecimals = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).decimals(); + rewardInformation.rewardPriceFeed = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).latestAnswer(); + + vRewardsInformation[j] = rewardInformation; + } + } + + reserveIncentiveData.vIncentiveData = IncentiveData( + baseData.variableDebtTokenAddress, + address(vTokenIncentiveController), + vRewardsInformation + ); + } + + return (reservesIncentiveData); + } + + function getUserReservesIncentivesData( + IPoolAddressesProvider provider, + address user + ) external view override returns (UserReserveIncentiveData[] memory) { + return _getUserReservesIncentivesData(provider, user); + } + + function _getUserReservesIncentivesData( + IPoolAddressesProvider provider, + address user + ) private view returns (UserReserveIncentiveData[] memory) { + IPool pool = IPool(provider.getPool()); + address[] memory reserves = pool.getReservesList(); + + UserReserveIncentiveData[] memory userReservesIncentivesData = new UserReserveIncentiveData[]( + user != address(0) ? reserves.length : 0 + ); + + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); + + // user reserve data + userReservesIncentivesData[i].underlyingAsset = reserves[i]; + + IRewardsController aTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) + ); + if (address(aTokenIncentiveController) != address(0)) { + // get all rewards information from the asset + address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( + baseData.aTokenAddress + ); + UserRewardInfo[] memory aUserRewardsInformation = new UserRewardInfo[]( + aTokenRewardAddresses.length + ); + for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { + UserRewardInfo memory userRewardInformation; + userRewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; + + userRewardInformation.tokenIncentivesUserIndex = aTokenIncentiveController + .getUserAssetIndex( + user, + baseData.aTokenAddress, + userRewardInformation.rewardTokenAddress + ); + + userRewardInformation.userUnclaimedRewards = aTokenIncentiveController + .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); + userRewardInformation.rewardTokenDecimals = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).decimals(); + userRewardInformation.rewardTokenSymbol = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + userRewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( + userRewardInformation.rewardTokenAddress + ); + userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).decimals(); + userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).latestAnswer(); + + aUserRewardsInformation[j] = userRewardInformation; + } + + userReservesIncentivesData[i].aTokenIncentivesUserData = UserIncentiveData( + baseData.aTokenAddress, + address(aTokenIncentiveController), + aUserRewardsInformation + ); + } + + // variable debt token + IRewardsController vTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) + ); + if (address(vTokenIncentiveController) != address(0)) { + // get all rewards information from the asset + address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( + baseData.variableDebtTokenAddress + ); + UserRewardInfo[] memory vUserRewardsInformation = new UserRewardInfo[]( + vTokenRewardAddresses.length + ); + for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { + UserRewardInfo memory userRewardInformation; + userRewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; + + userRewardInformation.tokenIncentivesUserIndex = vTokenIncentiveController + .getUserAssetIndex( + user, + baseData.variableDebtTokenAddress, + userRewardInformation.rewardTokenAddress + ); + + userRewardInformation.userUnclaimedRewards = vTokenIncentiveController + .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); + userRewardInformation.rewardTokenDecimals = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).decimals(); + userRewardInformation.rewardTokenSymbol = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + userRewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( + userRewardInformation.rewardTokenAddress + ); + userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).decimals(); + userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).latestAnswer(); + + vUserRewardsInformation[j] = userRewardInformation; + } + + userReservesIncentivesData[i].vTokenIncentivesUserData = UserIncentiveData( + baseData.variableDebtTokenAddress, + address(aTokenIncentiveController), + vUserRewardsInformation + ); + } + } + + return (userReservesIncentivesData); + } +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol new file mode 100644 index 00000000..c89baee6 --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol new file mode 100644 index 00000000..3402953f --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; + +interface IUiIncentiveDataProviderV3 { + struct AggregatedReserveIncentiveData { + address underlyingAsset; + IncentiveData aIncentiveData; + IncentiveData vIncentiveData; + } + + struct IncentiveData { + address tokenAddress; + address incentiveControllerAddress; + RewardInfo[] rewardsTokenInformation; + } + + struct RewardInfo { + string rewardTokenSymbol; + address rewardTokenAddress; + address rewardOracleAddress; + uint256 emissionPerSecond; + uint256 incentivesLastUpdateTimestamp; + uint256 tokenIncentivesIndex; + uint256 emissionEndTimestamp; + int256 rewardPriceFeed; + uint8 rewardTokenDecimals; + uint8 precision; + uint8 priceFeedDecimals; + } + + struct UserReserveIncentiveData { + address underlyingAsset; + UserIncentiveData aTokenIncentivesUserData; + UserIncentiveData vTokenIncentivesUserData; + } + + struct UserIncentiveData { + address tokenAddress; + address incentiveControllerAddress; + UserRewardInfo[] userRewardsInformation; + } + + struct UserRewardInfo { + string rewardTokenSymbol; + address rewardOracleAddress; + address rewardTokenAddress; + uint256 userUnclaimedRewards; + uint256 tokenIncentivesUserIndex; + int256 rewardPriceFeed; + uint8 priceFeedDecimals; + uint8 rewardTokenDecimals; + } + + function getReservesIncentivesData( + IPoolAddressesProvider provider + ) external view returns (AggregatedReserveIncentiveData[] memory); + + function getUserReservesIncentivesData( + IPoolAddressesProvider provider, + address user + ) external view returns (UserReserveIncentiveData[] memory); + + // generic method with full data + function getFullReservesIncentiveData( + IPoolAddressesProvider provider, + address user + ) + external + view + returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory); +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol new file mode 100644 index 00000000..cdb2ac29 --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IRewardsDistributor} from './IRewardsDistributor.sol'; +import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; +import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; +import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; + +/** + * @title IRewardsController + * @author Aave + * @notice Defines the basic interface for a Rewards Controller. + */ +interface IRewardsController is IRewardsDistributor { + /** + * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user + * @param user The address of the user + * @param claimer The address of the claimer + */ + event ClaimerSet(address indexed user, address indexed claimer); + + /** + * @dev Emitted when rewards are claimed + * @param user The address of the user rewards has been claimed on behalf of + * @param reward The address of the token reward is claimed + * @param to The address of the receiver of the rewards + * @param claimer The address of the claimer + * @param amount The amount of rewards claimed + */ + event RewardsClaimed( + address indexed user, + address indexed reward, + address indexed to, + address claimer, + uint256 amount + ); + + /** + * @dev Emitted when a transfer strategy is installed for the reward distribution + * @param reward The address of the token reward + * @param transferStrategy The address of TransferStrategy contract + */ + event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); + + /** + * @dev Emitted when the reward oracle is updated + * @param reward The address of the token reward + * @param rewardOracle The address of oracle + */ + event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Get the price aggregator oracle address + * @param reward The address of the reward + * @return The price oracle of the reward + */ + function getRewardOracle(address reward) external view returns (address); + + /** + * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) + * @param user The address of the user + * @return The claimer address + */ + function getClaimer(address user) external view returns (address); + + /** + * @dev Returns the Transfer Strategy implementation contract address being used for a reward address + * @param reward The address of the reward + * @return The address of the TransferStrategy contract + */ + function getTransferStrategy(address reward) external view returns (address); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + **/ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + + /** + * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The + * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external returns (uint256); + + /** + * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" + **/ + function claimAllRewards( + address[] calldata assets, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must + * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsToSelf( + address[] calldata assets + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol new file mode 100644 index 00000000..5cb58856 --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title IRewardsDistributor + * @author Aave + * @notice Defines the basic interface for a Rewards Distributor. + */ +interface IRewardsDistributor { + /** + * @dev Emitted when the configuration of the rewards of an asset is updated. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param oldEmission The old emissions per second value of the reward distribution + * @param newEmission The new emissions per second value of the reward distribution + * @param oldDistributionEnd The old end timestamp of the reward distribution + * @param newDistributionEnd The new end timestamp of the reward distribution + * @param assetIndex The index of the asset distribution + */ + event AssetConfigUpdated( + address indexed asset, + address indexed reward, + uint256 oldEmission, + uint256 newEmission, + uint256 oldDistributionEnd, + uint256 newDistributionEnd, + uint256 assetIndex + ); + + /** + * @dev Emitted when rewards of an asset are accrued on behalf of a user. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param user The address of the user that rewards are accrued on behalf of + * @param assetIndex The index of the asset distribution + * @param userIndex The index of the asset distribution on behalf of the user + * @param rewardsAccrued The amount of rewards accrued + */ + event Accrued( + address indexed asset, + address indexed reward, + address indexed user, + uint256 assetIndex, + uint256 userIndex, + uint256 rewardsAccrued + ); + + /** + * @dev Sets the end date for the distribution + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Gets the end date for the distribution + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The timestamp with the end of the distribution, in unix time format + **/ + function getDistributionEnd(address asset, address reward) external view returns (uint256); + + /** + * @dev Returns the index of a user on a reward distribution + * @param user Address of the user + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The current user asset index, not including new distributions + **/ + function getUserAssetIndex( + address user, + address asset, + address reward + ) external view returns (uint256); + + /** + * @dev Returns the configuration of the distribution reward for a certain asset + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The index of the asset distribution + * @return The emission per second of the reward distribution + * @return The timestamp of the last update of the index + * @return The timestamp of the distribution end + **/ + function getRewardsData( + address asset, + address reward + ) external view returns (uint256, uint256, uint256, uint256); + + /** + * @dev Calculates the next value of an specific distribution index, with validations. + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The old index of the asset distribution + * @return The new index of the asset distribution + **/ + function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); + + /** + * @dev Returns the list of available reward token addresses of an incentivized asset + * @param asset The incentivized asset + * @return List of rewards addresses of the input asset + **/ + function getRewardsByAsset(address asset) external view returns (address[] memory); + + /** + * @dev Returns the list of available reward addresses + * @return List of rewards supported in this contract + **/ + function getRewardsList() external view returns (address[] memory); + + /** + * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. + * @param user The address of the user + * @param reward The address of the reward token + * @return Unclaimed rewards, not including new distributions + **/ + function getUserAccruedRewards(address user, address reward) external view returns (uint256); + + /** + * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @param reward The address of the reward token + * @return The rewards amount + **/ + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view returns (uint256); + + /** + * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @return The list of reward addresses + * @return The list of unclaimed amount of rewards + **/ + function getAllUserRewards( + address[] calldata assets, + address user + ) external view returns (address[] memory, uint256[] memory); + + /** + * @dev Returns the decimals of an asset to calculate the distribution delta + * @param asset The address to retrieve decimals + * @return The decimals of an underlying asset + */ + function getAssetDecimals(address asset) external view returns (uint8); + + /** + * @dev Returns the address of the emission manager + * @return The address of the EmissionManager + */ + function EMISSION_MANAGER() external view returns (address); + + /** + * @dev Returns the address of the emission manager. + * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. + * @return The address of the EmissionManager + */ + function getEmissionManager() external view returns (address); +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol new file mode 100644 index 00000000..d2848fef --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +interface ITransferStrategyBase { + event EmergencyWithdrawal( + address indexed caller, + address indexed token, + address indexed to, + uint256 amount + ); + + /** + * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation + * @param to Account to transfer rewards + * @param reward Address of the reward token + * @param amount Amount to transfer to the "to" address parameter + * @return Returns true bool if transfer logic succeeds + */ + function performTransfer(address to, address reward, uint256 amount) external returns (bool); + + /** + * @return Returns the address of the Incentives Controller + */ + function getIncentivesController() external view returns (address); + + /** + * @return Returns the address of the Rewards admin + */ + function getRewardsAdmin() external view returns (address); + + /** + * @dev Perform an emergency token withdrawal only callable by the Rewards admin + * @param token Address of the token to withdraw funds from this contract + * @param to Address of the recipient of the withdrawal + * @param amount Amount of the withdrawal + */ + function emergencyWithdrawal(address token, address to, uint256 amount) external; +} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol new file mode 100644 index 00000000..38fe87c5 --- /dev/null +++ b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; +import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; + +library RewardsDataTypes { + struct RewardsConfigInput { + uint88 emissionPerSecond; + uint256 totalSupply; + uint32 distributionEnd; + address asset; + address reward; + ITransferStrategyBase transferStrategy; + IEACAggregatorProxy rewardOracle; + } + + struct UserAssetBalance { + address asset; + uint256 userBalance; + uint256 totalSupply; + } + + struct UserData { + // Liquidity index of the reward distribution for the user + uint104 index; + // Amount of accrued rewards for the user since last user index update + uint128 accrued; + } + + struct RewardData { + // Liquidity index of the reward distribution + uint104 index; + // Amount of reward tokens distributed per second + uint88 emissionPerSecond; + // Timestamp of the last reward index update + uint32 lastUpdateTimestamp; + // The end of the distribution of rewards (in seconds) + uint32 distributionEnd; + // Map of user addresses and their rewards data (userAddress => userData) + mapping(address => UserData) usersData; + } + + struct AssetData { + // Map of reward token addresses and their data (rewardTokenAddress => rewardData) + mapping(address => RewardData) rewards; + // List of reward token addresses for the asset + mapping(uint128 => address) availableRewards; + // Count of reward tokens for the asset + uint128 availableRewardsCount; + // Number of decimals of the asset + uint8 decimals; + } +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER.sol new file mode 100644 index 00000000..1457bcc5 --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER.sol @@ -0,0 +1,4068 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol + +interface IERC20DetailedBytes is IERC20 { + function name() external view returns (bytes32); + + function symbol() external view returns (bytes32); + + function decimals() external view returns (uint8); +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol + +/** + * @title IPoolDataProvider + * @author Aave + * @notice Defines the basic interface of a PoolDataProvider + */ +interface IPoolDataProvider { + struct TokenData { + string symbol; + address tokenAddress; + } + + /** + * @notice Returns the address for the PoolAddressesProvider contract. + * @return The address for the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the list of the existing reserves in the pool. + * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. + * @return The list of reserves, pairs of symbols and addresses + */ + function getAllReservesTokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the list of the existing ATokens in the pool. + * @return The list of ATokens, pairs of symbols and addresses + */ + function getAllATokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the configuration data of the reserve + * @dev Not returning borrow and supply caps for compatibility, nor pause flag + * @param asset The address of the underlying asset of the reserve + * @return decimals The number of decimals of the reserve + * @return ltv The ltv of the reserve + * @return liquidationThreshold The liquidationThreshold of the reserve + * @return liquidationBonus The liquidationBonus of the reserve + * @return reserveFactor The reserveFactor of the reserve + * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise + * @return borrowingEnabled True if borrowing is enabled, false otherwise + * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise + * @return isActive True if it is active, false otherwise + * @return isFrozen True if it is frozen, false otherwise + */ + function getReserveConfigurationData( + address asset + ) + external + view + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ); + + /** + * @notice Returns the caps parameters of the reserve + * @param asset The address of the underlying asset of the reserve + * @return borrowCap The borrow cap of the reserve + * @return supplyCap The supply cap of the reserve + */ + function getReserveCaps( + address asset + ) external view returns (uint256 borrowCap, uint256 supplyCap); + + /** + * @notice Returns if the pool is paused + * @param asset The address of the underlying asset of the reserve + * @return isPaused True if the pool is paused, false otherwise + */ + function getPaused(address asset) external view returns (bool isPaused); + + /** + * @notice Returns the siloed borrowing flag + * @param asset The address of the underlying asset of the reserve + * @return True if the asset is siloed for borrowing + */ + function getSiloedBorrowing(address asset) external view returns (bool); + + /** + * @notice Returns the protocol fee on the liquidation bonus + * @param asset The address of the underlying asset of the reserve + * @return The protocol fee on liquidation + */ + function getLiquidationProtocolFee(address asset) external view returns (uint256); + + /** + * @notice Returns the unbacked mint cap of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The unbacked mint cap of the reserve + */ + function getUnbackedMintCap(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The debt ceiling of the reserve + */ + function getDebtCeiling(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling decimals + * @return The debt ceiling decimals + */ + function getDebtCeilingDecimals() external pure returns (uint256); + + /** + * @notice Returns the reserve data + * @param asset The address of the underlying asset of the reserve + * @return unbacked The amount of unbacked tokens + * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted + * @return totalAToken The total supply of the aToken + * @return totalStableDebt The total stable debt of the reserve + * @return totalVariableDebt The total variable debt of the reserve + * @return liquidityRate The liquidity rate of the reserve + * @return variableBorrowRate The variable borrow rate of the reserve + * @return stableBorrowRate The stable borrow rate of the reserve + * @return averageStableBorrowRate The average stable borrow rate of the reserve + * @return liquidityIndex The liquidity index of the reserve + * @return variableBorrowIndex The variable borrow index of the reserve + * @return lastUpdateTimestamp The timestamp of the last update of the reserve + */ + function getReserveData( + address asset + ) + external + view + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ); + + /** + * @notice Returns the total supply of aTokens for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total supply of the aToken + */ + function getATokenTotalSupply(address asset) external view returns (uint256); + + /** + * @notice Returns the total debt for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total debt for asset + */ + function getTotalDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the user data in a reserve + * @param asset The address of the underlying asset of the reserve + * @param user The address of the user + * @return currentATokenBalance The current AToken balance of the user + * @return currentStableDebt The current stable debt of the user + * @return currentVariableDebt The current variable debt of the user + * @return principalStableDebt The principal stable debt of the user + * @return scaledVariableDebt The scaled variable debt of the user + * @return stableBorrowRate The stable borrow rate of the user + * @return liquidityRate The liquidity rate of the reserve + * @return stableRateLastUpdated The timestamp of the last update of the user stable rate + * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false + * otherwise + */ + function getUserReserveData( + address asset, + address user + ) + external + view + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ); + + /** + * @notice Returns the token addresses of the reserve + * @param asset The address of the underlying asset of the reserve + * @return aTokenAddress The AToken address of the reserve + * @return stableDebtTokenAddress DEPRECATED in v3.2.0 + * @return variableDebtTokenAddress The VariableDebtToken address of the reserve + */ + function getReserveTokensAddresses( + address asset + ) + external + view + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ); + + /** + * @notice Returns the address of the Interest Rate strategy + * @param asset The address of the underlying asset of the reserve + * @return irStrategyAddress The address of the Interest Rate strategy + */ + function getInterestRateStrategyAddress( + address asset + ) external view returns (address irStrategyAddress); + + /** + * @notice Returns whether the reserve has FlashLoans enabled or disabled + * @param asset The address of the underlying asset of the reserve + * @return True if FlashLoans are enabled, false otherwise + */ + function getFlashLoanEnabled(address asset) external view returns (bool); + + /** + * @notice Returns whether virtual accounting is enabled/not for a reserve + * @param asset The address of the underlying asset of the reserve + * @return True if active, false otherwise + */ + function getIsVirtualAccActive(address asset) external view returns (bool); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint256); +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol + +interface IUiPoolDataProviderV3 { + struct AggregatedReserveData { + address underlyingAsset; + string name; + string symbol; + uint256 decimals; + uint256 baseLTVasCollateral; + uint256 reserveLiquidationThreshold; + uint256 reserveLiquidationBonus; + uint256 reserveFactor; + bool usageAsCollateralEnabled; + bool borrowingEnabled; + bool isActive; + bool isFrozen; + // base data + uint128 liquidityIndex; + uint128 variableBorrowIndex; + uint128 liquidityRate; + uint128 variableBorrowRate; + uint40 lastUpdateTimestamp; + address aTokenAddress; + address variableDebtTokenAddress; + address interestRateStrategyAddress; + // + uint256 availableLiquidity; + uint256 totalScaledVariableDebt; + uint256 priceInMarketReferenceCurrency; + address priceOracle; + uint256 variableRateSlope1; + uint256 variableRateSlope2; + uint256 baseVariableBorrowRate; + uint256 optimalUsageRatio; + // v3 only + bool isPaused; + bool isSiloedBorrowing; + uint128 accruedToTreasury; + uint128 unbacked; + uint128 isolationModeTotalDebt; + bool flashLoanEnabled; + // + uint256 debtCeiling; + uint256 debtCeilingDecimals; + uint256 borrowCap; + uint256 supplyCap; + bool borrowableInIsolation; + // v3.1 + bool virtualAccActive; + uint128 virtualUnderlyingBalance; + } + + struct UserReserveData { + address underlyingAsset; + uint256 scaledATokenBalance; + bool usageAsCollateralEnabledOnUser; + uint256 scaledVariableDebt; + } + + struct BaseCurrencyInfo { + uint256 marketReferenceCurrencyUnit; + int256 marketReferenceCurrencyPriceInUsd; + int256 networkBaseTokenPriceInUsd; + uint8 networkBaseTokenPriceDecimals; + } + + struct Emode { + uint8 id; + DataTypes.EModeCategory eMode; + } + + function getReservesList( + IPoolAddressesProvider provider + ) external view returns (address[] memory); + + function getReservesData( + IPoolAddressesProvider provider + ) external view returns (AggregatedReserveData[] memory, BaseCurrencyInfo memory); + + function getUserReservesData( + IPoolAddressesProvider provider, + address user + ) external view returns (UserReserveData[] memory, uint8); + + /** + * @dev Iterates the eModes mapping and returns all eModes found + * @notice The method assumes for id gaps <= 2 within the eMode definitions + * @return an array of eModes that were found in the eMode mapping + */ + function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory); +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol + +/** + * @title IAaveOracle + * @author Aave + * @notice Defines the basic interface for the Aave Oracle + */ +interface IAaveOracle is IPriceOracleGetter { + /** + * @dev Emitted after the base currency is set + * @param baseCurrency The base currency of used for price quotes + * @param baseCurrencyUnit The unit of the base currency + */ + event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); + + /** + * @dev Emitted after the price source of an asset is updated + * @param asset The address of the asset + * @param source The price source of the asset + */ + event AssetSourceUpdated(address indexed asset, address indexed source); + + /** + * @dev Emitted after the address of fallback oracle is updated + * @param fallbackOracle The address of the fallback oracle + */ + event FallbackOracleUpdated(address indexed fallbackOracle); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Sets or replaces price sources of assets + * @param assets The addresses of the assets + * @param sources The addresses of the price sources + */ + function setAssetSources(address[] calldata assets, address[] calldata sources) external; + + /** + * @notice Sets the fallback oracle + * @param fallbackOracle The address of the fallback oracle + */ + function setFallbackOracle(address fallbackOracle) external; + + /** + * @notice Returns a list of prices from a list of assets addresses + * @param assets The list of assets addresses + * @return The prices of the given assets + */ + function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); + + /** + * @notice Returns the address of the source for an asset address + * @param asset The address of the asset + * @return The address of the source + */ + function getSourceOfAsset(address asset) external view returns (address); + + /** + * @notice Returns the address of the fallback oracle + * @return The address of the fallback oracle + */ + function getFallbackOracle() external view returns (address); +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol + +/** + * @title IDefaultInterestRateStrategyV2 + * @author BGD Labs + * @notice Interface of the default interest rate strategy used by the Aave protocol + */ +interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { + /** + * @notice Holds the interest rate data for a given reserve + * + * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This + * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. + * + * @param optimalUsageRatio The optimal usage ratio, in bps + * @param baseVariableBorrowRate The base variable borrow rate, in bps + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps + */ + struct InterestRateData { + uint16 optimalUsageRatio; + uint32 baseVariableBorrowRate; + uint32 variableRateSlope1; + uint32 variableRateSlope2; + } + + /** + * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, + * used in in-memory calculations. + * + * @param optimalUsageRatio The optimal usage ratio + * @param baseVariableBorrowRate The base variable borrow rate + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio + */ + struct InterestRateDataRay { + uint256 optimalUsageRatio; + uint256 baseVariableBorrowRate; + uint256 variableRateSlope1; + uint256 variableRateSlope2; + } + + /** + * @notice emitted when new interest rate data is set in a reserve + * + * @param reserve address of the reserve that has new interest rate data set + * @param optimalUsageRatio The optimal usage ratio, in bps + * @param baseVariableBorrowRate The base variable borrow rate, in bps + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps + */ + event RateDataUpdate( + address indexed reserve, + uint256 optimalUsageRatio, + uint256 baseVariableBorrowRate, + uint256 variableRateSlope1, + uint256 variableRateSlope2 + ); + + /** + * @notice Returns the address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the maximum value achievable for variable borrow rate, in bps + * @return The maximum rate + */ + function MAX_BORROW_RATE() external view returns (uint256); + + /** + * @notice Returns the minimum optimal point, in bps + * @return The optimal point + */ + function MIN_OPTIMAL_POINT() external view returns (uint256); + + /** + * @notice Returns the maximum optimal point, in bps + * @return The optimal point + */ + function MAX_OPTIMAL_POINT() external view returns (uint256); + + /** + * notice Returns the full InterestRateData object for the given reserve, in ray + * + * @param reserve The reserve to get the data of + * + * @return The InterestRateDataRay object for the given reserve + */ + function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); + + /** + * notice Returns the full InterestRateDataRay object for the given reserve, in bps + * + * @param reserve The reserve to get the data of + * + * @return The InterestRateData object for the given reserve + */ + function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); + + /** + * @notice Returns the optimal usage rate for the given reserve in ray + * + * @param reserve The reserve to get the optimal usage rate of + * + * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate + */ + function getOptimalUsageRatio(address reserve) external view returns (uint256); + + /** + * @notice Returns the variable rate slope below optimal usage ratio in ray + * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO + * + * @param reserve The reserve to get the variable rate slope 1 of + * + * @return The variable rate slope + */ + function getVariableRateSlope1(address reserve) external view returns (uint256); + + /** + * @notice Returns the variable rate slope above optimal usage ratio in ray + * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO + * + * @param reserve The reserve to get the variable rate slope 2 of + * + * @return The variable rate slope + */ + function getVariableRateSlope2(address reserve) external view returns (uint256); + + /** + * @notice Returns the base variable borrow rate, in ray + * + * @param reserve The reserve to get the base variable borrow rate of + * + * @return The base variable borrow rate + */ + function getBaseVariableBorrowRate(address reserve) external view returns (uint256); + + /** + * @notice Returns the maximum variable borrow rate, in ray + * + * @param reserve The reserve to get the maximum variable borrow rate of + * + * @return The maximum variable borrow rate + */ + function getMaxVariableBorrowRate(address reserve) external view returns (uint256); + + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The reserve interest rate data to apply to the given reserve + * Being specific to this custom implementation, with custom struct type, + * overloading the function on the generic interface + */ + function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol + +/** + * @title AaveProtocolDataProvider + * @author Aave + * @notice Peripheral contract to collect and pre-process information from the Pool. + */ +contract AaveProtocolDataProvider is IPoolDataProvider { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + + address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; + address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /// @inheritdoc IPoolDataProvider + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @notice Constructor + * @param addressesProvider The address of the PoolAddressesProvider contract + */ + constructor(IPoolAddressesProvider addressesProvider) { + ADDRESSES_PROVIDER = addressesProvider; + } + + /// @inheritdoc IPoolDataProvider + function getAllReservesTokens() external view override returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory reservesTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + if (reserves[i] == MKR) { + reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); + continue; + } + if (reserves[i] == ETH) { + reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); + continue; + } + reservesTokens[i] = TokenData({ + symbol: IERC20Detailed(reserves[i]).symbol(), + tokenAddress: reserves[i] + }); + } + return reservesTokens; + } + + /// @inheritdoc IPoolDataProvider + function getAllATokens() external view override returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory aTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveDataLegacy memory reserveData = pool.getReserveData(reserves[i]); + aTokens[i] = TokenData({ + symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), + tokenAddress: reserveData.aTokenAddress + }); + } + return aTokens; + } + + /// @inheritdoc IPoolDataProvider + function getReserveConfigurationData( + address asset + ) + external + view + override + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ) + { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration + .getParams(); + + (isActive, isFrozen, borrowingEnabled, ) = configuration.getFlags(); + + // @notice all stable debt related parameters deprecated in v3.2.0 + stableBorrowRateEnabled = false; + + usageAsCollateralEnabled = liquidationThreshold != 0; + } + + /// @inheritdoc IPoolDataProvider + function getReserveCaps( + address asset + ) external view override returns (uint256 borrowCap, uint256 supplyCap) { + (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); + } + + /// @inheritdoc IPoolDataProvider + function getPaused(address asset) external view override returns (bool isPaused) { + (, , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); + } + + /// @inheritdoc IPoolDataProvider + function getSiloedBorrowing(address asset) external view override returns (bool) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); + } + + /// @inheritdoc IPoolDataProvider + function getLiquidationProtocolFee(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); + } + + /// @inheritdoc IPoolDataProvider + function getUnbackedMintCap(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); + } + + /// @inheritdoc IPoolDataProvider + function getDebtCeiling(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); + } + + /// @inheritdoc IPoolDataProvider + function getDebtCeilingDecimals() external pure override returns (uint256) { + return ReserveConfiguration.DEBT_CEILING_DECIMALS; + } + + /// @inheritdoc IPoolDataProvider + function getReserveData( + address asset + ) + external + view + override + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + // @notice all stable debt related parameters deprecated in v3.2.0 + return ( + reserve.unbacked, + reserve.accruedToTreasury, + IERC20Detailed(reserve.aTokenAddress).totalSupply(), + 0, + IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), + reserve.currentLiquidityRate, + reserve.currentVariableBorrowRate, + 0, + 0, + reserve.liquidityIndex, + reserve.variableBorrowIndex, + reserve.lastUpdateTimestamp + ); + } + + /// @inheritdoc IPoolDataProvider + function getATokenTotalSupply(address asset) external view override returns (uint256) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.aTokenAddress).totalSupply(); + } + + /// @inheritdoc IPoolDataProvider + function getTotalDebt(address asset) external view override returns (uint256) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); + } + + /// @inheritdoc IPoolDataProvider + function getUserReserveData( + address asset, + address user + ) + external + view + override + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) + .getUserConfiguration(user); + + currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); + currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); + + // @notice all stable debt related parameters deprecated in v3.2.0 + currentStableDebt = principalStableDebt = stableBorrowRate = stableRateLastUpdated = 0; + + scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); + liquidityRate = reserve.currentLiquidityRate; + usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); + } + + /// @inheritdoc IPoolDataProvider + function getReserveTokensAddresses( + address asset + ) + external + view + override + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + // @notice all stable debt related parameters deprecated in v3.2.0 + return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); + } + + /// @inheritdoc IPoolDataProvider + function getInterestRateStrategyAddress( + address asset + ) external view override returns (address irStrategyAddress) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + return (reserve.interestRateStrategyAddress); + } + + /// @inheritdoc IPoolDataProvider + function getFlashLoanEnabled(address asset) external view override returns (bool) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + return configuration.getFlashLoanEnabled(); + } + + /// @inheritdoc IPoolDataProvider + function getIsVirtualAccActive(address asset) external view override returns (bool) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + return configuration.getIsVirtualAccActive(); + } + + /// @inheritdoc IPoolDataProvider + function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); + } +} + +// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol + +contract UiPoolDataProviderV3 is IUiPoolDataProviderV3 { + using WadRayMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + IEACAggregatorProxy public immutable networkBaseTokenPriceInUsdProxyAggregator; + IEACAggregatorProxy public immutable marketReferenceCurrencyPriceInUsdProxyAggregator; + uint256 public constant ETH_CURRENCY_UNIT = 1 ether; + address public constant MKR_ADDRESS = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; + + constructor( + IEACAggregatorProxy _networkBaseTokenPriceInUsdProxyAggregator, + IEACAggregatorProxy _marketReferenceCurrencyPriceInUsdProxyAggregator + ) { + networkBaseTokenPriceInUsdProxyAggregator = _networkBaseTokenPriceInUsdProxyAggregator; + marketReferenceCurrencyPriceInUsdProxyAggregator = _marketReferenceCurrencyPriceInUsdProxyAggregator; + } + + function getReservesList( + IPoolAddressesProvider provider + ) external view override returns (address[] memory) { + IPool pool = IPool(provider.getPool()); + return pool.getReservesList(); + } + + function getReservesData( + IPoolAddressesProvider provider + ) external view override returns (AggregatedReserveData[] memory, BaseCurrencyInfo memory) { + IAaveOracle oracle = IAaveOracle(provider.getPriceOracle()); + IPool pool = IPool(provider.getPool()); + AaveProtocolDataProvider poolDataProvider = AaveProtocolDataProvider( + provider.getPoolDataProvider() + ); + + address[] memory reserves = pool.getReservesList(); + AggregatedReserveData[] memory reservesData = new AggregatedReserveData[](reserves.length); + + for (uint256 i = 0; i < reserves.length; i++) { + AggregatedReserveData memory reserveData = reservesData[i]; + reserveData.underlyingAsset = reserves[i]; + + // reserve current state + DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData( + reserveData.underlyingAsset + ); + //the liquidity index. Expressed in ray + reserveData.liquidityIndex = baseData.liquidityIndex; + //variable borrow index. Expressed in ray + reserveData.variableBorrowIndex = baseData.variableBorrowIndex; + //the current supply rate. Expressed in ray + reserveData.liquidityRate = baseData.currentLiquidityRate; + //the current variable borrow rate. Expressed in ray + reserveData.variableBorrowRate = baseData.currentVariableBorrowRate; + reserveData.lastUpdateTimestamp = baseData.lastUpdateTimestamp; + reserveData.aTokenAddress = baseData.aTokenAddress; + reserveData.variableDebtTokenAddress = baseData.variableDebtTokenAddress; + //address of the interest rate strategy + reserveData.interestRateStrategyAddress = baseData.interestRateStrategyAddress; + reserveData.priceInMarketReferenceCurrency = oracle.getAssetPrice( + reserveData.underlyingAsset + ); + reserveData.priceOracle = oracle.getSourceOfAsset(reserveData.underlyingAsset); + reserveData.availableLiquidity = IERC20Detailed(reserveData.underlyingAsset).balanceOf( + reserveData.aTokenAddress + ); + reserveData.totalScaledVariableDebt = IVariableDebtToken(reserveData.variableDebtTokenAddress) + .scaledTotalSupply(); + + // Due we take the symbol from underlying token we need a special case for $MKR as symbol() returns bytes32 + if (address(reserveData.underlyingAsset) == address(MKR_ADDRESS)) { + bytes32 symbol = IERC20DetailedBytes(reserveData.underlyingAsset).symbol(); + bytes32 name = IERC20DetailedBytes(reserveData.underlyingAsset).name(); + reserveData.symbol = bytes32ToString(symbol); + reserveData.name = bytes32ToString(name); + } else { + reserveData.symbol = IERC20Detailed(reserveData.underlyingAsset).symbol(); + reserveData.name = IERC20Detailed(reserveData.underlyingAsset).name(); + } + + //stores the reserve configuration + DataTypes.ReserveConfigurationMap memory reserveConfigurationMap = baseData.configuration; + ( + reserveData.baseLTVasCollateral, + reserveData.reserveLiquidationThreshold, + reserveData.reserveLiquidationBonus, + reserveData.decimals, + reserveData.reserveFactor + ) = reserveConfigurationMap.getParams(); + reserveData.usageAsCollateralEnabled = reserveData.baseLTVasCollateral != 0; + + ( + reserveData.isActive, + reserveData.isFrozen, + reserveData.borrowingEnabled, + reserveData.isPaused + ) = reserveConfigurationMap.getFlags(); + + // interest rates + try + IDefaultInterestRateStrategyV2(reserveData.interestRateStrategyAddress).getInterestRateData( + reserveData.underlyingAsset + ) + returns (IDefaultInterestRateStrategyV2.InterestRateDataRay memory res) { + reserveData.baseVariableBorrowRate = res.baseVariableBorrowRate; + reserveData.variableRateSlope1 = res.variableRateSlope1; + reserveData.variableRateSlope2 = res.variableRateSlope2; + reserveData.optimalUsageRatio = res.optimalUsageRatio; + } catch {} + + // v3 only + reserveData.debtCeiling = reserveConfigurationMap.getDebtCeiling(); + reserveData.debtCeilingDecimals = poolDataProvider.getDebtCeilingDecimals(); + (reserveData.borrowCap, reserveData.supplyCap) = reserveConfigurationMap.getCaps(); + + try poolDataProvider.getFlashLoanEnabled(reserveData.underlyingAsset) returns ( + bool flashLoanEnabled + ) { + reserveData.flashLoanEnabled = flashLoanEnabled; + } catch (bytes memory) { + reserveData.flashLoanEnabled = true; + } + + reserveData.isSiloedBorrowing = reserveConfigurationMap.getSiloedBorrowing(); + reserveData.unbacked = baseData.unbacked; + reserveData.isolationModeTotalDebt = baseData.isolationModeTotalDebt; + reserveData.accruedToTreasury = baseData.accruedToTreasury; + + reserveData.borrowableInIsolation = reserveConfigurationMap.getBorrowableInIsolation(); + + try poolDataProvider.getIsVirtualAccActive(reserveData.underlyingAsset) returns ( + bool virtualAccActive + ) { + reserveData.virtualAccActive = virtualAccActive; + } catch (bytes memory) { + reserveData.virtualAccActive = false; + } + + try pool.getVirtualUnderlyingBalance(reserveData.underlyingAsset) returns ( + uint128 virtualUnderlyingBalance + ) { + reserveData.virtualUnderlyingBalance = virtualUnderlyingBalance; + } catch (bytes memory) { + reserveData.virtualUnderlyingBalance = 0; + } + } + + BaseCurrencyInfo memory baseCurrencyInfo; + baseCurrencyInfo.networkBaseTokenPriceInUsd = networkBaseTokenPriceInUsdProxyAggregator + .latestAnswer(); + baseCurrencyInfo.networkBaseTokenPriceDecimals = networkBaseTokenPriceInUsdProxyAggregator + .decimals(); + + try oracle.BASE_CURRENCY_UNIT() returns (uint256 baseCurrencyUnit) { + baseCurrencyInfo.marketReferenceCurrencyUnit = baseCurrencyUnit; + baseCurrencyInfo.marketReferenceCurrencyPriceInUsd = int256(baseCurrencyUnit); + } catch (bytes memory /*lowLevelData*/) { + baseCurrencyInfo.marketReferenceCurrencyUnit = ETH_CURRENCY_UNIT; + baseCurrencyInfo + .marketReferenceCurrencyPriceInUsd = marketReferenceCurrencyPriceInUsdProxyAggregator + .latestAnswer(); + } + + return (reservesData, baseCurrencyInfo); + } + + /// @inheritdoc IUiPoolDataProviderV3 + function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory) { + IPool pool = IPool(provider.getPool()); + Emode[] memory tempCategories = new Emode[](256); + uint8 eModesFound = 0; + uint8 missCounter = 0; + for (uint8 i = 1; i < 256; i++) { + DataTypes.CollateralConfig memory cfg = pool.getEModeCategoryCollateralConfig(i); + if (cfg.liquidationThreshold != 0) { + tempCategories[eModesFound] = Emode({ + eMode: DataTypes.EModeCategory({ + ltv: cfg.ltv, + liquidationThreshold: cfg.liquidationThreshold, + liquidationBonus: cfg.liquidationBonus, + label: pool.getEModeCategoryLabel(i), + collateralBitmap: pool.getEModeCategoryCollateralBitmap(i), + borrowableBitmap: pool.getEModeCategoryBorrowableBitmap(i) + }), + id: i + }); + ++eModesFound; + missCounter = 0; + } else { + ++missCounter; + } + // assumes there will never be a gap > 2 when setting eModes + if (missCounter > 2) break; + } + Emode[] memory categories = new Emode[](eModesFound); + for (uint8 i = 0; i < eModesFound; i++) { + categories[i] = tempCategories[i]; + } + return categories; + } + + function getUserReservesData( + IPoolAddressesProvider provider, + address user + ) external view override returns (UserReserveData[] memory, uint8) { + IPool pool = IPool(provider.getPool()); + address[] memory reserves = pool.getReservesList(); + DataTypes.UserConfigurationMap memory userConfig = pool.getUserConfiguration(user); + + uint8 userEmodeCategoryId = uint8(pool.getUserEMode(user)); + + UserReserveData[] memory userReservesData = new UserReserveData[]( + user != address(0) ? reserves.length : 0 + ); + + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); + + // user reserve data + userReservesData[i].underlyingAsset = reserves[i]; + userReservesData[i].scaledATokenBalance = IAToken(baseData.aTokenAddress).scaledBalanceOf( + user + ); + userReservesData[i].usageAsCollateralEnabledOnUser = userConfig.isUsingAsCollateral(i); + + if (userConfig.isBorrowing(i)) { + userReservesData[i].scaledVariableDebt = IVariableDebtToken( + baseData.variableDebtTokenAddress + ).scaledBalanceOf(user); + } + } + + return (userReservesData, userEmodeCategoryId); + } + + function bytes32ToString(bytes32 _bytes32) public pure returns (string memory) { + uint8 i = 0; + while (i < 32 && _bytes32[i] != 0) { + i++; + } + bytes memory bytesArray = new bytes(i); + for (i = 0; i < 32 && _bytes32[i] != 0; i++) { + bytesArray[i] = _bytes32[i]; + } + return string(bytesArray); + } +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol new file mode 100644 index 00000000..671b658b --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol @@ -0,0 +1,295 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; +import {WadRayMath} from '../protocol/libraries/math/WadRayMath.sol'; +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {IVariableDebtToken} from '../interfaces/IVariableDebtToken.sol'; +import {IPool} from '../interfaces/IPool.sol'; +import {IPoolDataProvider} from '../interfaces/IPoolDataProvider.sol'; + +/** + * @title AaveProtocolDataProvider + * @author Aave + * @notice Peripheral contract to collect and pre-process information from the Pool. + */ +contract AaveProtocolDataProvider is IPoolDataProvider { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + + address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; + address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /// @inheritdoc IPoolDataProvider + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @notice Constructor + * @param addressesProvider The address of the PoolAddressesProvider contract + */ + constructor(IPoolAddressesProvider addressesProvider) { + ADDRESSES_PROVIDER = addressesProvider; + } + + /// @inheritdoc IPoolDataProvider + function getAllReservesTokens() external view override returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory reservesTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + if (reserves[i] == MKR) { + reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); + continue; + } + if (reserves[i] == ETH) { + reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); + continue; + } + reservesTokens[i] = TokenData({ + symbol: IERC20Detailed(reserves[i]).symbol(), + tokenAddress: reserves[i] + }); + } + return reservesTokens; + } + + /// @inheritdoc IPoolDataProvider + function getAllATokens() external view override returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory aTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveDataLegacy memory reserveData = pool.getReserveData(reserves[i]); + aTokens[i] = TokenData({ + symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), + tokenAddress: reserveData.aTokenAddress + }); + } + return aTokens; + } + + /// @inheritdoc IPoolDataProvider + function getReserveConfigurationData( + address asset + ) + external + view + override + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ) + { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration + .getParams(); + + (isActive, isFrozen, borrowingEnabled, ) = configuration.getFlags(); + + // @notice all stable debt related parameters deprecated in v3.2.0 + stableBorrowRateEnabled = false; + + usageAsCollateralEnabled = liquidationThreshold != 0; + } + + /// @inheritdoc IPoolDataProvider + function getReserveCaps( + address asset + ) external view override returns (uint256 borrowCap, uint256 supplyCap) { + (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); + } + + /// @inheritdoc IPoolDataProvider + function getPaused(address asset) external view override returns (bool isPaused) { + (, , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); + } + + /// @inheritdoc IPoolDataProvider + function getSiloedBorrowing(address asset) external view override returns (bool) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); + } + + /// @inheritdoc IPoolDataProvider + function getLiquidationProtocolFee(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); + } + + /// @inheritdoc IPoolDataProvider + function getUnbackedMintCap(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); + } + + /// @inheritdoc IPoolDataProvider + function getDebtCeiling(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); + } + + /// @inheritdoc IPoolDataProvider + function getDebtCeilingDecimals() external pure override returns (uint256) { + return ReserveConfiguration.DEBT_CEILING_DECIMALS; + } + + /// @inheritdoc IPoolDataProvider + function getReserveData( + address asset + ) + external + view + override + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + // @notice all stable debt related parameters deprecated in v3.2.0 + return ( + reserve.unbacked, + reserve.accruedToTreasury, + IERC20Detailed(reserve.aTokenAddress).totalSupply(), + 0, + IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), + reserve.currentLiquidityRate, + reserve.currentVariableBorrowRate, + 0, + 0, + reserve.liquidityIndex, + reserve.variableBorrowIndex, + reserve.lastUpdateTimestamp + ); + } + + /// @inheritdoc IPoolDataProvider + function getATokenTotalSupply(address asset) external view override returns (uint256) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.aTokenAddress).totalSupply(); + } + + /// @inheritdoc IPoolDataProvider + function getTotalDebt(address asset) external view override returns (uint256) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); + } + + /// @inheritdoc IPoolDataProvider + function getUserReserveData( + address asset, + address user + ) + external + view + override + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) + .getUserConfiguration(user); + + currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); + currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); + + // @notice all stable debt related parameters deprecated in v3.2.0 + currentStableDebt = principalStableDebt = stableBorrowRate = stableRateLastUpdated = 0; + + scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); + liquidityRate = reserve.currentLiquidityRate; + usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); + } + + /// @inheritdoc IPoolDataProvider + function getReserveTokensAddresses( + address asset + ) + external + view + override + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + // @notice all stable debt related parameters deprecated in v3.2.0 + return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); + } + + /// @inheritdoc IPoolDataProvider + function getInterestRateStrategyAddress( + address asset + ) external view override returns (address irStrategyAddress) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + return (reserve.interestRateStrategyAddress); + } + + /// @inheritdoc IPoolDataProvider + function getFlashLoanEnabled(address asset) external view override returns (bool) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + return configuration.getFlashLoanEnabled(); + } + + /// @inheritdoc IPoolDataProvider + function getIsVirtualAccActive(address asset) external view override returns (bool) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + return configuration.getIsVirtualAccActive(); + } + + /// @inheritdoc IPoolDataProvider + function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); + } +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol new file mode 100644 index 00000000..b079d2dd --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol @@ -0,0 +1,265 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../interfaces/IPool.sol'; +import {IAaveOracle} from '../interfaces/IAaveOracle.sol'; +import {IAToken} from '../interfaces/IAToken.sol'; +import {IVariableDebtToken} from '../interfaces/IVariableDebtToken.sol'; +import {IDefaultInterestRateStrategyV2} from '../interfaces/IDefaultInterestRateStrategyV2.sol'; +import {AaveProtocolDataProvider} from './AaveProtocolDataProvider.sol'; +import {WadRayMath} from '../protocol/libraries/math/WadRayMath.sol'; +import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; +import {IEACAggregatorProxy} from './interfaces/IEACAggregatorProxy.sol'; +import {IERC20DetailedBytes} from './interfaces/IERC20DetailedBytes.sol'; +import {IUiPoolDataProviderV3} from './interfaces/IUiPoolDataProviderV3.sol'; + +contract UiPoolDataProviderV3 is IUiPoolDataProviderV3 { + using WadRayMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + IEACAggregatorProxy public immutable networkBaseTokenPriceInUsdProxyAggregator; + IEACAggregatorProxy public immutable marketReferenceCurrencyPriceInUsdProxyAggregator; + uint256 public constant ETH_CURRENCY_UNIT = 1 ether; + address public constant MKR_ADDRESS = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; + + constructor( + IEACAggregatorProxy _networkBaseTokenPriceInUsdProxyAggregator, + IEACAggregatorProxy _marketReferenceCurrencyPriceInUsdProxyAggregator + ) { + networkBaseTokenPriceInUsdProxyAggregator = _networkBaseTokenPriceInUsdProxyAggregator; + marketReferenceCurrencyPriceInUsdProxyAggregator = _marketReferenceCurrencyPriceInUsdProxyAggregator; + } + + function getReservesList( + IPoolAddressesProvider provider + ) external view override returns (address[] memory) { + IPool pool = IPool(provider.getPool()); + return pool.getReservesList(); + } + + function getReservesData( + IPoolAddressesProvider provider + ) external view override returns (AggregatedReserveData[] memory, BaseCurrencyInfo memory) { + IAaveOracle oracle = IAaveOracle(provider.getPriceOracle()); + IPool pool = IPool(provider.getPool()); + AaveProtocolDataProvider poolDataProvider = AaveProtocolDataProvider( + provider.getPoolDataProvider() + ); + + address[] memory reserves = pool.getReservesList(); + AggregatedReserveData[] memory reservesData = new AggregatedReserveData[](reserves.length); + + for (uint256 i = 0; i < reserves.length; i++) { + AggregatedReserveData memory reserveData = reservesData[i]; + reserveData.underlyingAsset = reserves[i]; + + // reserve current state + DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData( + reserveData.underlyingAsset + ); + //the liquidity index. Expressed in ray + reserveData.liquidityIndex = baseData.liquidityIndex; + //variable borrow index. Expressed in ray + reserveData.variableBorrowIndex = baseData.variableBorrowIndex; + //the current supply rate. Expressed in ray + reserveData.liquidityRate = baseData.currentLiquidityRate; + //the current variable borrow rate. Expressed in ray + reserveData.variableBorrowRate = baseData.currentVariableBorrowRate; + reserveData.lastUpdateTimestamp = baseData.lastUpdateTimestamp; + reserveData.aTokenAddress = baseData.aTokenAddress; + reserveData.variableDebtTokenAddress = baseData.variableDebtTokenAddress; + //address of the interest rate strategy + reserveData.interestRateStrategyAddress = baseData.interestRateStrategyAddress; + reserveData.priceInMarketReferenceCurrency = oracle.getAssetPrice( + reserveData.underlyingAsset + ); + reserveData.priceOracle = oracle.getSourceOfAsset(reserveData.underlyingAsset); + reserveData.availableLiquidity = IERC20Detailed(reserveData.underlyingAsset).balanceOf( + reserveData.aTokenAddress + ); + reserveData.totalScaledVariableDebt = IVariableDebtToken(reserveData.variableDebtTokenAddress) + .scaledTotalSupply(); + + // Due we take the symbol from underlying token we need a special case for $MKR as symbol() returns bytes32 + if (address(reserveData.underlyingAsset) == address(MKR_ADDRESS)) { + bytes32 symbol = IERC20DetailedBytes(reserveData.underlyingAsset).symbol(); + bytes32 name = IERC20DetailedBytes(reserveData.underlyingAsset).name(); + reserveData.symbol = bytes32ToString(symbol); + reserveData.name = bytes32ToString(name); + } else { + reserveData.symbol = IERC20Detailed(reserveData.underlyingAsset).symbol(); + reserveData.name = IERC20Detailed(reserveData.underlyingAsset).name(); + } + + //stores the reserve configuration + DataTypes.ReserveConfigurationMap memory reserveConfigurationMap = baseData.configuration; + ( + reserveData.baseLTVasCollateral, + reserveData.reserveLiquidationThreshold, + reserveData.reserveLiquidationBonus, + reserveData.decimals, + reserveData.reserveFactor + ) = reserveConfigurationMap.getParams(); + reserveData.usageAsCollateralEnabled = reserveData.baseLTVasCollateral != 0; + + ( + reserveData.isActive, + reserveData.isFrozen, + reserveData.borrowingEnabled, + reserveData.isPaused + ) = reserveConfigurationMap.getFlags(); + + // interest rates + try + IDefaultInterestRateStrategyV2(reserveData.interestRateStrategyAddress).getInterestRateData( + reserveData.underlyingAsset + ) + returns (IDefaultInterestRateStrategyV2.InterestRateDataRay memory res) { + reserveData.baseVariableBorrowRate = res.baseVariableBorrowRate; + reserveData.variableRateSlope1 = res.variableRateSlope1; + reserveData.variableRateSlope2 = res.variableRateSlope2; + reserveData.optimalUsageRatio = res.optimalUsageRatio; + } catch {} + + // v3 only + reserveData.debtCeiling = reserveConfigurationMap.getDebtCeiling(); + reserveData.debtCeilingDecimals = poolDataProvider.getDebtCeilingDecimals(); + (reserveData.borrowCap, reserveData.supplyCap) = reserveConfigurationMap.getCaps(); + + try poolDataProvider.getFlashLoanEnabled(reserveData.underlyingAsset) returns ( + bool flashLoanEnabled + ) { + reserveData.flashLoanEnabled = flashLoanEnabled; + } catch (bytes memory) { + reserveData.flashLoanEnabled = true; + } + + reserveData.isSiloedBorrowing = reserveConfigurationMap.getSiloedBorrowing(); + reserveData.unbacked = baseData.unbacked; + reserveData.isolationModeTotalDebt = baseData.isolationModeTotalDebt; + reserveData.accruedToTreasury = baseData.accruedToTreasury; + + reserveData.borrowableInIsolation = reserveConfigurationMap.getBorrowableInIsolation(); + + try poolDataProvider.getIsVirtualAccActive(reserveData.underlyingAsset) returns ( + bool virtualAccActive + ) { + reserveData.virtualAccActive = virtualAccActive; + } catch (bytes memory) { + reserveData.virtualAccActive = false; + } + + try pool.getVirtualUnderlyingBalance(reserveData.underlyingAsset) returns ( + uint128 virtualUnderlyingBalance + ) { + reserveData.virtualUnderlyingBalance = virtualUnderlyingBalance; + } catch (bytes memory) { + reserveData.virtualUnderlyingBalance = 0; + } + } + + BaseCurrencyInfo memory baseCurrencyInfo; + baseCurrencyInfo.networkBaseTokenPriceInUsd = networkBaseTokenPriceInUsdProxyAggregator + .latestAnswer(); + baseCurrencyInfo.networkBaseTokenPriceDecimals = networkBaseTokenPriceInUsdProxyAggregator + .decimals(); + + try oracle.BASE_CURRENCY_UNIT() returns (uint256 baseCurrencyUnit) { + baseCurrencyInfo.marketReferenceCurrencyUnit = baseCurrencyUnit; + baseCurrencyInfo.marketReferenceCurrencyPriceInUsd = int256(baseCurrencyUnit); + } catch (bytes memory /*lowLevelData*/) { + baseCurrencyInfo.marketReferenceCurrencyUnit = ETH_CURRENCY_UNIT; + baseCurrencyInfo + .marketReferenceCurrencyPriceInUsd = marketReferenceCurrencyPriceInUsdProxyAggregator + .latestAnswer(); + } + + return (reservesData, baseCurrencyInfo); + } + + /// @inheritdoc IUiPoolDataProviderV3 + function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory) { + IPool pool = IPool(provider.getPool()); + Emode[] memory tempCategories = new Emode[](256); + uint8 eModesFound = 0; + uint8 missCounter = 0; + for (uint8 i = 1; i < 256; i++) { + DataTypes.CollateralConfig memory cfg = pool.getEModeCategoryCollateralConfig(i); + if (cfg.liquidationThreshold != 0) { + tempCategories[eModesFound] = Emode({ + eMode: DataTypes.EModeCategory({ + ltv: cfg.ltv, + liquidationThreshold: cfg.liquidationThreshold, + liquidationBonus: cfg.liquidationBonus, + label: pool.getEModeCategoryLabel(i), + collateralBitmap: pool.getEModeCategoryCollateralBitmap(i), + borrowableBitmap: pool.getEModeCategoryBorrowableBitmap(i) + }), + id: i + }); + ++eModesFound; + missCounter = 0; + } else { + ++missCounter; + } + // assumes there will never be a gap > 2 when setting eModes + if (missCounter > 2) break; + } + Emode[] memory categories = new Emode[](eModesFound); + for (uint8 i = 0; i < eModesFound; i++) { + categories[i] = tempCategories[i]; + } + return categories; + } + + function getUserReservesData( + IPoolAddressesProvider provider, + address user + ) external view override returns (UserReserveData[] memory, uint8) { + IPool pool = IPool(provider.getPool()); + address[] memory reserves = pool.getReservesList(); + DataTypes.UserConfigurationMap memory userConfig = pool.getUserConfiguration(user); + + uint8 userEmodeCategoryId = uint8(pool.getUserEMode(user)); + + UserReserveData[] memory userReservesData = new UserReserveData[]( + user != address(0) ? reserves.length : 0 + ); + + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); + + // user reserve data + userReservesData[i].underlyingAsset = reserves[i]; + userReservesData[i].scaledATokenBalance = IAToken(baseData.aTokenAddress).scaledBalanceOf( + user + ); + userReservesData[i].usageAsCollateralEnabledOnUser = userConfig.isUsingAsCollateral(i); + + if (userConfig.isBorrowing(i)) { + userReservesData[i].scaledVariableDebt = IVariableDebtToken( + baseData.variableDebtTokenAddress + ).scaledBalanceOf(user); + } + } + + return (userReservesData, userEmodeCategoryId); + } + + function bytes32ToString(bytes32 _bytes32) public pure returns (string memory) { + uint8 i = 0; + while (i < 32 && _bytes32[i] != 0) { + i++; + } + bytes memory bytesArray = new bytes(i); + for (i = 0; i < 32 && _bytes32[i] != 0; i++) { + bytesArray[i] = _bytes32[i]; + } + return string(bytesArray); + } +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol new file mode 100644 index 00000000..c89baee6 --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol new file mode 100644 index 00000000..0541f0da --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; + +interface IERC20DetailedBytes is IERC20 { + function name() external view returns (bytes32); + + function symbol() external view returns (bytes32); + + function decimals() external view returns (uint8); +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol new file mode 100644 index 00000000..3280d75b --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {DataTypes} from '../../protocol/libraries/types/DataTypes.sol'; + +interface IUiPoolDataProviderV3 { + struct AggregatedReserveData { + address underlyingAsset; + string name; + string symbol; + uint256 decimals; + uint256 baseLTVasCollateral; + uint256 reserveLiquidationThreshold; + uint256 reserveLiquidationBonus; + uint256 reserveFactor; + bool usageAsCollateralEnabled; + bool borrowingEnabled; + bool isActive; + bool isFrozen; + // base data + uint128 liquidityIndex; + uint128 variableBorrowIndex; + uint128 liquidityRate; + uint128 variableBorrowRate; + uint40 lastUpdateTimestamp; + address aTokenAddress; + address variableDebtTokenAddress; + address interestRateStrategyAddress; + // + uint256 availableLiquidity; + uint256 totalScaledVariableDebt; + uint256 priceInMarketReferenceCurrency; + address priceOracle; + uint256 variableRateSlope1; + uint256 variableRateSlope2; + uint256 baseVariableBorrowRate; + uint256 optimalUsageRatio; + // v3 only + bool isPaused; + bool isSiloedBorrowing; + uint128 accruedToTreasury; + uint128 unbacked; + uint128 isolationModeTotalDebt; + bool flashLoanEnabled; + // + uint256 debtCeiling; + uint256 debtCeilingDecimals; + uint256 borrowCap; + uint256 supplyCap; + bool borrowableInIsolation; + // v3.1 + bool virtualAccActive; + uint128 virtualUnderlyingBalance; + } + + struct UserReserveData { + address underlyingAsset; + uint256 scaledATokenBalance; + bool usageAsCollateralEnabledOnUser; + uint256 scaledVariableDebt; + } + + struct BaseCurrencyInfo { + uint256 marketReferenceCurrencyUnit; + int256 marketReferenceCurrencyPriceInUsd; + int256 networkBaseTokenPriceInUsd; + uint8 networkBaseTokenPriceDecimals; + } + + struct Emode { + uint8 id; + DataTypes.EModeCategory eMode; + } + + function getReservesList( + IPoolAddressesProvider provider + ) external view returns (address[] memory); + + function getReservesData( + IPoolAddressesProvider provider + ) external view returns (AggregatedReserveData[] memory, BaseCurrencyInfo memory); + + function getUserReservesData( + IPoolAddressesProvider provider, + address user + ) external view returns (UserReserveData[] memory, uint8); + + /** + * @dev Iterates the eModes mapping and returns all eModes found + * @notice The method assumes for id gaps <= 2 within the eMode definitions + * @return an array of eModes that were found in the eMode mapping + */ + function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory); +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol new file mode 100644 index 00000000..265d2560 --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPriceOracleGetter} from './IPriceOracleGetter.sol'; +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IAaveOracle + * @author Aave + * @notice Defines the basic interface for the Aave Oracle + */ +interface IAaveOracle is IPriceOracleGetter { + /** + * @dev Emitted after the base currency is set + * @param baseCurrency The base currency of used for price quotes + * @param baseCurrencyUnit The unit of the base currency + */ + event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); + + /** + * @dev Emitted after the price source of an asset is updated + * @param asset The address of the asset + * @param source The price source of the asset + */ + event AssetSourceUpdated(address indexed asset, address indexed source); + + /** + * @dev Emitted after the address of fallback oracle is updated + * @param fallbackOracle The address of the fallback oracle + */ + event FallbackOracleUpdated(address indexed fallbackOracle); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Sets or replaces price sources of assets + * @param assets The addresses of the assets + * @param sources The addresses of the price sources + */ + function setAssetSources(address[] calldata assets, address[] calldata sources) external; + + /** + * @notice Sets the fallback oracle + * @param fallbackOracle The address of the fallback oracle + */ + function setFallbackOracle(address fallbackOracle) external; + + /** + * @notice Returns a list of prices from a list of assets addresses + * @param assets The list of assets addresses + * @return The prices of the given assets + */ + function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); + + /** + * @notice Returns the address of the source for an asset address + * @param asset The address of the asset + * @return The address of the source + */ + function getSourceOfAsset(address asset) external view returns (address); + + /** + * @notice Returns the address of the fallback oracle + * @return The address of the fallback oracle + */ + function getFallbackOracle() external view returns (address); +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol new file mode 100644 index 00000000..938e2d8f --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IReserveInterestRateStrategy} from './IReserveInterestRateStrategy.sol'; +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IDefaultInterestRateStrategyV2 + * @author BGD Labs + * @notice Interface of the default interest rate strategy used by the Aave protocol + */ +interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { + /** + * @notice Holds the interest rate data for a given reserve + * + * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This + * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. + * + * @param optimalUsageRatio The optimal usage ratio, in bps + * @param baseVariableBorrowRate The base variable borrow rate, in bps + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps + */ + struct InterestRateData { + uint16 optimalUsageRatio; + uint32 baseVariableBorrowRate; + uint32 variableRateSlope1; + uint32 variableRateSlope2; + } + + /** + * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, + * used in in-memory calculations. + * + * @param optimalUsageRatio The optimal usage ratio + * @param baseVariableBorrowRate The base variable borrow rate + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio + */ + struct InterestRateDataRay { + uint256 optimalUsageRatio; + uint256 baseVariableBorrowRate; + uint256 variableRateSlope1; + uint256 variableRateSlope2; + } + + /** + * @notice emitted when new interest rate data is set in a reserve + * + * @param reserve address of the reserve that has new interest rate data set + * @param optimalUsageRatio The optimal usage ratio, in bps + * @param baseVariableBorrowRate The base variable borrow rate, in bps + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps + */ + event RateDataUpdate( + address indexed reserve, + uint256 optimalUsageRatio, + uint256 baseVariableBorrowRate, + uint256 variableRateSlope1, + uint256 variableRateSlope2 + ); + + /** + * @notice Returns the address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the maximum value achievable for variable borrow rate, in bps + * @return The maximum rate + */ + function MAX_BORROW_RATE() external view returns (uint256); + + /** + * @notice Returns the minimum optimal point, in bps + * @return The optimal point + */ + function MIN_OPTIMAL_POINT() external view returns (uint256); + + /** + * @notice Returns the maximum optimal point, in bps + * @return The optimal point + */ + function MAX_OPTIMAL_POINT() external view returns (uint256); + + /** + * notice Returns the full InterestRateData object for the given reserve, in ray + * + * @param reserve The reserve to get the data of + * + * @return The InterestRateDataRay object for the given reserve + */ + function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); + + /** + * notice Returns the full InterestRateDataRay object for the given reserve, in bps + * + * @param reserve The reserve to get the data of + * + * @return The InterestRateData object for the given reserve + */ + function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); + + /** + * @notice Returns the optimal usage rate for the given reserve in ray + * + * @param reserve The reserve to get the optimal usage rate of + * + * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate + */ + function getOptimalUsageRatio(address reserve) external view returns (uint256); + + /** + * @notice Returns the variable rate slope below optimal usage ratio in ray + * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO + * + * @param reserve The reserve to get the variable rate slope 1 of + * + * @return The variable rate slope + */ + function getVariableRateSlope1(address reserve) external view returns (uint256); + + /** + * @notice Returns the variable rate slope above optimal usage ratio in ray + * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO + * + * @param reserve The reserve to get the variable rate slope 2 of + * + * @return The variable rate slope + */ + function getVariableRateSlope2(address reserve) external view returns (uint256); + + /** + * @notice Returns the base variable borrow rate, in ray + * + * @param reserve The reserve to get the base variable borrow rate of + * + * @return The base variable borrow rate + */ + function getBaseVariableBorrowRate(address reserve) external view returns (uint256); + + /** + * @notice Returns the maximum variable borrow rate, in ray + * + * @param reserve The reserve to get the maximum variable borrow rate of + * + * @return The maximum variable borrow rate + */ + function getMaxVariableBorrowRate(address reserve) external view returns (uint256); + + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The reserve interest rate data to apply to the given reserve + * Being specific to this custom implementation, with custom struct type, + * overloading the function on the generic interface + */ + function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol new file mode 100644 index 00000000..a9df8903 --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol @@ -0,0 +1,250 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPoolDataProvider + * @author Aave + * @notice Defines the basic interface of a PoolDataProvider + */ +interface IPoolDataProvider { + struct TokenData { + string symbol; + address tokenAddress; + } + + /** + * @notice Returns the address for the PoolAddressesProvider contract. + * @return The address for the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the list of the existing reserves in the pool. + * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. + * @return The list of reserves, pairs of symbols and addresses + */ + function getAllReservesTokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the list of the existing ATokens in the pool. + * @return The list of ATokens, pairs of symbols and addresses + */ + function getAllATokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the configuration data of the reserve + * @dev Not returning borrow and supply caps for compatibility, nor pause flag + * @param asset The address of the underlying asset of the reserve + * @return decimals The number of decimals of the reserve + * @return ltv The ltv of the reserve + * @return liquidationThreshold The liquidationThreshold of the reserve + * @return liquidationBonus The liquidationBonus of the reserve + * @return reserveFactor The reserveFactor of the reserve + * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise + * @return borrowingEnabled True if borrowing is enabled, false otherwise + * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise + * @return isActive True if it is active, false otherwise + * @return isFrozen True if it is frozen, false otherwise + */ + function getReserveConfigurationData( + address asset + ) + external + view + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ); + + /** + * @notice Returns the caps parameters of the reserve + * @param asset The address of the underlying asset of the reserve + * @return borrowCap The borrow cap of the reserve + * @return supplyCap The supply cap of the reserve + */ + function getReserveCaps( + address asset + ) external view returns (uint256 borrowCap, uint256 supplyCap); + + /** + * @notice Returns if the pool is paused + * @param asset The address of the underlying asset of the reserve + * @return isPaused True if the pool is paused, false otherwise + */ + function getPaused(address asset) external view returns (bool isPaused); + + /** + * @notice Returns the siloed borrowing flag + * @param asset The address of the underlying asset of the reserve + * @return True if the asset is siloed for borrowing + */ + function getSiloedBorrowing(address asset) external view returns (bool); + + /** + * @notice Returns the protocol fee on the liquidation bonus + * @param asset The address of the underlying asset of the reserve + * @return The protocol fee on liquidation + */ + function getLiquidationProtocolFee(address asset) external view returns (uint256); + + /** + * @notice Returns the unbacked mint cap of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The unbacked mint cap of the reserve + */ + function getUnbackedMintCap(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The debt ceiling of the reserve + */ + function getDebtCeiling(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling decimals + * @return The debt ceiling decimals + */ + function getDebtCeilingDecimals() external pure returns (uint256); + + /** + * @notice Returns the reserve data + * @param asset The address of the underlying asset of the reserve + * @return unbacked The amount of unbacked tokens + * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted + * @return totalAToken The total supply of the aToken + * @return totalStableDebt The total stable debt of the reserve + * @return totalVariableDebt The total variable debt of the reserve + * @return liquidityRate The liquidity rate of the reserve + * @return variableBorrowRate The variable borrow rate of the reserve + * @return stableBorrowRate The stable borrow rate of the reserve + * @return averageStableBorrowRate The average stable borrow rate of the reserve + * @return liquidityIndex The liquidity index of the reserve + * @return variableBorrowIndex The variable borrow index of the reserve + * @return lastUpdateTimestamp The timestamp of the last update of the reserve + */ + function getReserveData( + address asset + ) + external + view + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ); + + /** + * @notice Returns the total supply of aTokens for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total supply of the aToken + */ + function getATokenTotalSupply(address asset) external view returns (uint256); + + /** + * @notice Returns the total debt for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total debt for asset + */ + function getTotalDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the user data in a reserve + * @param asset The address of the underlying asset of the reserve + * @param user The address of the user + * @return currentATokenBalance The current AToken balance of the user + * @return currentStableDebt The current stable debt of the user + * @return currentVariableDebt The current variable debt of the user + * @return principalStableDebt The principal stable debt of the user + * @return scaledVariableDebt The scaled variable debt of the user + * @return stableBorrowRate The stable borrow rate of the user + * @return liquidityRate The liquidity rate of the reserve + * @return stableRateLastUpdated The timestamp of the last update of the user stable rate + * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false + * otherwise + */ + function getUserReserveData( + address asset, + address user + ) + external + view + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ); + + /** + * @notice Returns the token addresses of the reserve + * @param asset The address of the underlying asset of the reserve + * @return aTokenAddress The AToken address of the reserve + * @return stableDebtTokenAddress DEPRECATED in v3.2.0 + * @return variableDebtTokenAddress The VariableDebtToken address of the reserve + */ + function getReserveTokensAddresses( + address asset + ) + external + view + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ); + + /** + * @notice Returns the address of the Interest Rate strategy + * @param asset The address of the underlying asset of the reserve + * @return irStrategyAddress The address of the Interest Rate strategy + */ + function getInterestRateStrategyAddress( + address asset + ) external view returns (address irStrategyAddress); + + /** + * @notice Returns whether the reserve has FlashLoans enabled or disabled + * @param asset The address of the underlying asset of the reserve + * @return True if FlashLoans are enabled, false otherwise + */ + function getFlashLoanEnabled(address asset) external view returns (bool); + + /** + * @notice Returns whether virtual accounting is enabled/not for a reserve + * @param asset The address of the underlying asset of the reserve + * @return True if active, false otherwise + */ + function getIsVirtualAccActive(address asset) external view returns (bool); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER.sol new file mode 100644 index 00000000..0195ac02 --- /dev/null +++ b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER.sol @@ -0,0 +1,2255 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity =0.8.10; + +// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // According to EIP-1052, 0x0 is the value returned for not-yet created accounts + // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned + // for accounts without code, i.e. `keccak256('')` + bytes32 codehash; + bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; + // solhint-disable-next-line no-inline-assembly + assembly { + codehash := extcodehash(account) + } + return (codehash != accountHash && codehash != 0x0); + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + // solhint-disable-next-line avoid-low-level-calls, avoid-call-value + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } +} + +// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + **/ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + **/ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + **/ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + **/ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + **/ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + **/ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + **/ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + **/ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + **/ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' + string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 +} + +// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + //the current stable borrow rate. Expressed in ray + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + //stableDebtToken address + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62-63: reserved + //bit 64-79: reserve factor + //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167 liquidation protocol fee + //bit 168-175 eMode category + //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // each eMode category may or may not have a custom oracle to override the individual assets price oracles + address priceSource; + string label; + } + + enum InterestRateMode { + NONE, + STABLE, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currPrincipalStableDebt; + uint256 currAvgStableBorrowRate; + uint256 currTotalStableDebt; + uint256 nextAvgStableBorrowRate; + uint256 nextTotalStableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address stableDebtTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + uint40 stableDebtLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address addressesProvider; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 maxStableLoanPercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalStableDebt; + uint256 totalVariableDebt; + uint256 averageStableBorrowRate; + uint256 reserveFactor; + address reserve; + address aToken; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address stableDebtAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + **/ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + **/ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + **/ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + **/ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + **/ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + **/ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + **/ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on swapBorrowRateMode() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user swapping his rate mode + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + **/ + event SwapBorrowRateMode( + address indexed reserve, + address indexed user, + DataTypes.InterestRateMode interestRateMode + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + **/ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + **/ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + **/ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on rebalanceStableBorrowRate() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user for which the rebalance has been executed + **/ + event RebalanceStableBorrowRate(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt + * @param premium The fee flash borrowed + * @param referralCode The referral code used + **/ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + **/ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + **/ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + **/ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @dev Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @dev Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + **/ + function backUnbacked(address asset, uint256 amount, uint256 fee) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + **/ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + **/ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the + * corresponding debt token (StableDebtToken or VariableDebtToken) + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 stable/variable debt tokens, depending on the `interestRateMode` + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + **/ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + **/ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + **/ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @return The final amount repaid + **/ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa + * @param asset The address of the underlying asset borrowed + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + **/ + function swapBorrowRateMode(address asset, uint256 interestRateMode) external; + + /** + * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. + * - Users can be rebalanced if the following conditions are satisfied: + * 1. Usage ratio is above 95% + * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too + * much has been borrowed at a stable rate and suppliers are not earning enough + * @param asset The address of the underlying asset borrowed + * @param user The address of the user to be rebalanced + **/ + function rebalanceStableBorrowRate(address asset, address user) external; + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + **/ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + **/ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://developers.aave.com + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://developers.aave.com + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + **/ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + **/ + function initReserve( + address asset, + address aTokenAddress, + address stableDebtAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + **/ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + **/ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + **/ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + **/ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + **/ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + **/ + function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + **/ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + **/ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + **/ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new category for the eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; + + /** + * @notice Returns the data of an eMode category + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate + * @return The percentage of available liquidity to borrow, expressed in bps + */ + function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + **/ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; +} + +// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant STABLE_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant EMODE_CATEGORY_MASK = 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant STABLE_BORROWING_ENABLED_START_BIT_POSITION = 59; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + /// @dev bit 63 reserved + + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + uint256 internal constant EMODE_CATEGORY_START_BIT_POSITION = 168; + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_EMODE_CATEGORY = 255; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + **/ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + **/ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + **/ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + **/ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + **/ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + **/ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + **/ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + **/ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + **/ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + **/ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + **/ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + **/ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + **/ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + **/ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + **/ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + **/ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + **/ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + **/ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + **/ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + **/ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables stable rate borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the stable rate borrowing needs to be enabled, false otherwise + **/ + function setStableRateBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & STABLE_BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << STABLE_BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the stable rate borrowing state of the reserve + * @param self The reserve configuration + * @return The stable rate borrowing state + **/ + function getStableRateBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~STABLE_BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + **/ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + **/ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + **/ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + **/ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + **/ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + **/ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + **/ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + **/ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + **/ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + **/ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + **/ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + **/ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the eMode asset category + * @param self The reserve configuration + * @param category The asset category when the user selects the eMode + **/ + function setEModeCategory( + DataTypes.ReserveConfigurationMap memory self, + uint256 category + ) internal pure { + require(category <= MAX_VALID_EMODE_CATEGORY, Errors.INVALID_EMODE_CATEGORY); + + self.data = (self.data & EMODE_CATEGORY_MASK) | (category << EMODE_CATEGORY_START_BIT_POSITION); + } + + /** + * @dev Gets the eMode asset category + * @param self The reserve configuration + * @return The eMode category for the asset + **/ + function getEModeCategory( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing stableRateBorrowing enabled + * @return The state flag representing paused + **/ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~STABLE_BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + * @return The state param representing eMode category + **/ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION, + (dataLocal & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + **/ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol + +/** + * @title WalletBalanceProvider contract + * @author Aave, influenced by https://github.com/wbobeirne/eth-balance-checker/blob/master/contracts/BalanceChecker.sol + * @notice Implements a logic of getting multiple tokens balance for one user address + * @dev NOTE: THIS CONTRACT IS NOT USED WITHIN THE AAVE PROTOCOL. It's an accessory contract used to reduce the number of calls + * towards the blockchain from the Aave backend. + **/ +contract WalletBalanceProvider { + using Address for address payable; + using Address for address; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + address constant MOCK_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /** + @dev Fallback function, don't accept any ETH + **/ + receive() external payable { + //only contracts can send ETH to the core + require(msg.sender.isContract(), '22'); + } + + /** + @dev Check the token balance of a wallet in a token contract + + Returns the balance of the token for user. Avoids possible errors: + - return 0 on non-contract address + **/ + function balanceOf(address user, address token) public view returns (uint256) { + if (token == MOCK_ETH_ADDRESS) { + return user.balance; // ETH balance + // check if token is actually a contract + } else if (token.isContract()) { + return IERC20(token).balanceOf(user); + } + revert('INVALID_TOKEN'); + } + + /** + * @notice Fetches, for a list of _users and _tokens (ETH included with mock address), the balances + * @param users The list of users + * @param tokens The list of tokens + * @return And array with the concatenation of, for each user, his/her balances + **/ + function batchBalanceOf( + address[] calldata users, + address[] calldata tokens + ) external view returns (uint256[] memory) { + uint256[] memory balances = new uint256[](users.length * tokens.length); + + for (uint256 i = 0; i < users.length; i++) { + for (uint256 j = 0; j < tokens.length; j++) { + balances[i * tokens.length + j] = balanceOf(users[i], tokens[j]); + } + } + + return balances; + } + + /** + @dev provides balances of user wallet for all reserves available on the pool + */ + function getUserWalletBalances( + address provider, + address user + ) external view returns (address[] memory, uint256[] memory) { + IPool pool = IPool(IPoolAddressesProvider(provider).getPool()); + + address[] memory reserves = pool.getReservesList(); + address[] memory reservesWithEth = new address[](reserves.length + 1); + for (uint256 i = 0; i < reserves.length; i++) { + reservesWithEth[i] = reserves[i]; + } + reservesWithEth[reserves.length] = MOCK_ETH_ADDRESS; + + uint256[] memory balances = new uint256[](reservesWithEth.length); + + for (uint256 j = 0; j < reserves.length; j++) { + DataTypes.ReserveConfigurationMap memory configuration = pool.getConfiguration( + reservesWithEth[j] + ); + + (bool isActive, , , , ) = configuration.getFlags(); + + if (!isActive) { + balances[j] = 0; + continue; + } + balances[j] = balanceOf(user, reservesWithEth[j]); + } + balances[reserves.length] = balanceOf(user, MOCK_ETH_ADDRESS); + + return (reservesWithEth, balances); + } +} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..7c3a99d7 --- /dev/null +++ b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity 0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer( + IERC20 token, + address to, + uint256 value + ) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom( + IERC20 token, + address from, + address to, + uint256 value + ) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..c6dcfda7 --- /dev/null +++ b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // According to EIP-1052, 0x0 is the value returned for not-yet created accounts + // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned + // for accounts without code, i.e. `keccak256('')` + bytes32 codehash; + bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; + // solhint-disable-next-line no-inline-assembly + assembly { + codehash := extcodehash(account) + } + return (codehash != accountHash && codehash != 0x0); + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + // solhint-disable-next-line avoid-low-level-calls, avoid-call-value + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } +} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..7dc55938 --- /dev/null +++ b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..7f64b4ab --- /dev/null +++ b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPool.sol @@ -0,0 +1,747 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + **/ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + **/ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + **/ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + **/ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + **/ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + **/ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + **/ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on swapBorrowRateMode() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user swapping his rate mode + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + **/ + event SwapBorrowRateMode( + address indexed reserve, + address indexed user, + DataTypes.InterestRateMode interestRateMode + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + **/ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + **/ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + **/ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on rebalanceStableBorrowRate() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user for which the rebalance has been executed + **/ + event RebalanceStableBorrowRate(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt + * @param premium The fee flash borrowed + * @param referralCode The referral code used + **/ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + **/ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + **/ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + **/ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @dev Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @dev Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + **/ + function backUnbacked( + address asset, + uint256 amount, + uint256 fee + ) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function supply( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + **/ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + **/ + function withdraw( + address asset, + uint256 amount, + address to + ) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the + * corresponding debt token (StableDebtToken or VariableDebtToken) + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 stable/variable debt tokens, depending on the `interestRateMode` + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + **/ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + **/ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + **/ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable + * @return The final amount repaid + **/ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa + * @param asset The address of the underlying asset borrowed + * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable + **/ + function swapBorrowRateMode(address asset, uint256 interestRateMode) external; + + /** + * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. + * - Users can be rebalanced if the following conditions are satisfied: + * 1. Usage ratio is above 95% + * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too + * much has been borrowed at a stable rate and suppliers are not earning enough + * @param asset The address of the underlying asset borrowed + * @param user The address of the user to be rebalanced + **/ + function rebalanceStableBorrowRate(address asset, address user) external; + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + **/ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + **/ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://developers.aave.com + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://developers.aave.com + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + **/ + function getUserAccountData(address user) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + **/ + function initReserve( + address asset, + address aTokenAddress, + address stableDebtAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + **/ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + **/ + function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress) + external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + **/ + function setConfiguration(address asset, DataTypes.ReserveConfigurationMap calldata configuration) + external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + **/ + function getConfiguration(address asset) + external + view + returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + **/ + function getUserConfiguration(address user) + external + view + returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + **/ + function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + **/ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + **/ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + **/ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new category for the eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; + + /** + * @notice Returns the data of an eMode category + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate + * @return The percentage of available liquidity to borrow, expressed in bps + */ + function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + **/ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens( + address token, + address to, + uint256 amount + ) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + **/ + function deposit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; +} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..01a126bd --- /dev/null +++ b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.10; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + **/ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + **/ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + **/ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + **/ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + **/ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + **/ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + **/ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + **/ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + **/ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..ed38c5c3 --- /dev/null +++ b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,633 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant STABLE_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant EMODE_CATEGORY_MASK = 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant STABLE_BORROWING_ENABLED_START_BIT_POSITION = 59; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + /// @dev bit 63 reserved + + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + uint256 internal constant EMODE_CATEGORY_START_BIT_POSITION = 168; + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_EMODE_CATEGORY = 255; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + **/ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + **/ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + **/ + function setLiquidationThreshold(DataTypes.ReserveConfigurationMap memory self, uint256 threshold) + internal + pure + { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + **/ + function getLiquidationThreshold(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + **/ + function setLiquidationBonus(DataTypes.ReserveConfigurationMap memory self, uint256 bonus) + internal + pure + { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + **/ + function getLiquidationBonus(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + **/ + function setDecimals(DataTypes.ReserveConfigurationMap memory self, uint256 decimals) + internal + pure + { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + **/ + function getDecimals(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + **/ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + **/ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + **/ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + **/ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + **/ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + **/ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + **/ + function setBorrowableInIsolation(DataTypes.ReserveConfigurationMap memory self, bool borrowable) + internal + pure + { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + **/ + function getBorrowableInIsolation(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (bool) + { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + **/ + function setSiloedBorrowing(DataTypes.ReserveConfigurationMap memory self, bool siloed) + internal + pure + { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + **/ + function getSiloedBorrowing(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (bool) + { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + **/ + function setBorrowingEnabled(DataTypes.ReserveConfigurationMap memory self, bool enabled) + internal + pure + { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + **/ + function getBorrowingEnabled(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (bool) + { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables stable rate borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the stable rate borrowing needs to be enabled, false otherwise + **/ + function setStableRateBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & STABLE_BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << STABLE_BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the stable rate borrowing state of the reserve + * @param self The reserve configuration + * @return The stable rate borrowing state + **/ + function getStableRateBorrowingEnabled(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (bool) + { + return (self.data & ~STABLE_BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + **/ + function setReserveFactor(DataTypes.ReserveConfigurationMap memory self, uint256 reserveFactor) + internal + pure + { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + **/ + function getReserveFactor(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + **/ + function setBorrowCap(DataTypes.ReserveConfigurationMap memory self, uint256 borrowCap) + internal + pure + { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + **/ + function getBorrowCap(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + **/ + function setSupplyCap(DataTypes.ReserveConfigurationMap memory self, uint256 supplyCap) + internal + pure + { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + **/ + function getSupplyCap(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + **/ + function setDebtCeiling(DataTypes.ReserveConfigurationMap memory self, uint256 ceiling) + internal + pure + { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + **/ + function getDebtCeiling(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + **/ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + **/ + function getLiquidationProtocolFee(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + **/ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + **/ + function getUnbackedMintCap(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the eMode asset category + * @param self The reserve configuration + * @param category The asset category when the user selects the eMode + **/ + function setEModeCategory(DataTypes.ReserveConfigurationMap memory self, uint256 category) + internal + pure + { + require(category <= MAX_VALID_EMODE_CATEGORY, Errors.INVALID_EMODE_CATEGORY); + + self.data = (self.data & EMODE_CATEGORY_MASK) | (category << EMODE_CATEGORY_START_BIT_POSITION); + } + + /** + * @dev Gets the eMode asset category + * @param self The reserve configuration + * @return The eMode category for the asset + **/ + function getEModeCategory(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256) + { + return (self.data & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing stableRateBorrowing enabled + * @return The state flag representing paused + **/ + function getFlags(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns ( + bool, + bool, + bool, + bool, + bool + ) + { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~STABLE_BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + * @return The state param representing eMode category + **/ + function getParams(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns ( + uint256, + uint256, + uint256, + uint256, + uint256, + uint256 + ) + { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION, + (dataLocal & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + **/ + function getCaps(DataTypes.ReserveConfigurationMap memory self) + internal + pure + returns (uint256, uint256) + { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..640e4632 --- /dev/null +++ b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' + string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 +} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..7113a0a5 --- /dev/null +++ b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,268 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.10; + +library DataTypes { + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + //the current stable borrow rate. Expressed in ray + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + //stableDebtToken address + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62-63: reserved + //bit 64-79: reserve factor + //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167 liquidation protocol fee + //bit 168-175 eMode category + //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // each eMode category may or may not have a custom oracle to override the individual assets price oracles + address priceSource; + string label; + } + + enum InterestRateMode { + NONE, + STABLE, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currPrincipalStableDebt; + uint256 currAvgStableBorrowRate; + uint256 currTotalStableDebt; + uint256 nextAvgStableBorrowRate; + uint256 nextTotalStableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address stableDebtTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + uint40 stableDebtLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 maxStableRateBorrowSizePercent; + uint256 reservesCount; + address addressesProvider; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 maxStableLoanPercent; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalStableDebt; + uint256 totalVariableDebt; + uint256 averageStableBorrowRate; + uint256 reserveFactor; + address reserve; + address aToken; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address stableDebtAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol new file mode 100644 index 00000000..54ef4c14 --- /dev/null +++ b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity 0.8.10; + +import {Address} from '../../../core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol'; +import {IERC20} from '../../../core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; + +import {IPoolAddressesProvider} from '../../../core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../core-v3/contracts/interfaces/IPool.sol'; +import {GPv2SafeERC20} from '../../../core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {ReserveConfiguration} from '../../../core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol'; +import {DataTypes} from '../../../core-v3/contracts/protocol/libraries/types/DataTypes.sol'; + +/** + * @title WalletBalanceProvider contract + * @author Aave, influenced by https://github.com/wbobeirne/eth-balance-checker/blob/master/contracts/BalanceChecker.sol + * @notice Implements a logic of getting multiple tokens balance for one user address + * @dev NOTE: THIS CONTRACT IS NOT USED WITHIN THE AAVE PROTOCOL. It's an accessory contract used to reduce the number of calls + * towards the blockchain from the Aave backend. + **/ +contract WalletBalanceProvider { + using Address for address payable; + using Address for address; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + address constant MOCK_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /** + @dev Fallback function, don't accept any ETH + **/ + receive() external payable { + //only contracts can send ETH to the core + require(msg.sender.isContract(), '22'); + } + + /** + @dev Check the token balance of a wallet in a token contract + + Returns the balance of the token for user. Avoids possible errors: + - return 0 on non-contract address + **/ + function balanceOf(address user, address token) public view returns (uint256) { + if (token == MOCK_ETH_ADDRESS) { + return user.balance; // ETH balance + // check if token is actually a contract + } else if (token.isContract()) { + return IERC20(token).balanceOf(user); + } + revert('INVALID_TOKEN'); + } + + /** + * @notice Fetches, for a list of _users and _tokens (ETH included with mock address), the balances + * @param users The list of users + * @param tokens The list of tokens + * @return And array with the concatenation of, for each user, his/her balances + **/ + function batchBalanceOf(address[] calldata users, address[] calldata tokens) + external + view + returns (uint256[] memory) + { + uint256[] memory balances = new uint256[](users.length * tokens.length); + + for (uint256 i = 0; i < users.length; i++) { + for (uint256 j = 0; j < tokens.length; j++) { + balances[i * tokens.length + j] = balanceOf(users[i], tokens[j]); + } + } + + return balances; + } + + /** + @dev provides balances of user wallet for all reserves available on the pool + */ + function getUserWalletBalances(address provider, address user) + external + view + returns (address[] memory, uint256[] memory) + { + IPool pool = IPool(IPoolAddressesProvider(provider).getPool()); + + address[] memory reserves = pool.getReservesList(); + address[] memory reservesWithEth = new address[](reserves.length + 1); + for (uint256 i = 0; i < reserves.length; i++) { + reservesWithEth[i] = reserves[i]; + } + reservesWithEth[reserves.length] = MOCK_ETH_ADDRESS; + + uint256[] memory balances = new uint256[](reservesWithEth.length); + + for (uint256 j = 0; j < reserves.length; j++) { + DataTypes.ReserveConfigurationMap memory configuration = pool.getConfiguration( + reservesWithEth[j] + ); + + (bool isActive, , , , ) = configuration.getFlags(); + + if (!isActive) { + balances[j] = 0; + continue; + } + balances[j] = balanceOf(user, reservesWithEth[j]); + } + balances[reserves.length] = balanceOf(user, MOCK_ETH_ADDRESS); + + return (reservesWithEth, balances); + } +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY.sol b/downloads/ARBITRUM/WETH_GATEWAY.sol new file mode 100644 index 00000000..5984e041 --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY.sol @@ -0,0 +1,3076 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWETH.sol + +interface IWETH { + function deposit() external payable; + + function withdraw(uint256) external; + + function approve(address guy, uint256 wad) external returns (bool); + + function transferFrom(address src, address dst, uint256 wad) external returns (bool); +} + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol + +interface IWrappedTokenGatewayV3 { + function depositETH(address pool, address onBehalfOf, uint16 referralCode) external payable; + + function withdrawETH(address pool, uint256 amount, address onBehalfOf) external; + + function repayETH(address pool, uint256 amount, address onBehalfOf) external payable; + + function borrowETH(address pool, uint256 amount, uint16 referralCode) external; + + function withdrawETHWithPermit( + address pool, + uint256 amount, + address to, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; +} + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/WrappedTokenGatewayV3.sol + +/** + * @dev This contract is an upgrade of the WrappedTokenGatewayV3 contract, with immutable pool address. + * This contract keeps the same interface of the deprecated WrappedTokenGatewayV3 contract. + */ +contract WrappedTokenGatewayV3 is IWrappedTokenGatewayV3, Ownable { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using GPv2SafeERC20 for IERC20; + + IWETH internal immutable WETH; + IPool internal immutable POOL; + + /** + * @dev Sets the WETH address and the PoolAddressesProvider address. Infinite approves pool. + * @param weth Address of the Wrapped Ether contract + * @param owner Address of the owner of this contract + **/ + constructor(address weth, address owner, IPool pool) { + WETH = IWETH(weth); + POOL = pool; + transferOwnership(owner); + IWETH(weth).approve(address(pool), type(uint256).max); + } + + /** + * @dev deposits WETH into the reserve, using native ETH. A corresponding amount of the overlying asset (aTokens) + * is minted. + * @param onBehalfOf address of the user who will receive the aTokens representing the deposit + * @param referralCode integrators are assigned a referral code and can potentially receive rewards. + **/ + function depositETH(address, address onBehalfOf, uint16 referralCode) external payable override { + WETH.deposit{value: msg.value}(); + POOL.deposit(address(WETH), msg.value, onBehalfOf, referralCode); + } + + /** + * @dev withdraws the WETH _reserves of msg.sender. + * @param amount amount of aWETH to withdraw and receive native ETH + * @param to address of the user who will receive native ETH + */ + function withdrawETH(address, uint256 amount, address to) external override { + IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); + uint256 userBalance = aWETH.balanceOf(msg.sender); + uint256 amountToWithdraw = amount; + + // if amount is equal to uint(-1), the user wants to redeem everything + if (amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); + POOL.withdraw(address(WETH), amountToWithdraw, address(this)); + WETH.withdraw(amountToWithdraw); + _safeTransferETH(to, amountToWithdraw); + } + + /** + * @dev repays a borrow on the WETH reserve, for the specified amount (or for the whole amount, if uint256(-1) is specified). + * @param amount the amount to repay, or uint256(-1) if the user wants to repay everything + * @param onBehalfOf the address for which msg.sender is repaying + */ + function repayETH(address, uint256 amount, address onBehalfOf) external payable override { + uint256 paybackAmount = IERC20((POOL.getReserveData(address(WETH))).variableDebtTokenAddress) + .balanceOf(onBehalfOf); + + if (amount < paybackAmount) { + paybackAmount = amount; + } + require(msg.value >= paybackAmount, 'msg.value is less than repayment amount'); + WETH.deposit{value: paybackAmount}(); + POOL.repay( + address(WETH), + paybackAmount, + uint256(DataTypes.InterestRateMode.VARIABLE), + onBehalfOf + ); + + // refund remaining dust eth + if (msg.value > paybackAmount) _safeTransferETH(msg.sender, msg.value - paybackAmount); + } + + /** + * @dev borrow WETH, unwraps to ETH and send both the ETH and DebtTokens to msg.sender, via `approveDelegation` and onBehalf argument in `Pool.borrow`. + * @param amount the amount of ETH to borrow + * @param referralCode integrators are assigned a referral code and can potentially receive rewards + */ + function borrowETH(address, uint256 amount, uint16 referralCode) external override { + POOL.borrow( + address(WETH), + amount, + uint256(DataTypes.InterestRateMode.VARIABLE), + referralCode, + msg.sender + ); + WETH.withdraw(amount); + _safeTransferETH(msg.sender, amount); + } + + /** + * @dev withdraws the WETH _reserves of msg.sender. + * @param amount amount of aWETH to withdraw and receive native ETH + * @param to address of the user who will receive native ETH + * @param deadline validity deadline of permit and so depositWithPermit signature + * @param permitV V parameter of ERC712 permit sig + * @param permitR R parameter of ERC712 permit sig + * @param permitS S parameter of ERC712 permit sig + */ + function withdrawETHWithPermit( + address, + uint256 amount, + address to, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external override { + IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); + uint256 userBalance = aWETH.balanceOf(msg.sender); + uint256 amountToWithdraw = amount; + + // if amount is equal to type(uint256).max, the user wants to redeem everything + if (amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + // permit `amount` rather than `amountToWithdraw` to make it easier for front-ends and integrators + aWETH.permit(msg.sender, address(this), amount, deadline, permitV, permitR, permitS); + aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); + POOL.withdraw(address(WETH), amountToWithdraw, address(this)); + WETH.withdraw(amountToWithdraw); + _safeTransferETH(to, amountToWithdraw); + } + + /** + * @dev transfer ETH to an address, revert if it fails. + * @param to recipient of the transfer + * @param value the amount to send + */ + function _safeTransferETH(address to, uint256 value) internal { + (bool success, ) = to.call{value: value}(new bytes(0)); + require(success, 'ETH_TRANSFER_FAILED'); + } + + /** + * @dev transfer ERC20 from the utility contract, for ERC20 recovery in case of stuck tokens due + * direct transfers to the contract address. + * @param token token to transfer + * @param to recipient of the transfer + * @param amount amount to send + */ + function emergencyTokenTransfer(address token, address to, uint256 amount) external onlyOwner { + IERC20(token).safeTransfer(to, amount); + } + + /** + * @dev transfer native Ether from the utility contract, for native Ether recovery in case of stuck Ether + * due to selfdestructs or ether transfers to the pre-computed contract address before deployment. + * @param to recipient of the transfer + * @param amount amount to send + */ + function emergencyEtherTransfer(address to, uint256 amount) external onlyOwner { + _safeTransferETH(to, amount); + } + + /** + * @dev Get WETH address used by WrappedTokenGatewayV3 + */ + function getWETHAddress() external view returns (address) { + return address(WETH); + } + + /** + * @dev Only WETH contract is allowed to transfer ETH here. Prevent other addresses to send Ether to this contract. + */ + receive() external payable { + require(msg.sender == address(WETH), 'Receive not allowed'); + } + + /** + * @dev Revert fallback calls + */ + fallback() external payable { + revert('Fallback not allowed'); + } +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol new file mode 100644 index 00000000..7917b722 --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +import './Context.sol'; + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/WrappedTokenGatewayV3.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/WrappedTokenGatewayV3.sol new file mode 100644 index 00000000..56725d5e --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/WrappedTokenGatewayV3.sol @@ -0,0 +1,197 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {Ownable} from '../dependencies/openzeppelin/contracts/Ownable.sol'; +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IWETH} from './interfaces/IWETH.sol'; +import {IPool} from '../interfaces/IPool.sol'; +import {IAToken} from '../interfaces/IAToken.sol'; +import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; +import {IWrappedTokenGatewayV3} from './interfaces/IWrappedTokenGatewayV3.sol'; + +/** + * @dev This contract is an upgrade of the WrappedTokenGatewayV3 contract, with immutable pool address. + * This contract keeps the same interface of the deprecated WrappedTokenGatewayV3 contract. + */ +contract WrappedTokenGatewayV3 is IWrappedTokenGatewayV3, Ownable { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using GPv2SafeERC20 for IERC20; + + IWETH internal immutable WETH; + IPool internal immutable POOL; + + /** + * @dev Sets the WETH address and the PoolAddressesProvider address. Infinite approves pool. + * @param weth Address of the Wrapped Ether contract + * @param owner Address of the owner of this contract + **/ + constructor(address weth, address owner, IPool pool) { + WETH = IWETH(weth); + POOL = pool; + transferOwnership(owner); + IWETH(weth).approve(address(pool), type(uint256).max); + } + + /** + * @dev deposits WETH into the reserve, using native ETH. A corresponding amount of the overlying asset (aTokens) + * is minted. + * @param onBehalfOf address of the user who will receive the aTokens representing the deposit + * @param referralCode integrators are assigned a referral code and can potentially receive rewards. + **/ + function depositETH(address, address onBehalfOf, uint16 referralCode) external payable override { + WETH.deposit{value: msg.value}(); + POOL.deposit(address(WETH), msg.value, onBehalfOf, referralCode); + } + + /** + * @dev withdraws the WETH _reserves of msg.sender. + * @param amount amount of aWETH to withdraw and receive native ETH + * @param to address of the user who will receive native ETH + */ + function withdrawETH(address, uint256 amount, address to) external override { + IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); + uint256 userBalance = aWETH.balanceOf(msg.sender); + uint256 amountToWithdraw = amount; + + // if amount is equal to uint(-1), the user wants to redeem everything + if (amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); + POOL.withdraw(address(WETH), amountToWithdraw, address(this)); + WETH.withdraw(amountToWithdraw); + _safeTransferETH(to, amountToWithdraw); + } + + /** + * @dev repays a borrow on the WETH reserve, for the specified amount (or for the whole amount, if uint256(-1) is specified). + * @param amount the amount to repay, or uint256(-1) if the user wants to repay everything + * @param onBehalfOf the address for which msg.sender is repaying + */ + function repayETH(address, uint256 amount, address onBehalfOf) external payable override { + uint256 paybackAmount = IERC20((POOL.getReserveData(address(WETH))).variableDebtTokenAddress) + .balanceOf(onBehalfOf); + + if (amount < paybackAmount) { + paybackAmount = amount; + } + require(msg.value >= paybackAmount, 'msg.value is less than repayment amount'); + WETH.deposit{value: paybackAmount}(); + POOL.repay( + address(WETH), + paybackAmount, + uint256(DataTypes.InterestRateMode.VARIABLE), + onBehalfOf + ); + + // refund remaining dust eth + if (msg.value > paybackAmount) _safeTransferETH(msg.sender, msg.value - paybackAmount); + } + + /** + * @dev borrow WETH, unwraps to ETH and send both the ETH and DebtTokens to msg.sender, via `approveDelegation` and onBehalf argument in `Pool.borrow`. + * @param amount the amount of ETH to borrow + * @param referralCode integrators are assigned a referral code and can potentially receive rewards + */ + function borrowETH(address, uint256 amount, uint16 referralCode) external override { + POOL.borrow( + address(WETH), + amount, + uint256(DataTypes.InterestRateMode.VARIABLE), + referralCode, + msg.sender + ); + WETH.withdraw(amount); + _safeTransferETH(msg.sender, amount); + } + + /** + * @dev withdraws the WETH _reserves of msg.sender. + * @param amount amount of aWETH to withdraw and receive native ETH + * @param to address of the user who will receive native ETH + * @param deadline validity deadline of permit and so depositWithPermit signature + * @param permitV V parameter of ERC712 permit sig + * @param permitR R parameter of ERC712 permit sig + * @param permitS S parameter of ERC712 permit sig + */ + function withdrawETHWithPermit( + address, + uint256 amount, + address to, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external override { + IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); + uint256 userBalance = aWETH.balanceOf(msg.sender); + uint256 amountToWithdraw = amount; + + // if amount is equal to type(uint256).max, the user wants to redeem everything + if (amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + // permit `amount` rather than `amountToWithdraw` to make it easier for front-ends and integrators + aWETH.permit(msg.sender, address(this), amount, deadline, permitV, permitR, permitS); + aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); + POOL.withdraw(address(WETH), amountToWithdraw, address(this)); + WETH.withdraw(amountToWithdraw); + _safeTransferETH(to, amountToWithdraw); + } + + /** + * @dev transfer ETH to an address, revert if it fails. + * @param to recipient of the transfer + * @param value the amount to send + */ + function _safeTransferETH(address to, uint256 value) internal { + (bool success, ) = to.call{value: value}(new bytes(0)); + require(success, 'ETH_TRANSFER_FAILED'); + } + + /** + * @dev transfer ERC20 from the utility contract, for ERC20 recovery in case of stuck tokens due + * direct transfers to the contract address. + * @param token token to transfer + * @param to recipient of the transfer + * @param amount amount to send + */ + function emergencyTokenTransfer(address token, address to, uint256 amount) external onlyOwner { + IERC20(token).safeTransfer(to, amount); + } + + /** + * @dev transfer native Ether from the utility contract, for native Ether recovery in case of stuck Ether + * due to selfdestructs or ether transfers to the pre-computed contract address before deployment. + * @param to recipient of the transfer + * @param amount amount to send + */ + function emergencyEtherTransfer(address to, uint256 amount) external onlyOwner { + _safeTransferETH(to, amount); + } + + /** + * @dev Get WETH address used by WrappedTokenGatewayV3 + */ + function getWETHAddress() external view returns (address) { + return address(WETH); + } + + /** + * @dev Only WETH contract is allowed to transfer ETH here. Prevent other addresses to send Ether to this contract. + */ + receive() external payable { + require(msg.sender == address(WETH), 'Receive not allowed'); + } + + /** + * @dev Revert fallback calls + */ + fallback() external payable { + revert('Fallback not allowed'); + } +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWETH.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWETH.sol new file mode 100644 index 00000000..98281d0a --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWETH.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IWETH { + function deposit() external payable; + + function withdraw(uint256) external; + + function approve(address guy, uint256 wad) external returns (bool); + + function transferFrom(address src, address dst, uint256 wad) external returns (bool); +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol new file mode 100644 index 00000000..ae8f5980 --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +interface IWrappedTokenGatewayV3 { + function depositETH(address pool, address onBehalfOf, uint16 referralCode) external payable; + + function withdrawETH(address pool, uint256 amount, address onBehalfOf) external; + + function repayETH(address pool, uint256 amount, address onBehalfOf) external payable; + + function borrowETH(address pool, uint256 amount, uint16 referralCode) external; + + function withdrawETHWithPermit( + address pool, + uint256 amount, + address to, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER.sol new file mode 100644 index 00000000..9b347532 --- /dev/null +++ b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER.sol @@ -0,0 +1,3228 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolDataProvider.sol + +/** + * @title IPoolDataProvider + * @author Aave + * @notice Defines the basic interface of a PoolDataProvider + */ +interface IPoolDataProvider { + struct TokenData { + string symbol; + address tokenAddress; + } + + /** + * @notice Returns the address for the PoolAddressesProvider contract. + * @return The address for the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the list of the existing reserves in the pool. + * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. + * @return The list of reserves, pairs of symbols and addresses + */ + function getAllReservesTokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the list of the existing ATokens in the pool. + * @return The list of ATokens, pairs of symbols and addresses + */ + function getAllATokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the configuration data of the reserve + * @dev Not returning borrow and supply caps for compatibility, nor pause flag + * @param asset The address of the underlying asset of the reserve + * @return decimals The number of decimals of the reserve + * @return ltv The ltv of the reserve + * @return liquidationThreshold The liquidationThreshold of the reserve + * @return liquidationBonus The liquidationBonus of the reserve + * @return reserveFactor The reserveFactor of the reserve + * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise + * @return borrowingEnabled True if borrowing is enabled, false otherwise + * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise + * @return isActive True if it is active, false otherwise + * @return isFrozen True if it is frozen, false otherwise + */ + function getReserveConfigurationData( + address asset + ) + external + view + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ); + + /** + * @notice Returns the caps parameters of the reserve + * @param asset The address of the underlying asset of the reserve + * @return borrowCap The borrow cap of the reserve + * @return supplyCap The supply cap of the reserve + */ + function getReserveCaps( + address asset + ) external view returns (uint256 borrowCap, uint256 supplyCap); + + /** + * @notice Returns if the pool is paused + * @param asset The address of the underlying asset of the reserve + * @return isPaused True if the pool is paused, false otherwise + */ + function getPaused(address asset) external view returns (bool isPaused); + + /** + * @notice Returns the siloed borrowing flag + * @param asset The address of the underlying asset of the reserve + * @return True if the asset is siloed for borrowing + */ + function getSiloedBorrowing(address asset) external view returns (bool); + + /** + * @notice Returns the protocol fee on the liquidation bonus + * @param asset The address of the underlying asset of the reserve + * @return The protocol fee on liquidation + */ + function getLiquidationProtocolFee(address asset) external view returns (uint256); + + /** + * @notice Returns the unbacked mint cap of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The unbacked mint cap of the reserve + */ + function getUnbackedMintCap(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The debt ceiling of the reserve + */ + function getDebtCeiling(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling decimals + * @return The debt ceiling decimals + */ + function getDebtCeilingDecimals() external pure returns (uint256); + + /** + * @notice Returns the reserve data + * @param asset The address of the underlying asset of the reserve + * @return unbacked The amount of unbacked tokens + * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted + * @return totalAToken The total supply of the aToken + * @return totalStableDebt The total stable debt of the reserve + * @return totalVariableDebt The total variable debt of the reserve + * @return liquidityRate The liquidity rate of the reserve + * @return variableBorrowRate The variable borrow rate of the reserve + * @return stableBorrowRate The stable borrow rate of the reserve + * @return averageStableBorrowRate The average stable borrow rate of the reserve + * @return liquidityIndex The liquidity index of the reserve + * @return variableBorrowIndex The variable borrow index of the reserve + * @return lastUpdateTimestamp The timestamp of the last update of the reserve + */ + function getReserveData( + address asset + ) + external + view + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ); + + /** + * @notice Returns the total supply of aTokens for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total supply of the aToken + */ + function getATokenTotalSupply(address asset) external view returns (uint256); + + /** + * @notice Returns the total debt for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total debt for asset + */ + function getTotalDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the user data in a reserve + * @param asset The address of the underlying asset of the reserve + * @param user The address of the user + * @return currentATokenBalance The current AToken balance of the user + * @return currentStableDebt The current stable debt of the user + * @return currentVariableDebt The current variable debt of the user + * @return principalStableDebt The principal stable debt of the user + * @return scaledVariableDebt The scaled variable debt of the user + * @return stableBorrowRate The stable borrow rate of the user + * @return liquidityRate The liquidity rate of the reserve + * @return stableRateLastUpdated The timestamp of the last update of the user stable rate + * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false + * otherwise + */ + function getUserReserveData( + address asset, + address user + ) + external + view + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ); + + /** + * @notice Returns the token addresses of the reserve + * @param asset The address of the underlying asset of the reserve + * @return aTokenAddress The AToken address of the reserve + * @return stableDebtTokenAddress DEPRECATED in v3.2.0 + * @return variableDebtTokenAddress The VariableDebtToken address of the reserve + */ + function getReserveTokensAddresses( + address asset + ) + external + view + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ); + + /** + * @notice Returns the address of the Interest Rate strategy + * @param asset The address of the underlying asset of the reserve + * @return irStrategyAddress The address of the Interest Rate strategy + */ + function getInterestRateStrategyAddress( + address asset + ) external view returns (address irStrategyAddress); + + /** + * @notice Returns whether the reserve has FlashLoans enabled or disabled + * @param asset The address of the underlying asset of the reserve + * @return True if FlashLoans are enabled, false otherwise + */ + function getFlashLoanEnabled(address asset) external view returns (bool); + + /** + * @notice Returns whether virtual accounting is enabled/not for a reserve + * @param asset The address of the underlying asset of the reserve + * @return True if active, false otherwise + */ + function getIsVirtualAccActive(address asset) external view returns (bool); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint256); +} + +// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/helpers/AaveProtocolDataProvider.sol + +/** + * @title AaveProtocolDataProvider + * @author Aave + * @notice Peripheral contract to collect and pre-process information from the Pool. + */ +contract AaveProtocolDataProvider is IPoolDataProvider { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + + address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; + address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /// @inheritdoc IPoolDataProvider + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @notice Constructor + * @param addressesProvider The address of the PoolAddressesProvider contract + */ + constructor(IPoolAddressesProvider addressesProvider) { + ADDRESSES_PROVIDER = addressesProvider; + } + + /// @inheritdoc IPoolDataProvider + function getAllReservesTokens() external view override returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory reservesTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + if (reserves[i] == MKR) { + reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); + continue; + } + if (reserves[i] == ETH) { + reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); + continue; + } + reservesTokens[i] = TokenData({ + symbol: IERC20Detailed(reserves[i]).symbol(), + tokenAddress: reserves[i] + }); + } + return reservesTokens; + } + + /// @inheritdoc IPoolDataProvider + function getAllATokens() external view override returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory aTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveDataLegacy memory reserveData = pool.getReserveData(reserves[i]); + aTokens[i] = TokenData({ + symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), + tokenAddress: reserveData.aTokenAddress + }); + } + return aTokens; + } + + /// @inheritdoc IPoolDataProvider + function getReserveConfigurationData( + address asset + ) + external + view + override + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ) + { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration + .getParams(); + + (isActive, isFrozen, borrowingEnabled, ) = configuration.getFlags(); + + // @notice all stable debt related parameters deprecated in v3.2.0 + stableBorrowRateEnabled = false; + + usageAsCollateralEnabled = liquidationThreshold != 0; + } + + /// @inheritdoc IPoolDataProvider + function getReserveCaps( + address asset + ) external view override returns (uint256 borrowCap, uint256 supplyCap) { + (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); + } + + /// @inheritdoc IPoolDataProvider + function getPaused(address asset) external view override returns (bool isPaused) { + (, , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); + } + + /// @inheritdoc IPoolDataProvider + function getSiloedBorrowing(address asset) external view override returns (bool) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); + } + + /// @inheritdoc IPoolDataProvider + function getLiquidationProtocolFee(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); + } + + /// @inheritdoc IPoolDataProvider + function getUnbackedMintCap(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); + } + + /// @inheritdoc IPoolDataProvider + function getDebtCeiling(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); + } + + /// @inheritdoc IPoolDataProvider + function getDebtCeilingDecimals() external pure override returns (uint256) { + return ReserveConfiguration.DEBT_CEILING_DECIMALS; + } + + /// @inheritdoc IPoolDataProvider + function getReserveData( + address asset + ) + external + view + override + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + // @notice all stable debt related parameters deprecated in v3.2.0 + return ( + reserve.unbacked, + reserve.accruedToTreasury, + IERC20Detailed(reserve.aTokenAddress).totalSupply(), + 0, + IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), + reserve.currentLiquidityRate, + reserve.currentVariableBorrowRate, + 0, + 0, + reserve.liquidityIndex, + reserve.variableBorrowIndex, + reserve.lastUpdateTimestamp + ); + } + + /// @inheritdoc IPoolDataProvider + function getATokenTotalSupply(address asset) external view override returns (uint256) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.aTokenAddress).totalSupply(); + } + + /// @inheritdoc IPoolDataProvider + function getTotalDebt(address asset) external view override returns (uint256) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); + } + + /// @inheritdoc IPoolDataProvider + function getUserReserveData( + address asset, + address user + ) + external + view + override + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) + .getUserConfiguration(user); + + currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); + currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); + + // @notice all stable debt related parameters deprecated in v3.2.0 + currentStableDebt = principalStableDebt = stableBorrowRate = stableRateLastUpdated = 0; + + scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); + liquidityRate = reserve.currentLiquidityRate; + usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); + } + + /// @inheritdoc IPoolDataProvider + function getReserveTokensAddresses( + address asset + ) + external + view + override + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + // @notice all stable debt related parameters deprecated in v3.2.0 + return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); + } + + /// @inheritdoc IPoolDataProvider + function getInterestRateStrategyAddress( + address asset + ) external view override returns (address irStrategyAddress) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + return (reserve.interestRateStrategyAddress); + } + + /// @inheritdoc IPoolDataProvider + function getFlashLoanEnabled(address asset) external view override returns (bool) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + return configuration.getFlashLoanEnabled(); + } + + /// @inheritdoc IPoolDataProvider + function getIsVirtualAccActive(address asset) external view override returns (bool) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + return configuration.getIsVirtualAccActive(); + } + + /// @inheritdoc IPoolDataProvider + function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); + } +} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/helpers/AaveProtocolDataProvider.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/helpers/AaveProtocolDataProvider.sol new file mode 100644 index 00000000..671b658b --- /dev/null +++ b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/helpers/AaveProtocolDataProvider.sol @@ -0,0 +1,295 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; +import {WadRayMath} from '../protocol/libraries/math/WadRayMath.sol'; +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {IVariableDebtToken} from '../interfaces/IVariableDebtToken.sol'; +import {IPool} from '../interfaces/IPool.sol'; +import {IPoolDataProvider} from '../interfaces/IPoolDataProvider.sol'; + +/** + * @title AaveProtocolDataProvider + * @author Aave + * @notice Peripheral contract to collect and pre-process information from the Pool. + */ +contract AaveProtocolDataProvider is IPoolDataProvider { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + + address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; + address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /// @inheritdoc IPoolDataProvider + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @notice Constructor + * @param addressesProvider The address of the PoolAddressesProvider contract + */ + constructor(IPoolAddressesProvider addressesProvider) { + ADDRESSES_PROVIDER = addressesProvider; + } + + /// @inheritdoc IPoolDataProvider + function getAllReservesTokens() external view override returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory reservesTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + if (reserves[i] == MKR) { + reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); + continue; + } + if (reserves[i] == ETH) { + reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); + continue; + } + reservesTokens[i] = TokenData({ + symbol: IERC20Detailed(reserves[i]).symbol(), + tokenAddress: reserves[i] + }); + } + return reservesTokens; + } + + /// @inheritdoc IPoolDataProvider + function getAllATokens() external view override returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory aTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveDataLegacy memory reserveData = pool.getReserveData(reserves[i]); + aTokens[i] = TokenData({ + symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), + tokenAddress: reserveData.aTokenAddress + }); + } + return aTokens; + } + + /// @inheritdoc IPoolDataProvider + function getReserveConfigurationData( + address asset + ) + external + view + override + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ) + { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration + .getParams(); + + (isActive, isFrozen, borrowingEnabled, ) = configuration.getFlags(); + + // @notice all stable debt related parameters deprecated in v3.2.0 + stableBorrowRateEnabled = false; + + usageAsCollateralEnabled = liquidationThreshold != 0; + } + + /// @inheritdoc IPoolDataProvider + function getReserveCaps( + address asset + ) external view override returns (uint256 borrowCap, uint256 supplyCap) { + (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); + } + + /// @inheritdoc IPoolDataProvider + function getPaused(address asset) external view override returns (bool isPaused) { + (, , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); + } + + /// @inheritdoc IPoolDataProvider + function getSiloedBorrowing(address asset) external view override returns (bool) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); + } + + /// @inheritdoc IPoolDataProvider + function getLiquidationProtocolFee(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); + } + + /// @inheritdoc IPoolDataProvider + function getUnbackedMintCap(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); + } + + /// @inheritdoc IPoolDataProvider + function getDebtCeiling(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); + } + + /// @inheritdoc IPoolDataProvider + function getDebtCeilingDecimals() external pure override returns (uint256) { + return ReserveConfiguration.DEBT_CEILING_DECIMALS; + } + + /// @inheritdoc IPoolDataProvider + function getReserveData( + address asset + ) + external + view + override + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + // @notice all stable debt related parameters deprecated in v3.2.0 + return ( + reserve.unbacked, + reserve.accruedToTreasury, + IERC20Detailed(reserve.aTokenAddress).totalSupply(), + 0, + IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), + reserve.currentLiquidityRate, + reserve.currentVariableBorrowRate, + 0, + 0, + reserve.liquidityIndex, + reserve.variableBorrowIndex, + reserve.lastUpdateTimestamp + ); + } + + /// @inheritdoc IPoolDataProvider + function getATokenTotalSupply(address asset) external view override returns (uint256) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.aTokenAddress).totalSupply(); + } + + /// @inheritdoc IPoolDataProvider + function getTotalDebt(address asset) external view override returns (uint256) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); + } + + /// @inheritdoc IPoolDataProvider + function getUserReserveData( + address asset, + address user + ) + external + view + override + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) + .getUserConfiguration(user); + + currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); + currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); + + // @notice all stable debt related parameters deprecated in v3.2.0 + currentStableDebt = principalStableDebt = stableBorrowRate = stableRateLastUpdated = 0; + + scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); + liquidityRate = reserve.currentLiquidityRate; + usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); + } + + /// @inheritdoc IPoolDataProvider + function getReserveTokensAddresses( + address asset + ) + external + view + override + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + // @notice all stable debt related parameters deprecated in v3.2.0 + return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); + } + + /// @inheritdoc IPoolDataProvider + function getInterestRateStrategyAddress( + address asset + ) external view override returns (address irStrategyAddress) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + return (reserve.interestRateStrategyAddress); + } + + /// @inheritdoc IPoolDataProvider + function getFlashLoanEnabled(address asset) external view override returns (bool) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + return configuration.getFlashLoanEnabled(); + } + + /// @inheritdoc IPoolDataProvider + function getIsVirtualAccActive(address asset) external view override returns (bool) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + return configuration.getIsVirtualAccActive(); + } + + /// @inheritdoc IPoolDataProvider + function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); + } +} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPool.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolDataProvider.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolDataProvider.sol new file mode 100644 index 00000000..a9df8903 --- /dev/null +++ b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolDataProvider.sol @@ -0,0 +1,250 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPoolDataProvider + * @author Aave + * @notice Defines the basic interface of a PoolDataProvider + */ +interface IPoolDataProvider { + struct TokenData { + string symbol; + address tokenAddress; + } + + /** + * @notice Returns the address for the PoolAddressesProvider contract. + * @return The address for the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the list of the existing reserves in the pool. + * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. + * @return The list of reserves, pairs of symbols and addresses + */ + function getAllReservesTokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the list of the existing ATokens in the pool. + * @return The list of ATokens, pairs of symbols and addresses + */ + function getAllATokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the configuration data of the reserve + * @dev Not returning borrow and supply caps for compatibility, nor pause flag + * @param asset The address of the underlying asset of the reserve + * @return decimals The number of decimals of the reserve + * @return ltv The ltv of the reserve + * @return liquidationThreshold The liquidationThreshold of the reserve + * @return liquidationBonus The liquidationBonus of the reserve + * @return reserveFactor The reserveFactor of the reserve + * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise + * @return borrowingEnabled True if borrowing is enabled, false otherwise + * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise + * @return isActive True if it is active, false otherwise + * @return isFrozen True if it is frozen, false otherwise + */ + function getReserveConfigurationData( + address asset + ) + external + view + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ); + + /** + * @notice Returns the caps parameters of the reserve + * @param asset The address of the underlying asset of the reserve + * @return borrowCap The borrow cap of the reserve + * @return supplyCap The supply cap of the reserve + */ + function getReserveCaps( + address asset + ) external view returns (uint256 borrowCap, uint256 supplyCap); + + /** + * @notice Returns if the pool is paused + * @param asset The address of the underlying asset of the reserve + * @return isPaused True if the pool is paused, false otherwise + */ + function getPaused(address asset) external view returns (bool isPaused); + + /** + * @notice Returns the siloed borrowing flag + * @param asset The address of the underlying asset of the reserve + * @return True if the asset is siloed for borrowing + */ + function getSiloedBorrowing(address asset) external view returns (bool); + + /** + * @notice Returns the protocol fee on the liquidation bonus + * @param asset The address of the underlying asset of the reserve + * @return The protocol fee on liquidation + */ + function getLiquidationProtocolFee(address asset) external view returns (uint256); + + /** + * @notice Returns the unbacked mint cap of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The unbacked mint cap of the reserve + */ + function getUnbackedMintCap(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The debt ceiling of the reserve + */ + function getDebtCeiling(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling decimals + * @return The debt ceiling decimals + */ + function getDebtCeilingDecimals() external pure returns (uint256); + + /** + * @notice Returns the reserve data + * @param asset The address of the underlying asset of the reserve + * @return unbacked The amount of unbacked tokens + * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted + * @return totalAToken The total supply of the aToken + * @return totalStableDebt The total stable debt of the reserve + * @return totalVariableDebt The total variable debt of the reserve + * @return liquidityRate The liquidity rate of the reserve + * @return variableBorrowRate The variable borrow rate of the reserve + * @return stableBorrowRate The stable borrow rate of the reserve + * @return averageStableBorrowRate The average stable borrow rate of the reserve + * @return liquidityIndex The liquidity index of the reserve + * @return variableBorrowIndex The variable borrow index of the reserve + * @return lastUpdateTimestamp The timestamp of the last update of the reserve + */ + function getReserveData( + address asset + ) + external + view + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ); + + /** + * @notice Returns the total supply of aTokens for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total supply of the aToken + */ + function getATokenTotalSupply(address asset) external view returns (uint256); + + /** + * @notice Returns the total debt for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total debt for asset + */ + function getTotalDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the user data in a reserve + * @param asset The address of the underlying asset of the reserve + * @param user The address of the user + * @return currentATokenBalance The current AToken balance of the user + * @return currentStableDebt The current stable debt of the user + * @return currentVariableDebt The current variable debt of the user + * @return principalStableDebt The principal stable debt of the user + * @return scaledVariableDebt The scaled variable debt of the user + * @return stableBorrowRate The stable borrow rate of the user + * @return liquidityRate The liquidity rate of the reserve + * @return stableRateLastUpdated The timestamp of the last update of the user stable rate + * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false + * otherwise + */ + function getUserReserveData( + address asset, + address user + ) + external + view + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ); + + /** + * @notice Returns the token addresses of the reserve + * @param asset The address of the underlying asset of the reserve + * @return aTokenAddress The AToken address of the reserve + * @return stableDebtTokenAddress DEPRECATED in v3.2.0 + * @return variableDebtTokenAddress The VariableDebtToken address of the reserve + */ + function getReserveTokensAddresses( + address asset + ) + external + view + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ); + + /** + * @notice Returns the address of the Interest Rate strategy + * @param asset The address of the underlying asset of the reserve + * @return irStrategyAddress The address of the Interest Rate strategy + */ + function getInterestRateStrategyAddress( + address asset + ) external view returns (address irStrategyAddress); + + /** + * @notice Returns whether the reserve has FlashLoans enabled or disabled + * @param asset The address of the underlying asset of the reserve + * @return True if FlashLoans are enabled, false otherwise + */ + function getFlashLoanEnabled(address asset) external view returns (bool); + + /** + * @notice Returns whether virtual accounting is enabled/not for a reserve + * @param asset The address of the underlying asset of the reserve + * @return True if active, false otherwise + */ + function getIsVirtualAccActive(address asset) external view returns (bool); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint256); +} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/ACL_MANAGER.sol b/downloads/LINEA/ACL_MANAGER.sol new file mode 100644 index 00000000..c45f49c9 --- /dev/null +++ b/downloads/LINEA/ACL_MANAGER.sol @@ -0,0 +1,1069 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IERC165.sol + +/** + * @dev Interface of the ERC165 standard, as defined in the + * https://eips.ethereum.org/EIPS/eip-165[EIP]. + * + * Implementers can declare support of contract interfaces, which can then be + * queried by others ({ERC165Checker}). + * + * For an implementation, see {ERC165}. + */ +interface IERC165 { + /** + * @dev Returns true if this contract implements the interface defined by + * `interfaceId`. See the corresponding + * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] + * to learn more about how these ids are created. + * + * This function call must use less than 30 000 gas. + */ + function supportsInterface(bytes4 interfaceId) external view returns (bool); +} + +// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Strings.sol + +/** + * @dev String operations. + */ +library Strings { + bytes16 private constant _HEX_SYMBOLS = '0123456789abcdef'; + + /** + * @dev Converts a `uint256` to its ASCII `string` decimal representation. + */ + function toString(uint256 value) internal pure returns (string memory) { + // Inspired by OraclizeAPI's implementation - MIT licence + // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol + + if (value == 0) { + return '0'; + } + uint256 temp = value; + uint256 digits; + while (temp != 0) { + digits++; + temp /= 10; + } + bytes memory buffer = new bytes(digits); + while (value != 0) { + digits -= 1; + buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); + value /= 10; + } + return string(buffer); + } + + /** + * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. + */ + function toHexString(uint256 value) internal pure returns (string memory) { + if (value == 0) { + return '0x00'; + } + uint256 temp = value; + uint256 length = 0; + while (temp != 0) { + length++; + temp >>= 8; + } + return toHexString(value, length); + } + + /** + * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. + */ + function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { + bytes memory buffer = new bytes(2 * length + 2); + buffer[0] = '0'; + buffer[1] = 'x'; + for (uint256 i = 2 * length + 1; i > 1; --i) { + buffer[i] = _HEX_SYMBOLS[value & 0xf]; + value >>= 4; + } + require(value == 0, 'Strings: hex length insufficient'); + return string(buffer); + } +} + +// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/ERC165.sol + +/** + * @dev Implementation of the {IERC165} interface. + * + * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check + * for the additional interface id that will be supported. For example: + * + * ```solidity + * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); + * } + * ``` + * + * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. + */ +abstract contract ERC165 is IERC165 { + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IERC165).interfaceId; + } +} + +// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/AccessControl.sol + +/** + * @dev Contract module that allows children to implement role-based access + * control mechanisms. This is a lightweight version that doesn't allow enumerating role + * members except through off-chain means by accessing the contract event logs. Some + * applications may benefit from on-chain enumerability, for those cases see + * {AccessControlEnumerable}. + * + * Roles are referred to by their `bytes32` identifier. These should be exposed + * in the external API and be unique. The best way to achieve this is by + * using `public constant` hash digests: + * + * ``` + * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); + * ``` + * + * Roles can be used to represent a set of permissions. To restrict access to a + * function call, use {hasRole}: + * + * ``` + * function foo() public { + * require(hasRole(MY_ROLE, msg.sender)); + * ... + * } + * ``` + * + * Roles can be granted and revoked dynamically via the {grantRole} and + * {revokeRole} functions. Each role has an associated admin role, and only + * accounts that have a role's admin role can call {grantRole} and {revokeRole}. + * + * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means + * that only accounts with this role will be able to grant or revoke other + * roles. More complex role relationships can be created by using + * {_setRoleAdmin}. + * + * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to + * grant and revoke this role. Extra precautions should be taken to secure + * accounts that have been granted it. + */ +abstract contract AccessControl is Context, IAccessControl, ERC165 { + struct RoleData { + mapping(address => bool) members; + bytes32 adminRole; + } + + mapping(bytes32 => RoleData) private _roles; + + bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; + + /** + * @dev Modifier that checks that an account has a specific role. Reverts + * with a standardized message including the required role. + * + * The format of the revert reason is given by the following regular expression: + * + * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ + * + * _Available since v4.1._ + */ + modifier onlyRole(bytes32 role) { + _checkRole(role, _msgSender()); + _; + } + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); + } + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) public view override returns (bool) { + return _roles[role].members[account]; + } + + /** + * @dev Revert with a standard message if `account` is missing `role`. + * + * The format of the revert reason is given by the following regular expression: + * + * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ + */ + function _checkRole(bytes32 role, address account) internal view { + if (!hasRole(role, account)) { + revert( + string( + abi.encodePacked( + 'AccessControl: account ', + Strings.toHexString(uint160(account), 20), + ' is missing role ', + Strings.toHexString(uint256(role), 32) + ) + ) + ); + } + } + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) public view override returns (bytes32) { + return _roles[role].adminRole; + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole( + bytes32 role, + address account + ) public virtual override onlyRole(getRoleAdmin(role)) { + _grantRole(role, account); + } + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole( + bytes32 role, + address account + ) public virtual override onlyRole(getRoleAdmin(role)) { + _revokeRole(role, account); + } + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) public virtual override { + require(account == _msgSender(), 'AccessControl: can only renounce roles for self'); + + _revokeRole(role, account); + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. Note that unlike {grantRole}, this function doesn't perform any + * checks on the calling account. + * + * [WARNING] + * ==== + * This function should only be called from the constructor when setting + * up the initial roles for the system. + * + * Using this function in any other way is effectively circumventing the admin + * system imposed by {AccessControl}. + * ==== + */ + function _setupRole(bytes32 role, address account) internal virtual { + _grantRole(role, account); + } + + /** + * @dev Sets `adminRole` as ``role``'s admin role. + * + * Emits a {RoleAdminChanged} event. + */ + function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { + bytes32 previousAdminRole = getRoleAdmin(role); + _roles[role].adminRole = adminRole; + emit RoleAdminChanged(role, previousAdminRole, adminRole); + } + + function _grantRole(bytes32 role, address account) private { + if (!hasRole(role, account)) { + _roles[role].members[account] = true; + emit RoleGranted(role, account, _msgSender()); + } + } + + function _revokeRole(bytes32 role, address account) private { + if (hasRole(role, account)) { + _roles[role].members[account] = false; + emit RoleRevoked(role, account, _msgSender()); + } + } +} + +// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/configuration/ACLManager.sol + +/** + * @title ACLManager + * @author Aave + * @notice Access Control List Manager. Main registry of system roles and permissions. + */ +contract ACLManager is AccessControl, IACLManager { + bytes32 public constant override POOL_ADMIN_ROLE = keccak256('POOL_ADMIN'); + bytes32 public constant override EMERGENCY_ADMIN_ROLE = keccak256('EMERGENCY_ADMIN'); + bytes32 public constant override RISK_ADMIN_ROLE = keccak256('RISK_ADMIN'); + bytes32 public constant override FLASH_BORROWER_ROLE = keccak256('FLASH_BORROWER'); + bytes32 public constant override BRIDGE_ROLE = keccak256('BRIDGE'); + bytes32 public constant override ASSET_LISTING_ADMIN_ROLE = keccak256('ASSET_LISTING_ADMIN'); + + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @dev Constructor + * @dev The ACL admin should be initialized at the addressesProvider beforehand + * @param provider The address of the PoolAddressesProvider + */ + constructor(IPoolAddressesProvider provider) { + ADDRESSES_PROVIDER = provider; + address aclAdmin = provider.getACLAdmin(); + require(aclAdmin != address(0), Errors.ACL_ADMIN_CANNOT_BE_ZERO); + _setupRole(DEFAULT_ADMIN_ROLE, aclAdmin); + } + + /// @inheritdoc IACLManager + function setRoleAdmin( + bytes32 role, + bytes32 adminRole + ) external override onlyRole(DEFAULT_ADMIN_ROLE) { + _setRoleAdmin(role, adminRole); + } + + /// @inheritdoc IACLManager + function addPoolAdmin(address admin) external override { + grantRole(POOL_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removePoolAdmin(address admin) external override { + revokeRole(POOL_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isPoolAdmin(address admin) external view override returns (bool) { + return hasRole(POOL_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function addEmergencyAdmin(address admin) external override { + grantRole(EMERGENCY_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removeEmergencyAdmin(address admin) external override { + revokeRole(EMERGENCY_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isEmergencyAdmin(address admin) external view override returns (bool) { + return hasRole(EMERGENCY_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function addRiskAdmin(address admin) external override { + grantRole(RISK_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removeRiskAdmin(address admin) external override { + revokeRole(RISK_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isRiskAdmin(address admin) external view override returns (bool) { + return hasRole(RISK_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function addFlashBorrower(address borrower) external override { + grantRole(FLASH_BORROWER_ROLE, borrower); + } + + /// @inheritdoc IACLManager + function removeFlashBorrower(address borrower) external override { + revokeRole(FLASH_BORROWER_ROLE, borrower); + } + + /// @inheritdoc IACLManager + function isFlashBorrower(address borrower) external view override returns (bool) { + return hasRole(FLASH_BORROWER_ROLE, borrower); + } + + /// @inheritdoc IACLManager + function addBridge(address bridge) external override { + grantRole(BRIDGE_ROLE, bridge); + } + + /// @inheritdoc IACLManager + function removeBridge(address bridge) external override { + revokeRole(BRIDGE_ROLE, bridge); + } + + /// @inheritdoc IACLManager + function isBridge(address bridge) external view override returns (bool) { + return hasRole(BRIDGE_ROLE, bridge); + } + + /// @inheritdoc IACLManager + function addAssetListingAdmin(address admin) external override { + grantRole(ASSET_LISTING_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removeAssetListingAdmin(address admin) external override { + revokeRole(ASSET_LISTING_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isAssetListingAdmin(address admin) external view override returns (bool) { + return hasRole(ASSET_LISTING_ADMIN_ROLE, admin); + } +} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/AccessControl.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/AccessControl.sol new file mode 100644 index 00000000..1f73bab6 --- /dev/null +++ b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/AccessControl.sol @@ -0,0 +1,216 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +import './IAccessControl.sol'; +import './Context.sol'; +import './Strings.sol'; +import './ERC165.sol'; + +/** + * @dev Contract module that allows children to implement role-based access + * control mechanisms. This is a lightweight version that doesn't allow enumerating role + * members except through off-chain means by accessing the contract event logs. Some + * applications may benefit from on-chain enumerability, for those cases see + * {AccessControlEnumerable}. + * + * Roles are referred to by their `bytes32` identifier. These should be exposed + * in the external API and be unique. The best way to achieve this is by + * using `public constant` hash digests: + * + * ``` + * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); + * ``` + * + * Roles can be used to represent a set of permissions. To restrict access to a + * function call, use {hasRole}: + * + * ``` + * function foo() public { + * require(hasRole(MY_ROLE, msg.sender)); + * ... + * } + * ``` + * + * Roles can be granted and revoked dynamically via the {grantRole} and + * {revokeRole} functions. Each role has an associated admin role, and only + * accounts that have a role's admin role can call {grantRole} and {revokeRole}. + * + * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means + * that only accounts with this role will be able to grant or revoke other + * roles. More complex role relationships can be created by using + * {_setRoleAdmin}. + * + * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to + * grant and revoke this role. Extra precautions should be taken to secure + * accounts that have been granted it. + */ +abstract contract AccessControl is Context, IAccessControl, ERC165 { + struct RoleData { + mapping(address => bool) members; + bytes32 adminRole; + } + + mapping(bytes32 => RoleData) private _roles; + + bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; + + /** + * @dev Modifier that checks that an account has a specific role. Reverts + * with a standardized message including the required role. + * + * The format of the revert reason is given by the following regular expression: + * + * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ + * + * _Available since v4.1._ + */ + modifier onlyRole(bytes32 role) { + _checkRole(role, _msgSender()); + _; + } + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); + } + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) public view override returns (bool) { + return _roles[role].members[account]; + } + + /** + * @dev Revert with a standard message if `account` is missing `role`. + * + * The format of the revert reason is given by the following regular expression: + * + * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ + */ + function _checkRole(bytes32 role, address account) internal view { + if (!hasRole(role, account)) { + revert( + string( + abi.encodePacked( + 'AccessControl: account ', + Strings.toHexString(uint160(account), 20), + ' is missing role ', + Strings.toHexString(uint256(role), 32) + ) + ) + ); + } + } + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) public view override returns (bytes32) { + return _roles[role].adminRole; + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole( + bytes32 role, + address account + ) public virtual override onlyRole(getRoleAdmin(role)) { + _grantRole(role, account); + } + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole( + bytes32 role, + address account + ) public virtual override onlyRole(getRoleAdmin(role)) { + _revokeRole(role, account); + } + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) public virtual override { + require(account == _msgSender(), 'AccessControl: can only renounce roles for self'); + + _revokeRole(role, account); + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. Note that unlike {grantRole}, this function doesn't perform any + * checks on the calling account. + * + * [WARNING] + * ==== + * This function should only be called from the constructor when setting + * up the initial roles for the system. + * + * Using this function in any other way is effectively circumventing the admin + * system imposed by {AccessControl}. + * ==== + */ + function _setupRole(bytes32 role, address account) internal virtual { + _grantRole(role, account); + } + + /** + * @dev Sets `adminRole` as ``role``'s admin role. + * + * Emits a {RoleAdminChanged} event. + */ + function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { + bytes32 previousAdminRole = getRoleAdmin(role); + _roles[role].adminRole = adminRole; + emit RoleAdminChanged(role, previousAdminRole, adminRole); + } + + function _grantRole(bytes32 role, address account) private { + if (!hasRole(role, account)) { + _roles[role].members[account] = true; + emit RoleGranted(role, account, _msgSender()); + } + } + + function _revokeRole(bytes32 role, address account) private { + if (hasRole(role, account)) { + _roles[role].members[account] = false; + emit RoleRevoked(role, account, _msgSender()); + } + } +} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/ERC165.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/ERC165.sol new file mode 100644 index 00000000..74efff97 --- /dev/null +++ b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/ERC165.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +import './IERC165.sol'; + +/** + * @dev Implementation of the {IERC165} interface. + * + * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check + * for the additional interface id that will be supported. For example: + * + * ```solidity + * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); + * } + * ``` + * + * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. + */ +abstract contract ERC165 is IERC165 { + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IERC165).interfaceId; + } +} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IERC165.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IERC165.sol new file mode 100644 index 00000000..b914e440 --- /dev/null +++ b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IERC165.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev Interface of the ERC165 standard, as defined in the + * https://eips.ethereum.org/EIPS/eip-165[EIP]. + * + * Implementers can declare support of contract interfaces, which can then be + * queried by others ({ERC165Checker}). + * + * For an implementation, see {ERC165}. + */ +interface IERC165 { + /** + * @dev Returns true if this contract implements the interface defined by + * `interfaceId`. See the corresponding + * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] + * to learn more about how these ids are created. + * + * This function call must use less than 30 000 gas. + */ + function supportsInterface(bytes4 interfaceId) external view returns (bool); +} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Strings.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Strings.sol new file mode 100644 index 00000000..760a2671 --- /dev/null +++ b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Strings.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev String operations. + */ +library Strings { + bytes16 private constant _HEX_SYMBOLS = '0123456789abcdef'; + + /** + * @dev Converts a `uint256` to its ASCII `string` decimal representation. + */ + function toString(uint256 value) internal pure returns (string memory) { + // Inspired by OraclizeAPI's implementation - MIT licence + // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol + + if (value == 0) { + return '0'; + } + uint256 temp = value; + uint256 digits; + while (temp != 0) { + digits++; + temp /= 10; + } + bytes memory buffer = new bytes(digits); + while (value != 0) { + digits -= 1; + buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); + value /= 10; + } + return string(buffer); + } + + /** + * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. + */ + function toHexString(uint256 value) internal pure returns (string memory) { + if (value == 0) { + return '0x00'; + } + uint256 temp = value; + uint256 length = 0; + while (temp != 0) { + length++; + temp >>= 8; + } + return toHexString(value, length); + } + + /** + * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. + */ + function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { + bytes memory buffer = new bytes(2 * length + 2); + buffer[0] = '0'; + buffer[1] = 'x'; + for (uint256 i = 2 * length + 1; i > 1; --i) { + buffer[i] = _HEX_SYMBOLS[value & 0xf]; + value >>= 4; + } + require(value == 0, 'Strings: hex length insufficient'); + return string(buffer); + } +} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/configuration/ACLManager.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/configuration/ACLManager.sol new file mode 100644 index 00000000..dc4de67d --- /dev/null +++ b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/configuration/ACLManager.sol @@ -0,0 +1,133 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {AccessControl} from '../../dependencies/openzeppelin/contracts/AccessControl.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {IACLManager} from '../../interfaces/IACLManager.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; + +/** + * @title ACLManager + * @author Aave + * @notice Access Control List Manager. Main registry of system roles and permissions. + */ +contract ACLManager is AccessControl, IACLManager { + bytes32 public constant override POOL_ADMIN_ROLE = keccak256('POOL_ADMIN'); + bytes32 public constant override EMERGENCY_ADMIN_ROLE = keccak256('EMERGENCY_ADMIN'); + bytes32 public constant override RISK_ADMIN_ROLE = keccak256('RISK_ADMIN'); + bytes32 public constant override FLASH_BORROWER_ROLE = keccak256('FLASH_BORROWER'); + bytes32 public constant override BRIDGE_ROLE = keccak256('BRIDGE'); + bytes32 public constant override ASSET_LISTING_ADMIN_ROLE = keccak256('ASSET_LISTING_ADMIN'); + + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @dev Constructor + * @dev The ACL admin should be initialized at the addressesProvider beforehand + * @param provider The address of the PoolAddressesProvider + */ + constructor(IPoolAddressesProvider provider) { + ADDRESSES_PROVIDER = provider; + address aclAdmin = provider.getACLAdmin(); + require(aclAdmin != address(0), Errors.ACL_ADMIN_CANNOT_BE_ZERO); + _setupRole(DEFAULT_ADMIN_ROLE, aclAdmin); + } + + /// @inheritdoc IACLManager + function setRoleAdmin( + bytes32 role, + bytes32 adminRole + ) external override onlyRole(DEFAULT_ADMIN_ROLE) { + _setRoleAdmin(role, adminRole); + } + + /// @inheritdoc IACLManager + function addPoolAdmin(address admin) external override { + grantRole(POOL_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removePoolAdmin(address admin) external override { + revokeRole(POOL_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isPoolAdmin(address admin) external view override returns (bool) { + return hasRole(POOL_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function addEmergencyAdmin(address admin) external override { + grantRole(EMERGENCY_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removeEmergencyAdmin(address admin) external override { + revokeRole(EMERGENCY_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isEmergencyAdmin(address admin) external view override returns (bool) { + return hasRole(EMERGENCY_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function addRiskAdmin(address admin) external override { + grantRole(RISK_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removeRiskAdmin(address admin) external override { + revokeRole(RISK_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isRiskAdmin(address admin) external view override returns (bool) { + return hasRole(RISK_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function addFlashBorrower(address borrower) external override { + grantRole(FLASH_BORROWER_ROLE, borrower); + } + + /// @inheritdoc IACLManager + function removeFlashBorrower(address borrower) external override { + revokeRole(FLASH_BORROWER_ROLE, borrower); + } + + /// @inheritdoc IACLManager + function isFlashBorrower(address borrower) external view override returns (bool) { + return hasRole(FLASH_BORROWER_ROLE, borrower); + } + + /// @inheritdoc IACLManager + function addBridge(address bridge) external override { + grantRole(BRIDGE_ROLE, bridge); + } + + /// @inheritdoc IACLManager + function removeBridge(address bridge) external override { + revokeRole(BRIDGE_ROLE, bridge); + } + + /// @inheritdoc IACLManager + function isBridge(address bridge) external view override returns (bool) { + return hasRole(BRIDGE_ROLE, bridge); + } + + /// @inheritdoc IACLManager + function addAssetListingAdmin(address admin) external override { + grantRole(ASSET_LISTING_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function removeAssetListingAdmin(address admin) external override { + revokeRole(ASSET_LISTING_ADMIN_ROLE, admin); + } + + /// @inheritdoc IACLManager + function isAssetListingAdmin(address admin) external view override returns (bool) { + return hasRole(ASSET_LISTING_ADMIN_ROLE, admin); + } +} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/BORROW_LOGIC.sol b/downloads/LINEA/BORROW_LOGIC.sol new file mode 100644 index 00000000..9ef522e8 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC.sol @@ -0,0 +1,5817 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} + +// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol + +/** + * @title BorrowLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to borrowing + */ +library BorrowLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the + * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the + * isolated debt. + * @dev Emits the `Borrow()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the borrow function + */ + function executeBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteBorrowParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ( + bool isolationModeActive, + address isolationModeCollateralAddress, + uint256 isolationModeDebtCeiling + ) = userConfig.getIsolationModeState(reservesData, reservesList); + + ValidationLogic.validateBorrow( + reservesData, + reservesList, + eModeCategories, + DataTypes.ValidateBorrowParams({ + reserveCache: reserveCache, + userConfig: userConfig, + asset: params.asset, + userAddress: params.onBehalfOf, + amount: params.amount, + interestRateMode: params.interestRateMode, + reservesCount: params.reservesCount, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory, + priceOracleSentinel: params.priceOracleSentinel, + isolationModeActive: isolationModeActive, + isolationModeCollateralAddress: isolationModeCollateralAddress, + isolationModeDebtCeiling: isolationModeDebtCeiling + }) + ); + + bool isFirstBorrowing = false; + + (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); + + if (isFirstBorrowing) { + userConfig.setBorrowing(reserve.id, true); + } + + if (isolationModeActive) { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt += (params.amount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + 0, + params.releaseUnderlying ? params.amount : 0 + ); + + if (params.releaseUnderlying) { + IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); + } + + emit Borrow( + params.asset, + params.user, + params.onBehalfOf, + params.amount, + DataTypes.InterestRateMode.VARIABLE, + reserve.currentVariableBorrowRate, + params.referralCode + ); + } + + /** + * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the + * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also + * reduces the isolated debt. + * @dev Emits the `Repay()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the repay function + * @return The actual amount being repaid + */ + function executeRepay( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteRepayParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + + uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( + params.onBehalfOf + ); + + ValidationLogic.validateRepay( + reserveCache, + params.amount, + params.interestRateMode, + params.onBehalfOf, + variableDebt + ); + + uint256 paybackAmount = variableDebt; + + // Allows a user to repay with aTokens without leaving dust from interest. + if (params.useATokens && params.amount == type(uint256).max) { + params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); + } + + if (params.amount < paybackAmount) { + paybackAmount = params.amount; + } + + reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) + .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + params.useATokens ? 0 : paybackAmount, + 0 + ); + + if (variableDebt - paybackAmount == 0) { + userConfig.setBorrowing(reserve.id, false); + } + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + reserveCache, + paybackAmount + ); + + if (params.useATokens) { + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + reserveCache.aTokenAddress, + paybackAmount, + reserveCache.nextLiquidityIndex + ); + // in case of aToken repayment the msg.sender must always repay on behalf of itself + if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + } else { + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); + IAToken(reserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.onBehalfOf, + paybackAmount + ); + } + + emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); + + return paybackAmount; + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..e7ba8f7a --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol new file mode 100644 index 00000000..c4ed26ed --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {IsolationModeLogic} from './IsolationModeLogic.sol'; + +/** + * @title BorrowLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to borrowing + */ +library BorrowLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the + * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the + * isolated debt. + * @dev Emits the `Borrow()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the borrow function + */ + function executeBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteBorrowParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ( + bool isolationModeActive, + address isolationModeCollateralAddress, + uint256 isolationModeDebtCeiling + ) = userConfig.getIsolationModeState(reservesData, reservesList); + + ValidationLogic.validateBorrow( + reservesData, + reservesList, + eModeCategories, + DataTypes.ValidateBorrowParams({ + reserveCache: reserveCache, + userConfig: userConfig, + asset: params.asset, + userAddress: params.onBehalfOf, + amount: params.amount, + interestRateMode: params.interestRateMode, + reservesCount: params.reservesCount, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory, + priceOracleSentinel: params.priceOracleSentinel, + isolationModeActive: isolationModeActive, + isolationModeCollateralAddress: isolationModeCollateralAddress, + isolationModeDebtCeiling: isolationModeDebtCeiling + }) + ); + + bool isFirstBorrowing = false; + + (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); + + if (isFirstBorrowing) { + userConfig.setBorrowing(reserve.id, true); + } + + if (isolationModeActive) { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt += (params.amount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + 0, + params.releaseUnderlying ? params.amount : 0 + ); + + if (params.releaseUnderlying) { + IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); + } + + emit Borrow( + params.asset, + params.user, + params.onBehalfOf, + params.amount, + DataTypes.InterestRateMode.VARIABLE, + reserve.currentVariableBorrowRate, + params.referralCode + ); + } + + /** + * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the + * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also + * reduces the isolated debt. + * @dev Emits the `Repay()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the repay function + * @return The actual amount being repaid + */ + function executeRepay( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteRepayParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + + uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( + params.onBehalfOf + ); + + ValidationLogic.validateRepay( + reserveCache, + params.amount, + params.interestRateMode, + params.onBehalfOf, + variableDebt + ); + + uint256 paybackAmount = variableDebt; + + // Allows a user to repay with aTokens without leaving dust from interest. + if (params.useATokens && params.amount == type(uint256).max) { + params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); + } + + if (params.amount < paybackAmount) { + paybackAmount = params.amount; + } + + reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) + .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + params.useATokens ? 0 : paybackAmount, + 0 + ); + + if (variableDebt - paybackAmount == 0) { + userConfig.setBorrowing(reserve.id, false); + } + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + reserveCache, + paybackAmount + ); + + if (params.useATokens) { + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + reserveCache.aTokenAddress, + paybackAmount, + reserveCache.nextLiquidityIndex + ); + // in case of aToken repayment the msg.sender must always repay on behalf of itself + if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + } else { + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); + IAToken(reserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.onBehalfOf, + paybackAmount + ); + } + + emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); + + return paybackAmount; + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..647fc7e7 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..cd5b83c6 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol new file mode 100644 index 00000000..473840ea --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..dd5c637d --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..e08a30e8 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,642 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..9adca939 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC.sol b/downloads/LINEA/BRIDGE_LOGIC.sol new file mode 100644 index 00000000..ffa3a454 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC.sol @@ -0,0 +1,5673 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} + +// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol + +library BridgeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. + * @dev Essentially a supply without transferring the underlying. + * @dev Emits the `MintUnbacked` event + * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param asset The address of the underlying asset to mint aTokens of + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function executeMintUnbacked( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, reserve, amount, onBehalfOf); + + uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); + uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); + + uint256 unbacked = reserve.unbacked += amount.toUint128(); + + require( + unbacked <= unbackedMintCap * (10 ** reserveDecimals), + Errors.UNBACKED_MINT_CAP_EXCEEDED + ); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, 0, 0); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + onBehalfOf, + amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration, + reserveCache.aTokenAddress + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); + } + } + + emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); + } + + /** + * @notice Back the current unbacked with `amount` and pay `fee`. + * @dev It is not possible to back more than the existing unbacked amount of the reserve + * @dev Emits the `BackUnbacked` event + * @param reserve The reserve to back unbacked for + * @param asset The address of the underlying asset to repay + * @param amount The amount to back + * @param fee The amount paid in fees + * @param protocolFeeBps The fraction of fees in basis points paid to the protocol + * @return The backed amount + */ + function executeBackUnbacked( + DataTypes.ReserveData storage reserve, + address asset, + uint256 amount, + uint256 fee, + uint256 protocolFeeBps + ) external returns (uint256) { + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; + + uint256 feeToProtocol = fee.percentMul(protocolFeeBps); + uint256 feeToLP = fee - feeToProtocol; + uint256 added = backingAmount + fee; + + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply() + + uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), + feeToLP + ); + + reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + + reserve.unbacked -= backingAmount.toUint128(); + reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, added, 0); + + IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); + + emit BackUnbacked(asset, msg.sender, backingAmount, fee); + + return backingAmount; + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..e7ba8f7a --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol new file mode 100644 index 00000000..3b4d469b --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +library BridgeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. + * @dev Essentially a supply without transferring the underlying. + * @dev Emits the `MintUnbacked` event + * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param asset The address of the underlying asset to mint aTokens of + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function executeMintUnbacked( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, reserve, amount, onBehalfOf); + + uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); + uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); + + uint256 unbacked = reserve.unbacked += amount.toUint128(); + + require( + unbacked <= unbackedMintCap * (10 ** reserveDecimals), + Errors.UNBACKED_MINT_CAP_EXCEEDED + ); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, 0, 0); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + onBehalfOf, + amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration, + reserveCache.aTokenAddress + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); + } + } + + emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); + } + + /** + * @notice Back the current unbacked with `amount` and pay `fee`. + * @dev It is not possible to back more than the existing unbacked amount of the reserve + * @dev Emits the `BackUnbacked` event + * @param reserve The reserve to back unbacked for + * @param asset The address of the underlying asset to repay + * @param amount The amount to back + * @param fee The amount paid in fees + * @param protocolFeeBps The fraction of fees in basis points paid to the protocol + * @return The backed amount + */ + function executeBackUnbacked( + DataTypes.ReserveData storage reserve, + address asset, + uint256 amount, + uint256 fee, + uint256 protocolFeeBps + ) external returns (uint256) { + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; + + uint256 feeToProtocol = fee.percentMul(protocolFeeBps); + uint256 feeToLP = fee - feeToProtocol; + uint256 added = backingAmount + fee; + + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply() + + uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), + feeToLP + ); + + reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + + reserve.unbacked -= backingAmount.toUint128(); + reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, added, 0); + + IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); + + emit BackUnbacked(asset, msg.sender, backingAmount, fee); + + return backingAmount; + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..647fc7e7 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..cd5b83c6 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..dd5c637d --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..e08a30e8 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,642 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..9adca939 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/LINEA/COLLECTOR_IMPL.sol b/downloads/LINEA/COLLECTOR_IMPL.sol new file mode 100644 index 00000000..80c907f2 --- /dev/null +++ b/downloads/LINEA/COLLECTOR_IMPL.sol @@ -0,0 +1,1035 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/ReentrancyGuard.sol + +// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) + +/** + * @dev Contract module that helps prevent reentrant calls to a function. + * + * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier + * available, which can be applied to functions to make sure there are no nested + * (reentrant) calls to them. + * + * Note that because there is a single `nonReentrant` guard, functions marked as + * `nonReentrant` may not call one another. This can be worked around by making + * those functions `private`, and then adding `external` `nonReentrant` entry + * points to them. + * + * TIP: If you would like to learn more about reentrancy and alternative ways + * to protect against it, check out our blog post + * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. + */ +abstract contract ReentrancyGuard { + // Booleans are more expensive than uint256 or any type that takes up a full + // word because each write operation emits an extra SLOAD to first read the + // slot's contents, replace the bits taken up by the boolean, and then write + // back. This is the compiler's defense against contract upgrades and + // pointer aliasing, and it cannot be disabled. + + // The values being non-zero value makes deployment a bit more expensive, + // but in exchange the refund on every call to nonReentrant will be lower in + // amount. Since refunds are capped to a percentage of the total + // transaction's gas, it is best to keep them low in cases like this one, to + // increase the likelihood of the full refund coming into effect. + uint256 private constant _NOT_ENTERED = 1; + uint256 private constant _ENTERED = 2; + + uint256 private _status; + + constructor() { + _status = _NOT_ENTERED; + } + + /** + * @dev Prevents a contract from calling itself, directly or indirectly. + * Calling a `nonReentrant` function from another `nonReentrant` + * function is not supported. It is possible to prevent this from happening + * by making the `nonReentrant` function external, and making it call a + * `private` function that does the actual work. + */ + modifier nonReentrant() { + // On the first call to nonReentrant, _notEntered will be true + require(_status != _ENTERED, 'ReentrancyGuard: reentrant call'); + + // Any calls to nonReentrant after this point will fail + _status = _ENTERED; + + _; + + // By storing the original value once again, a refund is triggered (see + // https://eips.ethereum.org/EIPS/eip-2200) + _status = _NOT_ENTERED; + } + + /** + * @dev As we use the guard with the proxy we need to init it with the empty value + */ + function _initGuard() internal { + _status = _NOT_ENTERED; + } +} + +// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} + +// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/ICollector.sol + +interface ICollector { + struct Stream { + uint256 deposit; + uint256 ratePerSecond; + uint256 remainingBalance; + uint256 startTime; + uint256 stopTime; + address recipient; + address sender; + address tokenAddress; + bool isEntity; + } + + /** @notice Emitted when the funds admin changes + * @param fundsAdmin The new funds admin. + **/ + event NewFundsAdmin(address indexed fundsAdmin); + + /** @notice Emitted when the new stream is created + * @param streamId The identifier of the stream. + * @param sender The address of the collector. + * @param recipient The address towards which the money is streamed. + * @param deposit The amount of money to be streamed. + * @param tokenAddress The ERC20 token to use as streaming currency. + * @param startTime The unix timestamp for when the stream starts. + * @param stopTime The unix timestamp for when the stream stops. + **/ + event CreateStream( + uint256 indexed streamId, + address indexed sender, + address indexed recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime + ); + + /** + * @notice Emmitted when withdraw happens from the contract to the recipient's account. + * @param streamId The id of the stream to withdraw tokens from. + * @param recipient The address towards which the money is streamed. + * @param amount The amount of tokens to withdraw. + */ + event WithdrawFromStream(uint256 indexed streamId, address indexed recipient, uint256 amount); + + /** + * @notice Emmitted when the stream is canceled. + * @param streamId The id of the stream to withdraw tokens from. + * @param sender The address of the collector. + * @param recipient The address towards which the money is streamed. + * @param senderBalance The sender's balance at the moment of cancelling. + * @param recipientBalance The recipient's balance at the moment of cancelling. + */ + event CancelStream( + uint256 indexed streamId, + address indexed sender, + address indexed recipient, + uint256 senderBalance, + uint256 recipientBalance + ); + + /** @notice Returns the mock ETH reference address + * @return address The address + **/ + function ETH_MOCK_ADDRESS() external pure returns (address); + + /** @notice Initializes the contracts + * @param fundsAdmin Funds admin address + * @param nextStreamId StreamId to set, applied if greater than 0 + **/ + function initialize(address fundsAdmin, uint256 nextStreamId) external; + + /** + * @notice Return the funds admin, only entity to be able to interact with this contract (controller of reserve) + * @return address The address of the funds admin + **/ + function getFundsAdmin() external view returns (address); + + /** + * @notice Returns the available funds for the given stream id and address. + * @param streamId The id of the stream for which to query the balance. + * @param who The address for which to query the balance. + * @notice Returns the total funds allocated to `who` as uint256. + */ + function balanceOf(uint256 streamId, address who) external view returns (uint256 balance); + + /** + * @dev Function for the funds admin to give ERC20 allowance to other parties + * @param token The address of the token to give allowance from + * @param recipient Allowance's recipient + * @param amount Allowance to approve + **/ + function approve(IERC20 token, address recipient, uint256 amount) external; + + /** + * @notice Function for the funds admin to transfer ERC20 tokens to other parties + * @param token The address of the token to transfer + * @param recipient Transfer's recipient + * @param amount Amount to transfer + **/ + function transfer(IERC20 token, address recipient, uint256 amount) external; + + /** + * @dev Transfer the ownership of the funds administrator role. + This function should only be callable by the current funds administrator. + * @param admin The address of the new funds administrator + */ + function setFundsAdmin(address admin) external; + + /** + * @notice Creates a new stream funded by this contracts itself and paid towards `recipient`. + * @param recipient The address towards which the money is streamed. + * @param deposit The amount of money to be streamed. + * @param tokenAddress The ERC20 token to use as streaming currency. + * @param startTime The unix timestamp for when the stream starts. + * @param stopTime The unix timestamp for when the stream stops. + * @return streamId the uint256 id of the newly created stream. + */ + function createStream( + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime + ) external returns (uint256 streamId); + + /** + * @notice Returns the stream with all its properties. + * @dev Throws if the id does not point to a valid stream. + * @param streamId The id of the stream to query. + * @notice Returns the stream object. + */ + function getStream( + uint256 streamId + ) + external + view + returns ( + address sender, + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime, + uint256 remainingBalance, + uint256 ratePerSecond + ); + + /** + * @notice Withdraws from the contract to the recipient's account. + * @param streamId The id of the stream to withdraw tokens from. + * @param amount The amount of tokens to withdraw. + * @return bool Returns true if successful. + */ + function withdrawFromStream(uint256 streamId, uint256 amount) external returns (bool); + + /** + * @notice Cancels the stream and transfers the tokens back on a pro rata basis. + * @param streamId The id of the stream to cancel. + * @return bool Returns true if successful. + */ + function cancelStream(uint256 streamId) external returns (bool); + + /** + * @notice Returns the next available stream id + * @return nextStreamId Returns the stream id. + */ + function getNextStreamId() external view returns (uint256); +} + +// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/SafeERC20.sol + +// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) + +/** + * @title SafeERC20 + * @dev Wrappers around ERC20 operations that throw on failure (when the token + * contract returns false). Tokens that return no value (and instead revert or + * throw on failure) are also supported, non-reverting calls are assumed to be + * successful. + * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, + * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. + */ +library SafeERC20 { + using Address for address; + + function safeTransfer(IERC20 token, address to, uint256 value) internal { + _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); + } + + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + _callOptionalReturn( + token, + abi.encodeWithSelector(token.transferFrom.selector, from, to, value) + ); + } + + /** + * @dev Deprecated. This function has issues similar to the ones found in + * {IERC20-approve}, and its usage is discouraged. + * + * Whenever possible, use {safeIncreaseAllowance} and + * {safeDecreaseAllowance} instead. + */ + function safeApprove(IERC20 token, address spender, uint256 value) internal { + // safeApprove should only be called when setting an initial allowance, + // or when resetting it to zero. To increase and decrease it, use + // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' + require( + (value == 0) || (token.allowance(address(this), spender) == 0), + 'SafeERC20: approve from non-zero to non-zero allowance' + ); + _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); + } + + function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { + uint256 newAllowance = token.allowance(address(this), spender) + value; + _callOptionalReturn( + token, + abi.encodeWithSelector(token.approve.selector, spender, newAllowance) + ); + } + + function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { + unchecked { + uint256 oldAllowance = token.allowance(address(this), spender); + require(oldAllowance >= value, 'SafeERC20: decreased allowance below zero'); + uint256 newAllowance = oldAllowance - value; + _callOptionalReturn( + token, + abi.encodeWithSelector(token.approve.selector, spender, newAllowance) + ); + } + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + */ + function _callOptionalReturn(IERC20 token, bytes memory data) private { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that + // the target address contains contract code and also asserts for success in the low-level call. + + bytes memory returndata = address(token).functionCall(data, 'SafeERC20: low-level call failed'); + if (returndata.length > 0) { + // Return data is optional + require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed'); + } + } +} + +// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/Collector.sol + +/** + * @title Collector + * @notice Stores ERC20 tokens of an ecosystem reserve and allows to dispose of them via approval + * or transfer dynamics or streaming capabilities. + * Modification of Sablier https://github.com/sablierhq/sablier/blob/develop/packages/protocol/contracts/Sablier.sol + * Original can be found also deployed on https://etherscan.io/address/0xCD18eAa163733Da39c232722cBC4E8940b1D8888 + * Modifications: + * - Sablier "pulls" the funds from the creator of the stream at creation. In the Aave case, we already have the funds. + * - Anybody can create streams on Sablier. Here, only the funds admin (Aave governance via controller) can + * - Adapted codebase to Solidity 0.8.11, mainly removing SafeMath and CarefulMath to use native safe math + * - Same as with creation, on Sablier the `sender` and `recipient` can cancel a stream. Here, only fund admin and recipient + * @author BGD Labs + **/ +contract Collector is VersionedInitializable, ICollector, ReentrancyGuard { + using SafeERC20 for IERC20; + using Address for address payable; + + /*** Storage Properties ***/ + + /** + * @notice Address of the current funds admin. + */ + address internal _fundsAdmin; + + /** + * @notice Current revision of the contract. + */ + uint256 public constant REVISION = 5; + + /** + * @notice Counter for new stream ids. + */ + uint256 private _nextStreamId; + + /** + * @notice The stream objects identifiable by their unsigned integer ids. + */ + mapping(uint256 => Stream) private _streams; + + /// @inheritdoc ICollector + address public constant ETH_MOCK_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /*** Modifiers ***/ + + /** + * @dev Throws if the caller is not the funds admin. + */ + modifier onlyFundsAdmin() { + require(msg.sender == _fundsAdmin, 'ONLY_BY_FUNDS_ADMIN'); + _; + } + + /** + * @dev Throws if the caller is not the funds admin of the recipient of the stream. + * @param streamId The id of the stream to query. + */ + modifier onlyAdminOrRecipient(uint256 streamId) { + require( + msg.sender == _fundsAdmin || msg.sender == _streams[streamId].recipient, + 'caller is not the funds admin or the recipient of the stream' + ); + _; + } + + /** + * @dev Throws if the provided id does not point to a valid stream. + */ + modifier streamExists(uint256 streamId) { + require(_streams[streamId].isEntity, 'stream does not exist'); + _; + } + + /*** Contract Logic Starts Here */ + + /// @inheritdoc ICollector + function initialize(address fundsAdmin, uint256 nextStreamId) external initializer { + if (nextStreamId != 0) { + _nextStreamId = nextStreamId; + } + + _setFundsAdmin(fundsAdmin); + } + + /*** View Functions ***/ + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure override returns (uint256) { + return REVISION; + } + + /// @inheritdoc ICollector + function getFundsAdmin() external view returns (address) { + return _fundsAdmin; + } + + /// @inheritdoc ICollector + function getNextStreamId() external view returns (uint256) { + return _nextStreamId; + } + + /// @inheritdoc ICollector + function getStream( + uint256 streamId + ) + external + view + streamExists(streamId) + returns ( + address sender, + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime, + uint256 remainingBalance, + uint256 ratePerSecond + ) + { + sender = _streams[streamId].sender; + recipient = _streams[streamId].recipient; + deposit = _streams[streamId].deposit; + tokenAddress = _streams[streamId].tokenAddress; + startTime = _streams[streamId].startTime; + stopTime = _streams[streamId].stopTime; + remainingBalance = _streams[streamId].remainingBalance; + ratePerSecond = _streams[streamId].ratePerSecond; + } + + /** + * @notice Returns either the delta in seconds between `block.timestamp` and `startTime` or + * between `stopTime` and `startTime, whichever is smaller. If `block.timestamp` is before + * `startTime`, it returns 0. + * @dev Throws if the id does not point to a valid stream. + * @param streamId The id of the stream for which to query the delta. + * @notice Returns the time delta in seconds. + */ + function deltaOf(uint256 streamId) public view streamExists(streamId) returns (uint256 delta) { + Stream memory stream = _streams[streamId]; + if (block.timestamp <= stream.startTime) return 0; + if (block.timestamp < stream.stopTime) return block.timestamp - stream.startTime; + return stream.stopTime - stream.startTime; + } + + struct BalanceOfLocalVars { + uint256 recipientBalance; + uint256 withdrawalAmount; + uint256 senderBalance; + } + + /// @inheritdoc ICollector + function balanceOf( + uint256 streamId, + address who + ) public view streamExists(streamId) returns (uint256 balance) { + Stream memory stream = _streams[streamId]; + BalanceOfLocalVars memory vars; + + uint256 delta = deltaOf(streamId); + vars.recipientBalance = delta * stream.ratePerSecond; + + /* + * If the stream `balance` does not equal `deposit`, it means there have been withdrawals. + * We have to subtract the total amount withdrawn from the amount of money that has been + * streamed until now. + */ + if (stream.deposit > stream.remainingBalance) { + vars.withdrawalAmount = stream.deposit - stream.remainingBalance; + vars.recipientBalance = vars.recipientBalance - vars.withdrawalAmount; + } + + if (who == stream.recipient) return vars.recipientBalance; + if (who == stream.sender) { + vars.senderBalance = stream.remainingBalance - vars.recipientBalance; + return vars.senderBalance; + } + return 0; + } + + /*** Public Effects & Interactions Functions ***/ + + /// @inheritdoc ICollector + function approve(IERC20 token, address recipient, uint256 amount) external onlyFundsAdmin { + token.safeApprove(recipient, amount); + } + + /// @inheritdoc ICollector + function transfer(IERC20 token, address recipient, uint256 amount) external onlyFundsAdmin { + require(recipient != address(0), 'INVALID_0X_RECIPIENT'); + + if (address(token) == ETH_MOCK_ADDRESS) { + payable(recipient).sendValue(amount); + } else { + token.safeTransfer(recipient, amount); + } + } + + /// @inheritdoc ICollector + function setFundsAdmin(address admin) external onlyFundsAdmin { + _setFundsAdmin(admin); + } + + /** + * @dev Transfer the ownership of the funds administrator role. + * @param admin The address of the new funds administrator + */ + function _setFundsAdmin(address admin) internal { + _fundsAdmin = admin; + emit NewFundsAdmin(admin); + } + + struct CreateStreamLocalVars { + uint256 duration; + uint256 ratePerSecond; + } + + /// @inheritdoc ICollector + /** + * @dev Throws if the recipient is the zero address, the contract itself or the caller. + * Throws if the deposit is 0. + * Throws if the start time is before `block.timestamp`. + * Throws if the stop time is before the start time. + * Throws if the duration calculation has a math error. + * Throws if the deposit is smaller than the duration. + * Throws if the deposit is not a multiple of the duration. + * Throws if the rate calculation has a math error. + * Throws if the next stream id calculation has a math error. + * Throws if the contract is not allowed to transfer enough tokens. + * Throws if there is a token transfer failure. + */ + function createStream( + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime + ) external onlyFundsAdmin returns (uint256) { + require(recipient != address(0), 'stream to the zero address'); + require(recipient != address(this), 'stream to the contract itself'); + require(recipient != msg.sender, 'stream to the caller'); + require(deposit > 0, 'deposit is zero'); + require(startTime >= block.timestamp, 'start time before block.timestamp'); + require(stopTime > startTime, 'stop time before the start time'); + + CreateStreamLocalVars memory vars; + vars.duration = stopTime - startTime; + + /* Without this, the rate per second would be zero. */ + require(deposit >= vars.duration, 'deposit smaller than time delta'); + + /* This condition avoids dealing with remainders */ + require(deposit % vars.duration == 0, 'deposit not multiple of time delta'); + + vars.ratePerSecond = deposit / vars.duration; + + /* Create and store the stream object. */ + uint256 streamId = _nextStreamId; + _streams[streamId] = Stream({ + remainingBalance: deposit, + deposit: deposit, + isEntity: true, + ratePerSecond: vars.ratePerSecond, + recipient: recipient, + sender: address(this), + startTime: startTime, + stopTime: stopTime, + tokenAddress: tokenAddress + }); + + /* Increment the next stream id. */ + _nextStreamId++; + + emit CreateStream( + streamId, + address(this), + recipient, + deposit, + tokenAddress, + startTime, + stopTime + ); + return streamId; + } + + /// @inheritdoc ICollector + /** + * @dev Throws if the id does not point to a valid stream. + * Throws if the caller is not the funds admin or the recipient of the stream. + * Throws if the amount exceeds the available balance. + * Throws if there is a token transfer failure. + */ + function withdrawFromStream( + uint256 streamId, + uint256 amount + ) external nonReentrant streamExists(streamId) onlyAdminOrRecipient(streamId) returns (bool) { + require(amount > 0, 'amount is zero'); + Stream memory stream = _streams[streamId]; + + uint256 balance = balanceOf(streamId, stream.recipient); + require(balance >= amount, 'amount exceeds the available balance'); + + _streams[streamId].remainingBalance = stream.remainingBalance - amount; + + if (_streams[streamId].remainingBalance == 0) delete _streams[streamId]; + + IERC20(stream.tokenAddress).safeTransfer(stream.recipient, amount); + emit WithdrawFromStream(streamId, stream.recipient, amount); + return true; + } + + /// @inheritdoc ICollector + /** + * @dev Throws if the id does not point to a valid stream. + * Throws if the caller is not the funds admin or the recipient of the stream. + * Throws if there is a token transfer failure. + */ + function cancelStream( + uint256 streamId + ) external nonReentrant streamExists(streamId) onlyAdminOrRecipient(streamId) returns (bool) { + Stream memory stream = _streams[streamId]; + uint256 senderBalance = balanceOf(streamId, stream.sender); + uint256 recipientBalance = balanceOf(streamId, stream.recipient); + + delete _streams[streamId]; + + IERC20 token = IERC20(stream.tokenAddress); + if (recipientBalance > 0) token.safeTransfer(stream.recipient, recipientBalance); + + emit CancelStream(streamId, stream.sender, stream.recipient, senderBalance, recipientBalance); + return true; + } +} diff --git a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/ReentrancyGuard.sol b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/ReentrancyGuard.sol new file mode 100644 index 00000000..d8b54911 --- /dev/null +++ b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/ReentrancyGuard.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Contract module that helps prevent reentrant calls to a function. + * + * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier + * available, which can be applied to functions to make sure there are no nested + * (reentrant) calls to them. + * + * Note that because there is a single `nonReentrant` guard, functions marked as + * `nonReentrant` may not call one another. This can be worked around by making + * those functions `private`, and then adding `external` `nonReentrant` entry + * points to them. + * + * TIP: If you would like to learn more about reentrancy and alternative ways + * to protect against it, check out our blog post + * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. + */ +abstract contract ReentrancyGuard { + // Booleans are more expensive than uint256 or any type that takes up a full + // word because each write operation emits an extra SLOAD to first read the + // slot's contents, replace the bits taken up by the boolean, and then write + // back. This is the compiler's defense against contract upgrades and + // pointer aliasing, and it cannot be disabled. + + // The values being non-zero value makes deployment a bit more expensive, + // but in exchange the refund on every call to nonReentrant will be lower in + // amount. Since refunds are capped to a percentage of the total + // transaction's gas, it is best to keep them low in cases like this one, to + // increase the likelihood of the full refund coming into effect. + uint256 private constant _NOT_ENTERED = 1; + uint256 private constant _ENTERED = 2; + + uint256 private _status; + + constructor() { + _status = _NOT_ENTERED; + } + + /** + * @dev Prevents a contract from calling itself, directly or indirectly. + * Calling a `nonReentrant` function from another `nonReentrant` + * function is not supported. It is possible to prevent this from happening + * by making the `nonReentrant` function external, and making it call a + * `private` function that does the actual work. + */ + modifier nonReentrant() { + // On the first call to nonReentrant, _notEntered will be true + require(_status != _ENTERED, 'ReentrancyGuard: reentrant call'); + + // Any calls to nonReentrant after this point will fail + _status = _ENTERED; + + _; + + // By storing the original value once again, a refund is triggered (see + // https://eips.ethereum.org/EIPS/eip-2200) + _status = _NOT_ENTERED; + } + + /** + * @dev As we use the guard with the proxy we need to init it with the empty value + */ + function _initGuard() internal { + _status = _NOT_ENTERED; + } +} diff --git a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/SafeERC20.sol b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/SafeERC20.sol new file mode 100644 index 00000000..93db74c1 --- /dev/null +++ b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/SafeERC20.sol @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) + +pragma solidity ^0.8.0; + +import './IERC20.sol'; +import './Address.sol'; + +/** + * @title SafeERC20 + * @dev Wrappers around ERC20 operations that throw on failure (when the token + * contract returns false). Tokens that return no value (and instead revert or + * throw on failure) are also supported, non-reverting calls are assumed to be + * successful. + * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, + * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. + */ +library SafeERC20 { + using Address for address; + + function safeTransfer(IERC20 token, address to, uint256 value) internal { + _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); + } + + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + _callOptionalReturn( + token, + abi.encodeWithSelector(token.transferFrom.selector, from, to, value) + ); + } + + /** + * @dev Deprecated. This function has issues similar to the ones found in + * {IERC20-approve}, and its usage is discouraged. + * + * Whenever possible, use {safeIncreaseAllowance} and + * {safeDecreaseAllowance} instead. + */ + function safeApprove(IERC20 token, address spender, uint256 value) internal { + // safeApprove should only be called when setting an initial allowance, + // or when resetting it to zero. To increase and decrease it, use + // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' + require( + (value == 0) || (token.allowance(address(this), spender) == 0), + 'SafeERC20: approve from non-zero to non-zero allowance' + ); + _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); + } + + function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { + uint256 newAllowance = token.allowance(address(this), spender) + value; + _callOptionalReturn( + token, + abi.encodeWithSelector(token.approve.selector, spender, newAllowance) + ); + } + + function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { + unchecked { + uint256 oldAllowance = token.allowance(address(this), spender); + require(oldAllowance >= value, 'SafeERC20: decreased allowance below zero'); + uint256 newAllowance = oldAllowance - value; + _callOptionalReturn( + token, + abi.encodeWithSelector(token.approve.selector, spender, newAllowance) + ); + } + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + */ + function _callOptionalReturn(IERC20 token, bytes memory data) private { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that + // the target address contains contract code and also asserts for success in the low-level call. + + bytes memory returndata = address(token).functionCall(data, 'SafeERC20: low-level call failed'); + if (returndata.length > 0) { + // Return data is optional + require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed'); + } + } +} diff --git a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol new file mode 100644 index 00000000..1070227a --- /dev/null +++ b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} diff --git a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/Collector.sol b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/Collector.sol new file mode 100644 index 00000000..daf6b7a3 --- /dev/null +++ b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/Collector.sol @@ -0,0 +1,341 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {ICollector} from './ICollector.sol'; +import {ReentrancyGuard} from '../dependencies/openzeppelin/ReentrancyGuard.sol'; +import {VersionedInitializable} from '../misc/aave-upgradeability/VersionedInitializable.sol'; +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {SafeERC20} from '../dependencies/openzeppelin/contracts/SafeERC20.sol'; +import {Address} from '../dependencies/openzeppelin/contracts/Address.sol'; + +/** + * @title Collector + * @notice Stores ERC20 tokens of an ecosystem reserve and allows to dispose of them via approval + * or transfer dynamics or streaming capabilities. + * Modification of Sablier https://github.com/sablierhq/sablier/blob/develop/packages/protocol/contracts/Sablier.sol + * Original can be found also deployed on https://etherscan.io/address/0xCD18eAa163733Da39c232722cBC4E8940b1D8888 + * Modifications: + * - Sablier "pulls" the funds from the creator of the stream at creation. In the Aave case, we already have the funds. + * - Anybody can create streams on Sablier. Here, only the funds admin (Aave governance via controller) can + * - Adapted codebase to Solidity 0.8.11, mainly removing SafeMath and CarefulMath to use native safe math + * - Same as with creation, on Sablier the `sender` and `recipient` can cancel a stream. Here, only fund admin and recipient + * @author BGD Labs + **/ +contract Collector is VersionedInitializable, ICollector, ReentrancyGuard { + using SafeERC20 for IERC20; + using Address for address payable; + + /*** Storage Properties ***/ + + /** + * @notice Address of the current funds admin. + */ + address internal _fundsAdmin; + + /** + * @notice Current revision of the contract. + */ + uint256 public constant REVISION = 5; + + /** + * @notice Counter for new stream ids. + */ + uint256 private _nextStreamId; + + /** + * @notice The stream objects identifiable by their unsigned integer ids. + */ + mapping(uint256 => Stream) private _streams; + + /// @inheritdoc ICollector + address public constant ETH_MOCK_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /*** Modifiers ***/ + + /** + * @dev Throws if the caller is not the funds admin. + */ + modifier onlyFundsAdmin() { + require(msg.sender == _fundsAdmin, 'ONLY_BY_FUNDS_ADMIN'); + _; + } + + /** + * @dev Throws if the caller is not the funds admin of the recipient of the stream. + * @param streamId The id of the stream to query. + */ + modifier onlyAdminOrRecipient(uint256 streamId) { + require( + msg.sender == _fundsAdmin || msg.sender == _streams[streamId].recipient, + 'caller is not the funds admin or the recipient of the stream' + ); + _; + } + + /** + * @dev Throws if the provided id does not point to a valid stream. + */ + modifier streamExists(uint256 streamId) { + require(_streams[streamId].isEntity, 'stream does not exist'); + _; + } + + /*** Contract Logic Starts Here */ + + /// @inheritdoc ICollector + function initialize(address fundsAdmin, uint256 nextStreamId) external initializer { + if (nextStreamId != 0) { + _nextStreamId = nextStreamId; + } + + _setFundsAdmin(fundsAdmin); + } + + /*** View Functions ***/ + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure override returns (uint256) { + return REVISION; + } + + /// @inheritdoc ICollector + function getFundsAdmin() external view returns (address) { + return _fundsAdmin; + } + + /// @inheritdoc ICollector + function getNextStreamId() external view returns (uint256) { + return _nextStreamId; + } + + /// @inheritdoc ICollector + function getStream( + uint256 streamId + ) + external + view + streamExists(streamId) + returns ( + address sender, + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime, + uint256 remainingBalance, + uint256 ratePerSecond + ) + { + sender = _streams[streamId].sender; + recipient = _streams[streamId].recipient; + deposit = _streams[streamId].deposit; + tokenAddress = _streams[streamId].tokenAddress; + startTime = _streams[streamId].startTime; + stopTime = _streams[streamId].stopTime; + remainingBalance = _streams[streamId].remainingBalance; + ratePerSecond = _streams[streamId].ratePerSecond; + } + + /** + * @notice Returns either the delta in seconds between `block.timestamp` and `startTime` or + * between `stopTime` and `startTime, whichever is smaller. If `block.timestamp` is before + * `startTime`, it returns 0. + * @dev Throws if the id does not point to a valid stream. + * @param streamId The id of the stream for which to query the delta. + * @notice Returns the time delta in seconds. + */ + function deltaOf(uint256 streamId) public view streamExists(streamId) returns (uint256 delta) { + Stream memory stream = _streams[streamId]; + if (block.timestamp <= stream.startTime) return 0; + if (block.timestamp < stream.stopTime) return block.timestamp - stream.startTime; + return stream.stopTime - stream.startTime; + } + + struct BalanceOfLocalVars { + uint256 recipientBalance; + uint256 withdrawalAmount; + uint256 senderBalance; + } + + /// @inheritdoc ICollector + function balanceOf( + uint256 streamId, + address who + ) public view streamExists(streamId) returns (uint256 balance) { + Stream memory stream = _streams[streamId]; + BalanceOfLocalVars memory vars; + + uint256 delta = deltaOf(streamId); + vars.recipientBalance = delta * stream.ratePerSecond; + + /* + * If the stream `balance` does not equal `deposit`, it means there have been withdrawals. + * We have to subtract the total amount withdrawn from the amount of money that has been + * streamed until now. + */ + if (stream.deposit > stream.remainingBalance) { + vars.withdrawalAmount = stream.deposit - stream.remainingBalance; + vars.recipientBalance = vars.recipientBalance - vars.withdrawalAmount; + } + + if (who == stream.recipient) return vars.recipientBalance; + if (who == stream.sender) { + vars.senderBalance = stream.remainingBalance - vars.recipientBalance; + return vars.senderBalance; + } + return 0; + } + + /*** Public Effects & Interactions Functions ***/ + + /// @inheritdoc ICollector + function approve(IERC20 token, address recipient, uint256 amount) external onlyFundsAdmin { + token.safeApprove(recipient, amount); + } + + /// @inheritdoc ICollector + function transfer(IERC20 token, address recipient, uint256 amount) external onlyFundsAdmin { + require(recipient != address(0), 'INVALID_0X_RECIPIENT'); + + if (address(token) == ETH_MOCK_ADDRESS) { + payable(recipient).sendValue(amount); + } else { + token.safeTransfer(recipient, amount); + } + } + + /// @inheritdoc ICollector + function setFundsAdmin(address admin) external onlyFundsAdmin { + _setFundsAdmin(admin); + } + + /** + * @dev Transfer the ownership of the funds administrator role. + * @param admin The address of the new funds administrator + */ + function _setFundsAdmin(address admin) internal { + _fundsAdmin = admin; + emit NewFundsAdmin(admin); + } + + struct CreateStreamLocalVars { + uint256 duration; + uint256 ratePerSecond; + } + + /// @inheritdoc ICollector + /** + * @dev Throws if the recipient is the zero address, the contract itself or the caller. + * Throws if the deposit is 0. + * Throws if the start time is before `block.timestamp`. + * Throws if the stop time is before the start time. + * Throws if the duration calculation has a math error. + * Throws if the deposit is smaller than the duration. + * Throws if the deposit is not a multiple of the duration. + * Throws if the rate calculation has a math error. + * Throws if the next stream id calculation has a math error. + * Throws if the contract is not allowed to transfer enough tokens. + * Throws if there is a token transfer failure. + */ + function createStream( + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime + ) external onlyFundsAdmin returns (uint256) { + require(recipient != address(0), 'stream to the zero address'); + require(recipient != address(this), 'stream to the contract itself'); + require(recipient != msg.sender, 'stream to the caller'); + require(deposit > 0, 'deposit is zero'); + require(startTime >= block.timestamp, 'start time before block.timestamp'); + require(stopTime > startTime, 'stop time before the start time'); + + CreateStreamLocalVars memory vars; + vars.duration = stopTime - startTime; + + /* Without this, the rate per second would be zero. */ + require(deposit >= vars.duration, 'deposit smaller than time delta'); + + /* This condition avoids dealing with remainders */ + require(deposit % vars.duration == 0, 'deposit not multiple of time delta'); + + vars.ratePerSecond = deposit / vars.duration; + + /* Create and store the stream object. */ + uint256 streamId = _nextStreamId; + _streams[streamId] = Stream({ + remainingBalance: deposit, + deposit: deposit, + isEntity: true, + ratePerSecond: vars.ratePerSecond, + recipient: recipient, + sender: address(this), + startTime: startTime, + stopTime: stopTime, + tokenAddress: tokenAddress + }); + + /* Increment the next stream id. */ + _nextStreamId++; + + emit CreateStream( + streamId, + address(this), + recipient, + deposit, + tokenAddress, + startTime, + stopTime + ); + return streamId; + } + + /// @inheritdoc ICollector + /** + * @dev Throws if the id does not point to a valid stream. + * Throws if the caller is not the funds admin or the recipient of the stream. + * Throws if the amount exceeds the available balance. + * Throws if there is a token transfer failure. + */ + function withdrawFromStream( + uint256 streamId, + uint256 amount + ) external nonReentrant streamExists(streamId) onlyAdminOrRecipient(streamId) returns (bool) { + require(amount > 0, 'amount is zero'); + Stream memory stream = _streams[streamId]; + + uint256 balance = balanceOf(streamId, stream.recipient); + require(balance >= amount, 'amount exceeds the available balance'); + + _streams[streamId].remainingBalance = stream.remainingBalance - amount; + + if (_streams[streamId].remainingBalance == 0) delete _streams[streamId]; + + IERC20(stream.tokenAddress).safeTransfer(stream.recipient, amount); + emit WithdrawFromStream(streamId, stream.recipient, amount); + return true; + } + + /// @inheritdoc ICollector + /** + * @dev Throws if the id does not point to a valid stream. + * Throws if the caller is not the funds admin or the recipient of the stream. + * Throws if there is a token transfer failure. + */ + function cancelStream( + uint256 streamId + ) external nonReentrant streamExists(streamId) onlyAdminOrRecipient(streamId) returns (bool) { + Stream memory stream = _streams[streamId]; + uint256 senderBalance = balanceOf(streamId, stream.sender); + uint256 recipientBalance = balanceOf(streamId, stream.recipient); + + delete _streams[streamId]; + + IERC20 token = IERC20(stream.tokenAddress); + if (recipientBalance > 0) token.safeTransfer(stream.recipient, recipientBalance); + + emit CancelStream(streamId, stream.sender, stream.recipient, senderBalance, recipientBalance); + return true; + } +} diff --git a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/ICollector.sol b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/ICollector.sol new file mode 100644 index 00000000..94103d48 --- /dev/null +++ b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/ICollector.sol @@ -0,0 +1,174 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; + +interface ICollector { + struct Stream { + uint256 deposit; + uint256 ratePerSecond; + uint256 remainingBalance; + uint256 startTime; + uint256 stopTime; + address recipient; + address sender; + address tokenAddress; + bool isEntity; + } + + /** @notice Emitted when the funds admin changes + * @param fundsAdmin The new funds admin. + **/ + event NewFundsAdmin(address indexed fundsAdmin); + + /** @notice Emitted when the new stream is created + * @param streamId The identifier of the stream. + * @param sender The address of the collector. + * @param recipient The address towards which the money is streamed. + * @param deposit The amount of money to be streamed. + * @param tokenAddress The ERC20 token to use as streaming currency. + * @param startTime The unix timestamp for when the stream starts. + * @param stopTime The unix timestamp for when the stream stops. + **/ + event CreateStream( + uint256 indexed streamId, + address indexed sender, + address indexed recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime + ); + + /** + * @notice Emmitted when withdraw happens from the contract to the recipient's account. + * @param streamId The id of the stream to withdraw tokens from. + * @param recipient The address towards which the money is streamed. + * @param amount The amount of tokens to withdraw. + */ + event WithdrawFromStream(uint256 indexed streamId, address indexed recipient, uint256 amount); + + /** + * @notice Emmitted when the stream is canceled. + * @param streamId The id of the stream to withdraw tokens from. + * @param sender The address of the collector. + * @param recipient The address towards which the money is streamed. + * @param senderBalance The sender's balance at the moment of cancelling. + * @param recipientBalance The recipient's balance at the moment of cancelling. + */ + event CancelStream( + uint256 indexed streamId, + address indexed sender, + address indexed recipient, + uint256 senderBalance, + uint256 recipientBalance + ); + + /** @notice Returns the mock ETH reference address + * @return address The address + **/ + function ETH_MOCK_ADDRESS() external pure returns (address); + + /** @notice Initializes the contracts + * @param fundsAdmin Funds admin address + * @param nextStreamId StreamId to set, applied if greater than 0 + **/ + function initialize(address fundsAdmin, uint256 nextStreamId) external; + + /** + * @notice Return the funds admin, only entity to be able to interact with this contract (controller of reserve) + * @return address The address of the funds admin + **/ + function getFundsAdmin() external view returns (address); + + /** + * @notice Returns the available funds for the given stream id and address. + * @param streamId The id of the stream for which to query the balance. + * @param who The address for which to query the balance. + * @notice Returns the total funds allocated to `who` as uint256. + */ + function balanceOf(uint256 streamId, address who) external view returns (uint256 balance); + + /** + * @dev Function for the funds admin to give ERC20 allowance to other parties + * @param token The address of the token to give allowance from + * @param recipient Allowance's recipient + * @param amount Allowance to approve + **/ + function approve(IERC20 token, address recipient, uint256 amount) external; + + /** + * @notice Function for the funds admin to transfer ERC20 tokens to other parties + * @param token The address of the token to transfer + * @param recipient Transfer's recipient + * @param amount Amount to transfer + **/ + function transfer(IERC20 token, address recipient, uint256 amount) external; + + /** + * @dev Transfer the ownership of the funds administrator role. + This function should only be callable by the current funds administrator. + * @param admin The address of the new funds administrator + */ + function setFundsAdmin(address admin) external; + + /** + * @notice Creates a new stream funded by this contracts itself and paid towards `recipient`. + * @param recipient The address towards which the money is streamed. + * @param deposit The amount of money to be streamed. + * @param tokenAddress The ERC20 token to use as streaming currency. + * @param startTime The unix timestamp for when the stream starts. + * @param stopTime The unix timestamp for when the stream stops. + * @return streamId the uint256 id of the newly created stream. + */ + function createStream( + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime + ) external returns (uint256 streamId); + + /** + * @notice Returns the stream with all its properties. + * @dev Throws if the id does not point to a valid stream. + * @param streamId The id of the stream to query. + * @notice Returns the stream object. + */ + function getStream( + uint256 streamId + ) + external + view + returns ( + address sender, + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime, + uint256 remainingBalance, + uint256 ratePerSecond + ); + + /** + * @notice Withdraws from the contract to the recipient's account. + * @param streamId The id of the stream to withdraw tokens from. + * @param amount The amount of tokens to withdraw. + * @return bool Returns true if successful. + */ + function withdrawFromStream(uint256 streamId, uint256 amount) external returns (bool); + + /** + * @notice Cancels the stream and transfers the tokens back on a pro rata basis. + * @param streamId The id of the stream to cancel. + * @return bool Returns true if successful. + */ + function cancelStream(uint256 streamId) external returns (bool); + + /** + * @notice Returns the next available stream id + * @return nextStreamId Returns the stream id. + */ + function getNextStreamId() external view returns (uint256); +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC.sol b/downloads/LINEA/CONFIGURATOR_LOGIC.sol new file mode 100644 index 00000000..22e067d6 --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC.sol @@ -0,0 +1,3052 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol + +/** + * @title Proxy + * @dev Implements delegation of calls to other contracts, with proper + * forwarding of return values and bubbling of failures. + * It defines a fallback function that delegates all calls to the address + * returned by the abstract _implementation() internal function. + */ +abstract contract Proxy { + /** + * @dev Fallback function. + * Will run if no other function in the contract matches the call data. + * Implemented entirely in `_fallback`. + */ + fallback() external payable { + _fallback(); + } + + /** + * @dev Fallback function that will run if call data is empty. + * IMPORTANT. receive() on implementation contracts will be unreachable + */ + receive() external payable { + _fallback(); + } + + /** + * @return The Address of the implementation. + */ + function _implementation() internal view virtual returns (address); + + /** + * @dev Delegates execution to an implementation contract. + * This is a low level function that doesn't return to its internal call site. + * It will return to the external caller whatever the implementation returns. + * @param implementation Address to delegate. + */ + function _delegate(address implementation) internal { + //solium-disable-next-line + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + /** + * @dev Function that is run as the first thing in the fallback function. + * Can be redefined in derived contracts to add functionality. + * Redefinitions must call super._willFallback(). + */ + function _willFallback() internal virtual {} + + /** + * @dev fallback implementation. + * Extracted to enable manual triggering. + */ + function _fallback() internal { + _willFallback(); + _delegate(_implementation()); + } +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol + +library ConfiguratorInputTypes { + struct InitReserveInput { + address aTokenImpl; + address variableDebtTokenImpl; + bool useVirtualBalance; + address interestRateStrategyAddress; + address underlyingAsset; + address treasury; + address incentivesController; + string aTokenName; + string aTokenSymbol; + string variableDebtTokenName; + string variableDebtTokenSymbol; + bytes params; + bytes interestRateData; + } + + struct UpdateATokenInput { + address asset; + address treasury; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } + + struct UpdateDebtTokenInput { + address asset; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol + +/** + * @title BaseUpgradeabilityProxy + * @dev This contract implements a proxy that allows to change the + * implementation address to which it will delegate. + * Such a change is called an implementation upgrade. + */ +contract BaseUpgradeabilityProxy is Proxy { + /** + * @dev Emitted when the implementation is upgraded. + * @param implementation Address of the new implementation. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Storage slot with the address of the current implementation. + * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is + * validated in the constructor. + */ + bytes32 internal constant IMPLEMENTATION_SLOT = + 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + /** + * @dev Returns the current implementation. + * @return impl Address of the current implementation + */ + function _implementation() internal view override returns (address impl) { + bytes32 slot = IMPLEMENTATION_SLOT; + //solium-disable-next-line + assembly { + impl := sload(slot) + } + } + + /** + * @dev Upgrades the proxy to a new implementation. + * @param newImplementation Address of the new implementation. + */ + function _upgradeTo(address newImplementation) internal { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + } + + /** + * @dev Sets the implementation address of the proxy. + * @param newImplementation Address of the new implementation. + */ + function _setImplementation(address newImplementation) internal { + require( + Address.isContract(newImplementation), + 'Cannot set a proxy implementation to a non-contract address' + ); + + bytes32 slot = IMPLEMENTATION_SLOT; + + //solium-disable-next-line + assembly { + sstore(slot, newImplementation) + } + } +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol + +/** + * @title InitializableUpgradeabilityProxy + * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing + * implementation and init data. + */ +contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { + /** + * @dev Contract initializer. + * @param _logic Address of the initial implementation. + * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. + */ + function initialize(address _logic, bytes memory _data) public payable { + require(_implementation() == address(0)); + assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); + _setImplementation(_logic); + if (_data.length > 0) { + (bool success, ) = _logic.delegatecall(_data); + require(success); + } + } +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol + +/** + * @title BaseImmutableAdminUpgradeabilityProxy + * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern + * @notice This contract combines an upgradeability proxy with an authorization + * mechanism for administrative tasks. + * @dev The admin role is stored in an immutable, which helps saving transactions costs + * All external functions in this contract must be guarded by the + * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity + * feature proposal that would enable this to be done automatically. + */ +contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + address internal immutable _admin; + + /** + * @dev Constructor. + * @param admin_ The address of the admin + */ + constructor(address admin_) { + _admin = admin_; + } + + modifier ifAdmin() { + if (msg.sender == _admin) { + _; + } else { + _fallback(); + } + } + + /** + * @notice Return the admin address + * @return The address of the proxy admin. + */ + function admin() external ifAdmin returns (address) { + return _admin; + } + + /** + * @notice Return the implementation address + * @return The address of the implementation. + */ + function implementation() external ifAdmin returns (address) { + return _implementation(); + } + + /** + * @notice Upgrade the backing implementation of the proxy. + * @dev Only the admin can call this function. + * @param newImplementation The address of the new implementation. + */ + function upgradeTo(address newImplementation) external ifAdmin { + _upgradeTo(newImplementation); + } + + /** + * @notice Upgrade the backing implementation of the proxy and call a function + * on the new implementation. + * @dev This is useful to initialize the proxied contract. + * @param newImplementation The address of the new implementation. + * @param data Data to send as msg.data in the low level call. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + */ + function upgradeToAndCall( + address newImplementation, + bytes calldata data + ) external payable ifAdmin { + _upgradeTo(newImplementation); + (bool success, ) = newImplementation.delegatecall(data); + require(success); + } + + /** + * @notice Only fall back when the sender is not the admin. + */ + function _willFallback() internal virtual override { + require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); + super._willFallback(); + } +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol + +/** + * @title InitializableAdminUpgradeabilityProxy + * @author Aave + * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function + */ +contract InitializableImmutableAdminUpgradeabilityProxy is + BaseImmutableAdminUpgradeabilityProxy, + InitializableUpgradeabilityProxy +{ + /** + * @dev Constructor. + * @param admin The address of the admin + */ + constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { + // Intentionally left blank + } + + /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy + function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { + BaseImmutableAdminUpgradeabilityProxy._willFallback(); + } +} + +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol + +/** + * @title ConfiguratorLogic library + * @author Aave + * @notice Implements the functions to initialize reserves and update aTokens and debtTokens + */ +library ConfiguratorLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPoolConfigurator` for descriptions + event ReserveInitialized( + address indexed asset, + address indexed aToken, + address stableDebtToken, + address variableDebtToken, + address interestRateStrategyAddress + ); + event ATokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + event VariableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @notice Initialize a reserve by creating and initializing aToken and variable debt token + * @dev Emits the `ReserveInitialized` event + * @param pool The Pool in which the reserve will be initialized + * @param input The needed parameters for the initialization + */ + function executeInitReserve( + IPool pool, + ConfiguratorInputTypes.InitReserveInput calldata input + ) external { + // It is an assumption that the asset listed is non-malicious, and the external call doesn't create re-entrancies + uint8 underlyingAssetDecimals = IERC20Detailed(input.underlyingAsset).decimals(); + require(underlyingAssetDecimals > 5, Errors.INVALID_DECIMALS); + + address aTokenProxyAddress = _initTokenWithProxy( + input.aTokenImpl, + abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + pool, + input.treasury, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.aTokenName, + input.aTokenSymbol, + input.params + ) + ); + + address variableDebtTokenProxyAddress = _initTokenWithProxy( + input.variableDebtTokenImpl, + abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + pool, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.variableDebtTokenName, + input.variableDebtTokenSymbol, + input.params + ) + ); + + pool.initReserve( + input.underlyingAsset, + aTokenProxyAddress, + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + + DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); + + currentConfig.setDecimals(underlyingAssetDecimals); + + currentConfig.setActive(true); + currentConfig.setPaused(false); + currentConfig.setFrozen(false); + currentConfig.setVirtualAccActive(input.useVirtualBalance); + + pool.setConfiguration(input.underlyingAsset, currentConfig); + + IReserveInterestRateStrategy(input.interestRateStrategyAddress).setInterestRateParams( + input.underlyingAsset, + input.interestRateData + ); + + emit ReserveInitialized( + input.underlyingAsset, + aTokenProxyAddress, + address(0), + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + } + + /** + * @notice Updates the aToken implementation and initializes it + * @dev Emits the `ATokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the aToken + * @param input The parameters needed for the initialize call + */ + function executeUpdateAToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateATokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + cachedPool, + input.treasury, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); + + emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); + } + + /** + * @notice Updates the variable debt token implementation and initializes it + * @dev Emits the `VariableDebtTokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the variable debt token + * @param input The parameters needed for the initialize call + */ + function executeUpdateVariableDebtToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + cachedPool, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation( + reserveData.variableDebtTokenAddress, + input.implementation, + encodedCall + ); + + emit VariableDebtTokenUpgraded( + input.asset, + reserveData.variableDebtTokenAddress, + input.implementation + ); + } + + /** + * @notice Creates a new proxy and initializes the implementation + * @param implementation The address of the implementation + * @param initParams The parameters that is passed to the implementation to initialize + * @return The address of initialized proxy + */ + function _initTokenWithProxy( + address implementation, + bytes memory initParams + ) internal returns (address) { + InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( + address(this) + ); + + proxy.initialize(implementation, initParams); + + return address(proxy); + } + + /** + * @notice Upgrades the implementation and makes call to the proxy + * @dev The call is used to initialize the new implementation. + * @param proxyAddress The address of the proxy + * @param implementation The address of the new implementation + * @param initParams The parameters to the call after the upgrade + */ + function _upgradeTokenImplementation( + address proxyAddress, + address implementation, + bytes memory initParams + ) internal { + InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( + payable(proxyAddress) + ); + + proxy.upgradeToAndCall(implementation, initParams); + } +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol new file mode 100644 index 00000000..aec817cb --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import './Proxy.sol'; +import '../contracts/Address.sol'; + +/** + * @title BaseUpgradeabilityProxy + * @dev This contract implements a proxy that allows to change the + * implementation address to which it will delegate. + * Such a change is called an implementation upgrade. + */ +contract BaseUpgradeabilityProxy is Proxy { + /** + * @dev Emitted when the implementation is upgraded. + * @param implementation Address of the new implementation. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Storage slot with the address of the current implementation. + * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is + * validated in the constructor. + */ + bytes32 internal constant IMPLEMENTATION_SLOT = + 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + /** + * @dev Returns the current implementation. + * @return impl Address of the current implementation + */ + function _implementation() internal view override returns (address impl) { + bytes32 slot = IMPLEMENTATION_SLOT; + //solium-disable-next-line + assembly { + impl := sload(slot) + } + } + + /** + * @dev Upgrades the proxy to a new implementation. + * @param newImplementation Address of the new implementation. + */ + function _upgradeTo(address newImplementation) internal { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + } + + /** + * @dev Sets the implementation address of the proxy. + * @param newImplementation Address of the new implementation. + */ + function _setImplementation(address newImplementation) internal { + require( + Address.isContract(newImplementation), + 'Cannot set a proxy implementation to a non-contract address' + ); + + bytes32 slot = IMPLEMENTATION_SLOT; + + //solium-disable-next-line + assembly { + sstore(slot, newImplementation) + } + } +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol new file mode 100644 index 00000000..4b43fa6a --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import './BaseUpgradeabilityProxy.sol'; + +/** + * @title InitializableUpgradeabilityProxy + * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing + * implementation and init data. + */ +contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { + /** + * @dev Contract initializer. + * @param _logic Address of the initial implementation. + * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. + */ + function initialize(address _logic, bytes memory _data) public payable { + require(_implementation() == address(0)); + assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); + _setImplementation(_logic); + if (_data.length > 0) { + (bool success, ) = _logic.delegatecall(_data); + require(success); + } + } +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol new file mode 100644 index 00000000..53589441 --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title Proxy + * @dev Implements delegation of calls to other contracts, with proper + * forwarding of return values and bubbling of failures. + * It defines a fallback function that delegates all calls to the address + * returned by the abstract _implementation() internal function. + */ +abstract contract Proxy { + /** + * @dev Fallback function. + * Will run if no other function in the contract matches the call data. + * Implemented entirely in `_fallback`. + */ + fallback() external payable { + _fallback(); + } + + /** + * @dev Fallback function that will run if call data is empty. + * IMPORTANT. receive() on implementation contracts will be unreachable + */ + receive() external payable { + _fallback(); + } + + /** + * @return The Address of the implementation. + */ + function _implementation() internal view virtual returns (address); + + /** + * @dev Delegates execution to an implementation contract. + * This is a low level function that doesn't return to its internal call site. + * It will return to the external caller whatever the implementation returns. + * @param implementation Address to delegate. + */ + function _delegate(address implementation) internal { + //solium-disable-next-line + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + /** + * @dev Function that is run as the first thing in the fallback function. + * Can be redefined in derived contracts to add functionality. + * Redefinitions must call super._willFallback(). + */ + function _willFallback() internal virtual {} + + /** + * @dev fallback implementation. + * Extracted to enable manual triggering. + */ + function _fallback() internal { + _willFallback(); + _delegate(_implementation()); + } +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPool.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..252b4a4b --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {BaseUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol'; + +/** + * @title BaseImmutableAdminUpgradeabilityProxy + * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern + * @notice This contract combines an upgradeability proxy with an authorization + * mechanism for administrative tasks. + * @dev The admin role is stored in an immutable, which helps saving transactions costs + * All external functions in this contract must be guarded by the + * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity + * feature proposal that would enable this to be done automatically. + */ +contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + address internal immutable _admin; + + /** + * @dev Constructor. + * @param admin_ The address of the admin + */ + constructor(address admin_) { + _admin = admin_; + } + + modifier ifAdmin() { + if (msg.sender == _admin) { + _; + } else { + _fallback(); + } + } + + /** + * @notice Return the admin address + * @return The address of the proxy admin. + */ + function admin() external ifAdmin returns (address) { + return _admin; + } + + /** + * @notice Return the implementation address + * @return The address of the implementation. + */ + function implementation() external ifAdmin returns (address) { + return _implementation(); + } + + /** + * @notice Upgrade the backing implementation of the proxy. + * @dev Only the admin can call this function. + * @param newImplementation The address of the new implementation. + */ + function upgradeTo(address newImplementation) external ifAdmin { + _upgradeTo(newImplementation); + } + + /** + * @notice Upgrade the backing implementation of the proxy and call a function + * on the new implementation. + * @dev This is useful to initialize the proxied contract. + * @param newImplementation The address of the new implementation. + * @param data Data to send as msg.data in the low level call. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + */ + function upgradeToAndCall( + address newImplementation, + bytes calldata data + ) external payable ifAdmin { + _upgradeTo(newImplementation); + (bool success, ) = newImplementation.delegatecall(data); + require(success); + } + + /** + * @notice Only fall back when the sender is not the admin. + */ + function _willFallback() internal virtual override { + require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); + super._willFallback(); + } +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..6913a19d --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {InitializableUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol'; +import {Proxy} from '../../dependencies/openzeppelin/upgradeability/Proxy.sol'; +import {BaseImmutableAdminUpgradeabilityProxy} from './BaseImmutableAdminUpgradeabilityProxy.sol'; + +/** + * @title InitializableAdminUpgradeabilityProxy + * @author Aave + * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function + */ +contract InitializableImmutableAdminUpgradeabilityProxy is + BaseImmutableAdminUpgradeabilityProxy, + InitializableUpgradeabilityProxy +{ + /** + * @dev Constructor. + * @param admin The address of the admin + */ + constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { + // Intentionally left blank + } + + /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy + function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { + BaseImmutableAdminUpgradeabilityProxy._willFallback(); + } +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol new file mode 100644 index 00000000..c6b08dcc --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol @@ -0,0 +1,223 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IPool} from '../../../interfaces/IPool.sol'; +import {IInitializableAToken} from '../../../interfaces/IInitializableAToken.sol'; +import {IInitializableDebtToken} from '../../../interfaces/IInitializableDebtToken.sol'; +import {InitializableImmutableAdminUpgradeabilityProxy} from '../../../misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {ConfiguratorInputTypes} from '../types/ConfiguratorInputTypes.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; + +/** + * @title ConfiguratorLogic library + * @author Aave + * @notice Implements the functions to initialize reserves and update aTokens and debtTokens + */ +library ConfiguratorLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPoolConfigurator` for descriptions + event ReserveInitialized( + address indexed asset, + address indexed aToken, + address stableDebtToken, + address variableDebtToken, + address interestRateStrategyAddress + ); + event ATokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + event VariableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @notice Initialize a reserve by creating and initializing aToken and variable debt token + * @dev Emits the `ReserveInitialized` event + * @param pool The Pool in which the reserve will be initialized + * @param input The needed parameters for the initialization + */ + function executeInitReserve( + IPool pool, + ConfiguratorInputTypes.InitReserveInput calldata input + ) external { + // It is an assumption that the asset listed is non-malicious, and the external call doesn't create re-entrancies + uint8 underlyingAssetDecimals = IERC20Detailed(input.underlyingAsset).decimals(); + require(underlyingAssetDecimals > 5, Errors.INVALID_DECIMALS); + + address aTokenProxyAddress = _initTokenWithProxy( + input.aTokenImpl, + abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + pool, + input.treasury, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.aTokenName, + input.aTokenSymbol, + input.params + ) + ); + + address variableDebtTokenProxyAddress = _initTokenWithProxy( + input.variableDebtTokenImpl, + abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + pool, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.variableDebtTokenName, + input.variableDebtTokenSymbol, + input.params + ) + ); + + pool.initReserve( + input.underlyingAsset, + aTokenProxyAddress, + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + + DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); + + currentConfig.setDecimals(underlyingAssetDecimals); + + currentConfig.setActive(true); + currentConfig.setPaused(false); + currentConfig.setFrozen(false); + currentConfig.setVirtualAccActive(input.useVirtualBalance); + + pool.setConfiguration(input.underlyingAsset, currentConfig); + + IReserveInterestRateStrategy(input.interestRateStrategyAddress).setInterestRateParams( + input.underlyingAsset, + input.interestRateData + ); + + emit ReserveInitialized( + input.underlyingAsset, + aTokenProxyAddress, + address(0), + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + } + + /** + * @notice Updates the aToken implementation and initializes it + * @dev Emits the `ATokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the aToken + * @param input The parameters needed for the initialize call + */ + function executeUpdateAToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateATokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + cachedPool, + input.treasury, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); + + emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); + } + + /** + * @notice Updates the variable debt token implementation and initializes it + * @dev Emits the `VariableDebtTokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the variable debt token + * @param input The parameters needed for the initialize call + */ + function executeUpdateVariableDebtToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + cachedPool, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation( + reserveData.variableDebtTokenAddress, + input.implementation, + encodedCall + ); + + emit VariableDebtTokenUpgraded( + input.asset, + reserveData.variableDebtTokenAddress, + input.implementation + ); + } + + /** + * @notice Creates a new proxy and initializes the implementation + * @param implementation The address of the implementation + * @param initParams The parameters that is passed to the implementation to initialize + * @return The address of initialized proxy + */ + function _initTokenWithProxy( + address implementation, + bytes memory initParams + ) internal returns (address) { + InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( + address(this) + ); + + proxy.initialize(implementation, initParams); + + return address(proxy); + } + + /** + * @notice Upgrades the implementation and makes call to the proxy + * @dev The call is used to initialize the new implementation. + * @param proxyAddress The address of the proxy + * @param implementation The address of the new implementation + * @param initParams The parameters to the call after the upgrade + */ + function _upgradeTokenImplementation( + address proxyAddress, + address implementation, + bytes memory initParams + ) internal { + InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( + payable(proxyAddress) + ); + + proxy.upgradeToAndCall(implementation, initParams); + } +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol new file mode 100644 index 00000000..7894871b --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library ConfiguratorInputTypes { + struct InitReserveInput { + address aTokenImpl; + address variableDebtTokenImpl; + bool useVirtualBalance; + address interestRateStrategyAddress; + address underlyingAsset; + address treasury; + address incentivesController; + string aTokenName; + string aTokenSymbol; + string variableDebtTokenName; + string variableDebtTokenSymbol; + bytes params; + bytes interestRateData; + } + + struct UpdateATokenInput { + address asset; + address treasury; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } + + struct UpdateDebtTokenInput { + address asset; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } +} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL.sol new file mode 100644 index 00000000..fd9dc668 --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL.sol @@ -0,0 +1,3383 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol + +/** + * @title EIP712Base + * @author Aave + * @notice Base contract implementation of EIP712. + */ +abstract contract EIP712Base { + bytes public constant EIP712_REVISION = bytes('1'); + bytes32 internal constant EIP712_DOMAIN = + keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); + + // Map of address nonces (address => nonce) + mapping(address => uint256) internal _nonces; + + bytes32 internal _domainSeparator; + uint256 internal immutable _chainId; + + /** + * @dev Constructor. + */ + constructor() { + _chainId = block.chainid; + } + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { + if (block.chainid == _chainId) { + return _domainSeparator; + } + return _calculateDomainSeparator(); + } + + /** + * @notice Returns the nonce value for address specified as parameter + * @param owner The address for which the nonce is being returned + * @return The nonce value for the input address` + */ + function nonces(address owner) public view virtual returns (uint256) { + return _nonces[owner]; + } + + /** + * @notice Compute the current domain separator + * @return The domain separator for the token + */ + function _calculateDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + EIP712_DOMAIN, + keccak256(bytes(_EIP712BaseId())), + keccak256(EIP712_REVISION), + block.chainid, + address(this) + ) + ); + } + + /** + * @notice Returns the user readable name of signing domain (e.g. token name) + * @return The name of the signing domain + */ + function _EIP712BaseId() internal view virtual returns (string memory); +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol + +/** + * @title MintableIncentivizedERC20 + * @author Aave + * @notice Implements mint and burn functions for IncentivizedERC20 + */ +abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) IncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /** + * @notice Mints tokens to an account and apply incentives if defined + * @param account The address receiving tokens + * @param amount The amount of tokens to mint + */ + function _mint(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply + amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } + + /** + * @notice Burns tokens from an account and apply incentives if defined + * @param account The account whose tokens are burnt + * @param amount The amount of tokens to burn + */ + function _burn(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply - amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance - amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol + +/** + * @title ScaledBalanceTokenBase + * @author Aave + * @notice Basic ERC20 implementation of scaled balance token + */ +abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) MintableIncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /// @inheritdoc IScaledBalanceToken + function scaledBalanceOf(address user) external view override returns (uint256) { + return super.balanceOf(user); + } + + /// @inheritdoc IScaledBalanceToken + function getScaledUserBalanceAndSupply( + address user + ) external view override returns (uint256, uint256) { + return (super.balanceOf(user), super.totalSupply()); + } + + /// @inheritdoc IScaledBalanceToken + function scaledTotalSupply() public view virtual override returns (uint256) { + return super.totalSupply(); + } + + /// @inheritdoc IScaledBalanceToken + function getPreviousIndex(address user) external view virtual override returns (uint256) { + return _userState[user].additionalData; + } + + /** + * @notice Implements the basic logic to mint a scaled balance token. + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the scaled tokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function _mintScaled( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) internal returns (bool) { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); + + uint256 scaledBalance = super.balanceOf(onBehalfOf); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[onBehalfOf].additionalData); + + _userState[onBehalfOf].additionalData = index.toUint128(); + + _mint(onBehalfOf, amountScaled.toUint128()); + + uint256 amountToMint = amount + balanceIncrease; + emit Transfer(address(0), onBehalfOf, amountToMint); + emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); + + return (scaledBalance == 0); + } + + /** + * @notice Implements the basic logic to burn a scaled balance token. + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param user The user which debt is burnt + * @param target The address that will receive the underlying, if any + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + */ + function _burnScaled(address user, address target, uint256 amount, uint256 index) internal { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); + + uint256 scaledBalance = super.balanceOf(user); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[user].additionalData); + + _userState[user].additionalData = index.toUint128(); + + _burn(user, amountScaled.toUint128()); + + if (balanceIncrease > amount) { + uint256 amountToMint = balanceIncrease - amount; + emit Transfer(address(0), user, amountToMint); + emit Mint(user, user, amountToMint, balanceIncrease, index); + } else { + uint256 amountToBurn = amount - balanceIncrease; + emit Transfer(user, address(0), amountToBurn); + emit Burn(user, target, amountToBurn, balanceIncrease, index); + } + } + + /** + * @notice Implements the basic logic to transfer scaled balance tokens between two users + * @dev It emits a mint event with the interest accrued per user + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + * @param index The next liquidity index of the reserve + */ + function _transfer(address sender, address recipient, uint256 amount, uint256 index) internal { + uint256 senderScaledBalance = super.balanceOf(sender); + uint256 senderBalanceIncrease = senderScaledBalance.rayMul(index) - + senderScaledBalance.rayMul(_userState[sender].additionalData); + + uint256 recipientScaledBalance = super.balanceOf(recipient); + uint256 recipientBalanceIncrease = recipientScaledBalance.rayMul(index) - + recipientScaledBalance.rayMul(_userState[recipient].additionalData); + + _userState[sender].additionalData = index.toUint128(); + _userState[recipient].additionalData = index.toUint128(); + + super._transfer(sender, recipient, amount.rayDiv(index).toUint128()); + + if (senderBalanceIncrease > 0) { + emit Transfer(address(0), sender, senderBalanceIncrease); + emit Mint(_msgSender(), sender, senderBalanceIncrease, senderBalanceIncrease, index); + } + + if (sender != recipient && recipientBalanceIncrease > 0) { + emit Transfer(address(0), recipient, recipientBalanceIncrease); + emit Mint(_msgSender(), recipient, recipientBalanceIncrease, recipientBalanceIncrease, index); + } + + emit Transfer(sender, recipient, amount); + } +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/AToken.sol + +/** + * @title Aave ERC20 AToken + * @author Aave + * @notice Implementation of the interest bearing token for the Aave protocol + */ +abstract contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, IAToken { + using WadRayMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + + bytes32 public constant PERMIT_TYPEHASH = + keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); + + address internal _treasury; + address internal _underlyingAsset; + + /** + * @dev Constructor. + * @param pool The address of the Pool contract + */ + constructor( + IPool pool + ) ScaledBalanceTokenBase(pool, 'ATOKEN_IMPL', 'ATOKEN_IMPL', 0) EIP712Base() { + // Intentionally left blank + } + + /// @inheritdoc IInitializableAToken + function initialize( + IPool initializingPool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) public virtual; + + /// @inheritdoc IAToken + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external virtual override onlyPool returns (bool) { + return _mintScaled(caller, onBehalfOf, amount, index); + } + + /// @inheritdoc IAToken + function burn( + address from, + address receiverOfUnderlying, + uint256 amount, + uint256 index + ) external virtual override onlyPool { + _burnScaled(from, receiverOfUnderlying, amount, index); + if (receiverOfUnderlying != address(this)) { + IERC20(_underlyingAsset).safeTransfer(receiverOfUnderlying, amount); + } + } + + /// @inheritdoc IAToken + function mintToTreasury(uint256 amount, uint256 index) external virtual override onlyPool { + if (amount == 0) { + return; + } + _mintScaled(address(POOL), _treasury, amount, index); + } + + /// @inheritdoc IAToken + function transferOnLiquidation( + address from, + address to, + uint256 value + ) external virtual override onlyPool { + // Being a normal transfer, the Transfer() and BalanceTransfer() are emitted + // so no need to emit a specific event here + _transfer(from, to, value, false); + } + + /// @inheritdoc IERC20 + function balanceOf( + address user + ) public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { + return super.balanceOf(user).rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { + uint256 currentSupplyScaled = super.totalSupply(); + + if (currentSupplyScaled == 0) { + return 0; + } + + return currentSupplyScaled.rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); + } + + /// @inheritdoc IAToken + function RESERVE_TREASURY_ADDRESS() external view override returns (address) { + return _treasury; + } + + /// @inheritdoc IAToken + function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { + return _underlyingAsset; + } + + /// @inheritdoc IAToken + function transferUnderlyingTo(address target, uint256 amount) external virtual override onlyPool { + IERC20(_underlyingAsset).safeTransfer(target, amount); + } + + /// @inheritdoc IAToken + function handleRepayment( + address user, + address onBehalfOf, + uint256 amount + ) external virtual override onlyPool { + // Intentionally left blank + } + + /// @inheritdoc IAToken + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external override { + require(owner != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + //solium-disable-next-line + require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); + uint256 currentValidNonce = _nonces[owner]; + bytes32 digest = keccak256( + abi.encodePacked( + '\x19\x01', + DOMAIN_SEPARATOR(), + keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentValidNonce, deadline)) + ) + ); + require(owner == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); + _nonces[owner] = currentValidNonce + 1; + _approve(owner, spender, value); + } + + /** + * @notice Transfers the aTokens between two users. Validates the transfer + * (ie checks for valid HF after the transfer) if required + * @param from The source address + * @param to The destination address + * @param amount The amount getting transferred + * @param validate True if the transfer needs to be validated, false otherwise + */ + function _transfer(address from, address to, uint256 amount, bool validate) internal virtual { + address underlyingAsset = _underlyingAsset; + + uint256 index = POOL.getReserveNormalizedIncome(underlyingAsset); + + uint256 fromBalanceBefore = super.balanceOf(from).rayMul(index); + uint256 toBalanceBefore = super.balanceOf(to).rayMul(index); + + super._transfer(from, to, amount, index); + + if (validate) { + POOL.finalizeTransfer(underlyingAsset, from, to, amount, fromBalanceBefore, toBalanceBefore); + } + + emit BalanceTransfer(from, to, amount.rayDiv(index), index); + } + + /** + * @notice Overrides the parent _transfer to force validated transfer() and transferFrom() + * @param from The source address + * @param to The destination address + * @param amount The amount getting transferred + */ + function _transfer(address from, address to, uint128 amount) internal virtual override { + _transfer(from, to, amount, true); + } + + /** + * @dev Overrides the base function to fully implement IAToken + * @dev see `EIP712Base.DOMAIN_SEPARATOR()` for more detailed documentation + */ + function DOMAIN_SEPARATOR() public view override(IAToken, EIP712Base) returns (bytes32) { + return super.DOMAIN_SEPARATOR(); + } + + /** + * @dev Overrides the base function to fully implement IAToken + * @dev see `EIP712Base.nonces()` for more detailed documentation + */ + function nonces(address owner) public view override(IAToken, EIP712Base) returns (uint256) { + return super.nonces(owner); + } + + /// @inheritdoc EIP712Base + function _EIP712BaseId() internal view override returns (string memory) { + return name(); + } + + /// @inheritdoc IAToken + function rescueTokens(address token, address to, uint256 amount) external override onlyPoolAdmin { + require(token != _underlyingAsset, Errors.UNDERLYING_CANNOT_BE_RESCUED); + IERC20(token).safeTransfer(to, amount); + } +} + +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/instances/ATokenInstance.sol + +contract ATokenInstance is AToken { + uint256 public constant ATOKEN_REVISION = 1; + + constructor(IPool pool) AToken(pool) {} + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure virtual override returns (uint256) { + return ATOKEN_REVISION; + } + + /// @inheritdoc IInitializableAToken + function initialize( + IPool initializingPool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) public virtual override initializer { + require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); + _setName(aTokenName); + _setSymbol(aTokenSymbol); + _setDecimals(aTokenDecimals); + + _treasury = treasury; + _underlyingAsset = underlyingAsset; + _incentivesController = incentivesController; + + _domainSeparator = _calculateDomainSeparator(); + + emit Initialized( + underlyingAsset, + address(POOL), + treasury, + address(incentivesController), + aTokenDecimals, + aTokenName, + aTokenSymbol, + params + ); + } +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/instances/ATokenInstance.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/instances/ATokenInstance.sol new file mode 100644 index 00000000..ab8dee10 --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/instances/ATokenInstance.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {AToken, IPool, IAaveIncentivesController, IInitializableAToken, Errors, VersionedInitializable} from '../protocol/tokenization/AToken.sol'; + +contract ATokenInstance is AToken { + uint256 public constant ATOKEN_REVISION = 1; + + constructor(IPool pool) AToken(pool) {} + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure virtual override returns (uint256) { + return ATOKEN_REVISION; + } + + /// @inheritdoc IInitializableAToken + function initialize( + IPool initializingPool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) public virtual override initializer { + require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); + _setName(aTokenName); + _setSymbol(aTokenSymbol); + _setDecimals(aTokenDecimals); + + _treasury = treasury; + _underlyingAsset = underlyingAsset; + _incentivesController = incentivesController; + + _domainSeparator = _calculateDomainSeparator(); + + emit Initialized( + underlyingAsset, + address(POOL), + treasury, + address(incentivesController), + aTokenDecimals, + aTokenName, + aTokenSymbol, + params + ); + } +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPool.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol new file mode 100644 index 00000000..1070227a --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/AToken.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/AToken.sol new file mode 100644 index 00000000..47ba03d9 --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/AToken.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {VersionedInitializable} from '../../misc/aave-upgradeability/VersionedInitializable.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; +import {WadRayMath} from '../libraries/math/WadRayMath.sol'; +import {IPool} from '../../interfaces/IPool.sol'; +import {IAToken} from '../../interfaces/IAToken.sol'; +import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; +import {IInitializableAToken} from '../../interfaces/IInitializableAToken.sol'; +import {ScaledBalanceTokenBase} from './base/ScaledBalanceTokenBase.sol'; +import {IncentivizedERC20} from './base/IncentivizedERC20.sol'; +import {EIP712Base} from './base/EIP712Base.sol'; + +/** + * @title Aave ERC20 AToken + * @author Aave + * @notice Implementation of the interest bearing token for the Aave protocol + */ +abstract contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, IAToken { + using WadRayMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + + bytes32 public constant PERMIT_TYPEHASH = + keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); + + address internal _treasury; + address internal _underlyingAsset; + + /** + * @dev Constructor. + * @param pool The address of the Pool contract + */ + constructor( + IPool pool + ) ScaledBalanceTokenBase(pool, 'ATOKEN_IMPL', 'ATOKEN_IMPL', 0) EIP712Base() { + // Intentionally left blank + } + + /// @inheritdoc IInitializableAToken + function initialize( + IPool initializingPool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) public virtual; + + /// @inheritdoc IAToken + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external virtual override onlyPool returns (bool) { + return _mintScaled(caller, onBehalfOf, amount, index); + } + + /// @inheritdoc IAToken + function burn( + address from, + address receiverOfUnderlying, + uint256 amount, + uint256 index + ) external virtual override onlyPool { + _burnScaled(from, receiverOfUnderlying, amount, index); + if (receiverOfUnderlying != address(this)) { + IERC20(_underlyingAsset).safeTransfer(receiverOfUnderlying, amount); + } + } + + /// @inheritdoc IAToken + function mintToTreasury(uint256 amount, uint256 index) external virtual override onlyPool { + if (amount == 0) { + return; + } + _mintScaled(address(POOL), _treasury, amount, index); + } + + /// @inheritdoc IAToken + function transferOnLiquidation( + address from, + address to, + uint256 value + ) external virtual override onlyPool { + // Being a normal transfer, the Transfer() and BalanceTransfer() are emitted + // so no need to emit a specific event here + _transfer(from, to, value, false); + } + + /// @inheritdoc IERC20 + function balanceOf( + address user + ) public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { + return super.balanceOf(user).rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { + uint256 currentSupplyScaled = super.totalSupply(); + + if (currentSupplyScaled == 0) { + return 0; + } + + return currentSupplyScaled.rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); + } + + /// @inheritdoc IAToken + function RESERVE_TREASURY_ADDRESS() external view override returns (address) { + return _treasury; + } + + /// @inheritdoc IAToken + function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { + return _underlyingAsset; + } + + /// @inheritdoc IAToken + function transferUnderlyingTo(address target, uint256 amount) external virtual override onlyPool { + IERC20(_underlyingAsset).safeTransfer(target, amount); + } + + /// @inheritdoc IAToken + function handleRepayment( + address user, + address onBehalfOf, + uint256 amount + ) external virtual override onlyPool { + // Intentionally left blank + } + + /// @inheritdoc IAToken + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external override { + require(owner != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + //solium-disable-next-line + require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); + uint256 currentValidNonce = _nonces[owner]; + bytes32 digest = keccak256( + abi.encodePacked( + '\x19\x01', + DOMAIN_SEPARATOR(), + keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentValidNonce, deadline)) + ) + ); + require(owner == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); + _nonces[owner] = currentValidNonce + 1; + _approve(owner, spender, value); + } + + /** + * @notice Transfers the aTokens between two users. Validates the transfer + * (ie checks for valid HF after the transfer) if required + * @param from The source address + * @param to The destination address + * @param amount The amount getting transferred + * @param validate True if the transfer needs to be validated, false otherwise + */ + function _transfer(address from, address to, uint256 amount, bool validate) internal virtual { + address underlyingAsset = _underlyingAsset; + + uint256 index = POOL.getReserveNormalizedIncome(underlyingAsset); + + uint256 fromBalanceBefore = super.balanceOf(from).rayMul(index); + uint256 toBalanceBefore = super.balanceOf(to).rayMul(index); + + super._transfer(from, to, amount, index); + + if (validate) { + POOL.finalizeTransfer(underlyingAsset, from, to, amount, fromBalanceBefore, toBalanceBefore); + } + + emit BalanceTransfer(from, to, amount.rayDiv(index), index); + } + + /** + * @notice Overrides the parent _transfer to force validated transfer() and transferFrom() + * @param from The source address + * @param to The destination address + * @param amount The amount getting transferred + */ + function _transfer(address from, address to, uint128 amount) internal virtual override { + _transfer(from, to, amount, true); + } + + /** + * @dev Overrides the base function to fully implement IAToken + * @dev see `EIP712Base.DOMAIN_SEPARATOR()` for more detailed documentation + */ + function DOMAIN_SEPARATOR() public view override(IAToken, EIP712Base) returns (bytes32) { + return super.DOMAIN_SEPARATOR(); + } + + /** + * @dev Overrides the base function to fully implement IAToken + * @dev see `EIP712Base.nonces()` for more detailed documentation + */ + function nonces(address owner) public view override(IAToken, EIP712Base) returns (uint256) { + return super.nonces(owner); + } + + /// @inheritdoc EIP712Base + function _EIP712BaseId() internal view override returns (string memory) { + return name(); + } + + /// @inheritdoc IAToken + function rescueTokens(address token, address to, uint256 amount) external override onlyPoolAdmin { + require(token != _underlyingAsset, Errors.UNDERLYING_CANNOT_BE_RESCUED); + IERC20(token).safeTransfer(to, amount); + } +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol new file mode 100644 index 00000000..97abc425 --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title EIP712Base + * @author Aave + * @notice Base contract implementation of EIP712. + */ +abstract contract EIP712Base { + bytes public constant EIP712_REVISION = bytes('1'); + bytes32 internal constant EIP712_DOMAIN = + keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); + + // Map of address nonces (address => nonce) + mapping(address => uint256) internal _nonces; + + bytes32 internal _domainSeparator; + uint256 internal immutable _chainId; + + /** + * @dev Constructor. + */ + constructor() { + _chainId = block.chainid; + } + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { + if (block.chainid == _chainId) { + return _domainSeparator; + } + return _calculateDomainSeparator(); + } + + /** + * @notice Returns the nonce value for address specified as parameter + * @param owner The address for which the nonce is being returned + * @return The nonce value for the input address` + */ + function nonces(address owner) public view virtual returns (uint256) { + return _nonces[owner]; + } + + /** + * @notice Compute the current domain separator + * @return The domain separator for the token + */ + function _calculateDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + EIP712_DOMAIN, + keccak256(bytes(_EIP712BaseId())), + keccak256(EIP712_REVISION), + block.chainid, + address(this) + ) + ); + } + + /** + * @notice Returns the user readable name of signing domain (e.g. token name) + * @return The name of the signing domain + */ + function _EIP712BaseId() internal view virtual returns (string memory); +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol new file mode 100644 index 00000000..b07b1673 --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IncentivizedERC20} from './IncentivizedERC20.sol'; + +/** + * @title MintableIncentivizedERC20 + * @author Aave + * @notice Implements mint and burn functions for IncentivizedERC20 + */ +abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) IncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /** + * @notice Mints tokens to an account and apply incentives if defined + * @param account The address receiving tokens + * @param amount The amount of tokens to mint + */ + function _mint(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply + amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } + + /** + * @notice Burns tokens from an account and apply incentives if defined + * @param account The account whose tokens are burnt + * @param amount The amount of tokens to burn + */ + function _burn(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply - amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance - amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } +} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol new file mode 100644 index 00000000..a79d8917 --- /dev/null +++ b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {MintableIncentivizedERC20} from './MintableIncentivizedERC20.sol'; + +/** + * @title ScaledBalanceTokenBase + * @author Aave + * @notice Basic ERC20 implementation of scaled balance token + */ +abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) MintableIncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /// @inheritdoc IScaledBalanceToken + function scaledBalanceOf(address user) external view override returns (uint256) { + return super.balanceOf(user); + } + + /// @inheritdoc IScaledBalanceToken + function getScaledUserBalanceAndSupply( + address user + ) external view override returns (uint256, uint256) { + return (super.balanceOf(user), super.totalSupply()); + } + + /// @inheritdoc IScaledBalanceToken + function scaledTotalSupply() public view virtual override returns (uint256) { + return super.totalSupply(); + } + + /// @inheritdoc IScaledBalanceToken + function getPreviousIndex(address user) external view virtual override returns (uint256) { + return _userState[user].additionalData; + } + + /** + * @notice Implements the basic logic to mint a scaled balance token. + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the scaled tokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function _mintScaled( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) internal returns (bool) { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); + + uint256 scaledBalance = super.balanceOf(onBehalfOf); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[onBehalfOf].additionalData); + + _userState[onBehalfOf].additionalData = index.toUint128(); + + _mint(onBehalfOf, amountScaled.toUint128()); + + uint256 amountToMint = amount + balanceIncrease; + emit Transfer(address(0), onBehalfOf, amountToMint); + emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); + + return (scaledBalance == 0); + } + + /** + * @notice Implements the basic logic to burn a scaled balance token. + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param user The user which debt is burnt + * @param target The address that will receive the underlying, if any + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + */ + function _burnScaled(address user, address target, uint256 amount, uint256 index) internal { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); + + uint256 scaledBalance = super.balanceOf(user); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[user].additionalData); + + _userState[user].additionalData = index.toUint128(); + + _burn(user, amountScaled.toUint128()); + + if (balanceIncrease > amount) { + uint256 amountToMint = balanceIncrease - amount; + emit Transfer(address(0), user, amountToMint); + emit Mint(user, user, amountToMint, balanceIncrease, index); + } else { + uint256 amountToBurn = amount - balanceIncrease; + emit Transfer(user, address(0), amountToBurn); + emit Burn(user, target, amountToBurn, balanceIncrease, index); + } + } + + /** + * @notice Implements the basic logic to transfer scaled balance tokens between two users + * @dev It emits a mint event with the interest accrued per user + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + * @param index The next liquidity index of the reserve + */ + function _transfer(address sender, address recipient, uint256 amount, uint256 index) internal { + uint256 senderScaledBalance = super.balanceOf(sender); + uint256 senderBalanceIncrease = senderScaledBalance.rayMul(index) - + senderScaledBalance.rayMul(_userState[sender].additionalData); + + uint256 recipientScaledBalance = super.balanceOf(recipient); + uint256 recipientBalanceIncrease = recipientScaledBalance.rayMul(index) - + recipientScaledBalance.rayMul(_userState[recipient].additionalData); + + _userState[sender].additionalData = index.toUint128(); + _userState[recipient].additionalData = index.toUint128(); + + super._transfer(sender, recipient, amount.rayDiv(index).toUint128()); + + if (senderBalanceIncrease > 0) { + emit Transfer(address(0), sender, senderBalanceIncrease); + emit Mint(_msgSender(), sender, senderBalanceIncrease, senderBalanceIncrease, index); + } + + if (sender != recipient && recipientBalanceIncrease > 0) { + emit Transfer(address(0), recipient, recipientBalanceIncrease); + emit Mint(_msgSender(), recipient, recipientBalanceIncrease, recipientBalanceIncrease, index); + } + + emit Transfer(sender, recipient, amount); + } +} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol new file mode 100644 index 00000000..8226df66 --- /dev/null +++ b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol @@ -0,0 +1,1853 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} + +// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} + +// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsDistributor.sol + +/** + * @title IRewardsDistributor + * @author Aave + * @notice Defines the basic interface for a Rewards Distributor. + */ +interface IRewardsDistributor { + /** + * @dev Emitted when the configuration of the rewards of an asset is updated. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param oldEmission The old emissions per second value of the reward distribution + * @param newEmission The new emissions per second value of the reward distribution + * @param oldDistributionEnd The old end timestamp of the reward distribution + * @param newDistributionEnd The new end timestamp of the reward distribution + * @param assetIndex The index of the asset distribution + */ + event AssetConfigUpdated( + address indexed asset, + address indexed reward, + uint256 oldEmission, + uint256 newEmission, + uint256 oldDistributionEnd, + uint256 newDistributionEnd, + uint256 assetIndex + ); + + /** + * @dev Emitted when rewards of an asset are accrued on behalf of a user. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param user The address of the user that rewards are accrued on behalf of + * @param assetIndex The index of the asset distribution + * @param userIndex The index of the asset distribution on behalf of the user + * @param rewardsAccrued The amount of rewards accrued + */ + event Accrued( + address indexed asset, + address indexed reward, + address indexed user, + uint256 assetIndex, + uint256 userIndex, + uint256 rewardsAccrued + ); + + /** + * @dev Sets the end date for the distribution + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Gets the end date for the distribution + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The timestamp with the end of the distribution, in unix time format + **/ + function getDistributionEnd(address asset, address reward) external view returns (uint256); + + /** + * @dev Returns the index of a user on a reward distribution + * @param user Address of the user + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The current user asset index, not including new distributions + **/ + function getUserAssetIndex( + address user, + address asset, + address reward + ) external view returns (uint256); + + /** + * @dev Returns the configuration of the distribution reward for a certain asset + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The index of the asset distribution + * @return The emission per second of the reward distribution + * @return The timestamp of the last update of the index + * @return The timestamp of the distribution end + **/ + function getRewardsData( + address asset, + address reward + ) external view returns (uint256, uint256, uint256, uint256); + + /** + * @dev Calculates the next value of an specific distribution index, with validations. + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The old index of the asset distribution + * @return The new index of the asset distribution + **/ + function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); + + /** + * @dev Returns the list of available reward token addresses of an incentivized asset + * @param asset The incentivized asset + * @return List of rewards addresses of the input asset + **/ + function getRewardsByAsset(address asset) external view returns (address[] memory); + + /** + * @dev Returns the list of available reward addresses + * @return List of rewards supported in this contract + **/ + function getRewardsList() external view returns (address[] memory); + + /** + * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. + * @param user The address of the user + * @param reward The address of the reward token + * @return Unclaimed rewards, not including new distributions + **/ + function getUserAccruedRewards(address user, address reward) external view returns (uint256); + + /** + * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @param reward The address of the reward token + * @return The rewards amount + **/ + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view returns (uint256); + + /** + * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @return The list of reward addresses + * @return The list of unclaimed amount of rewards + **/ + function getAllUserRewards( + address[] calldata assets, + address user + ) external view returns (address[] memory, uint256[] memory); + + /** + * @dev Returns the decimals of an asset to calculate the distribution delta + * @param asset The address to retrieve decimals + * @return The decimals of an underlying asset + */ + function getAssetDecimals(address asset) external view returns (uint8); + + /** + * @dev Returns the address of the emission manager + * @return The address of the EmissionManager + */ + function EMISSION_MANAGER() external view returns (address); + + /** + * @dev Returns the address of the emission manager. + * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. + * @return The address of the EmissionManager + */ + function getEmissionManager() external view returns (address); +} + +// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/ITransferStrategyBase.sol + +interface ITransferStrategyBase { + event EmergencyWithdrawal( + address indexed caller, + address indexed token, + address indexed to, + uint256 amount + ); + + /** + * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation + * @param to Account to transfer rewards + * @param reward Address of the reward token + * @param amount Amount to transfer to the "to" address parameter + * @return Returns true bool if transfer logic succeeds + */ + function performTransfer(address to, address reward, uint256 amount) external returns (bool); + + /** + * @return Returns the address of the Incentives Controller + */ + function getIncentivesController() external view returns (address); + + /** + * @return Returns the address of the Rewards admin + */ + function getRewardsAdmin() external view returns (address); + + /** + * @dev Perform an emergency token withdrawal only callable by the Rewards admin + * @param token Address of the token to withdraw funds from this contract + * @param to Address of the recipient of the withdrawal + * @param amount Amount of the withdrawal + */ + function emergencyWithdrawal(address token, address to, uint256 amount) external; +} + +// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/libraries/RewardsDataTypes.sol + +library RewardsDataTypes { + struct RewardsConfigInput { + uint88 emissionPerSecond; + uint256 totalSupply; + uint32 distributionEnd; + address asset; + address reward; + ITransferStrategyBase transferStrategy; + IEACAggregatorProxy rewardOracle; + } + + struct UserAssetBalance { + address asset; + uint256 userBalance; + uint256 totalSupply; + } + + struct UserData { + // Liquidity index of the reward distribution for the user + uint104 index; + // Amount of accrued rewards for the user since last user index update + uint128 accrued; + } + + struct RewardData { + // Liquidity index of the reward distribution + uint104 index; + // Amount of reward tokens distributed per second + uint88 emissionPerSecond; + // Timestamp of the last reward index update + uint32 lastUpdateTimestamp; + // The end of the distribution of rewards (in seconds) + uint32 distributionEnd; + // Map of user addresses and their rewards data (userAddress => userData) + mapping(address => UserData) usersData; + } + + struct AssetData { + // Map of reward token addresses and their data (rewardTokenAddress => rewardData) + mapping(address => RewardData) rewards; + // List of reward token addresses for the asset + mapping(uint128 => address) availableRewards; + // Count of reward tokens for the asset + uint128 availableRewardsCount; + // Number of decimals of the asset + uint8 decimals; + } +} + +// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsController.sol + +/** + * @title IRewardsController + * @author Aave + * @notice Defines the basic interface for a Rewards Controller. + */ +interface IRewardsController is IRewardsDistributor { + /** + * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user + * @param user The address of the user + * @param claimer The address of the claimer + */ + event ClaimerSet(address indexed user, address indexed claimer); + + /** + * @dev Emitted when rewards are claimed + * @param user The address of the user rewards has been claimed on behalf of + * @param reward The address of the token reward is claimed + * @param to The address of the receiver of the rewards + * @param claimer The address of the claimer + * @param amount The amount of rewards claimed + */ + event RewardsClaimed( + address indexed user, + address indexed reward, + address indexed to, + address claimer, + uint256 amount + ); + + /** + * @dev Emitted when a transfer strategy is installed for the reward distribution + * @param reward The address of the token reward + * @param transferStrategy The address of TransferStrategy contract + */ + event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); + + /** + * @dev Emitted when the reward oracle is updated + * @param reward The address of the token reward + * @param rewardOracle The address of oracle + */ + event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Get the price aggregator oracle address + * @param reward The address of the reward + * @return The price oracle of the reward + */ + function getRewardOracle(address reward) external view returns (address); + + /** + * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) + * @param user The address of the user + * @return The claimer address + */ + function getClaimer(address user) external view returns (address); + + /** + * @dev Returns the Transfer Strategy implementation contract address being used for a reward address + * @param reward The address of the reward + * @return The address of the TransferStrategy contract + */ + function getTransferStrategy(address reward) external view returns (address); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + **/ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + + /** + * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The + * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external returns (uint256); + + /** + * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" + **/ + function claimAllRewards( + address[] calldata assets, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must + * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsToSelf( + address[] calldata assets + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); +} + +// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsDistributor.sol + +/** + * @title RewardsDistributor + * @notice Accounting contract to manage multiple staking distributions with multiple rewards + * @author Aave + **/ +abstract contract RewardsDistributor is IRewardsDistributor { + using SafeCast for uint256; + + // Manager of incentives + address public immutable EMISSION_MANAGER; + // Deprecated: This storage slot is kept for backwards compatibility purposes. + address internal _emissionManager; + + // Map of rewarded asset addresses and their data (assetAddress => assetData) + mapping(address => RewardsDataTypes.AssetData) internal _assets; + + // Map of reward assets (rewardAddress => enabled) + mapping(address => bool) internal _isRewardEnabled; + + // Rewards list + address[] internal _rewardsList; + + // Assets list + address[] internal _assetsList; + + modifier onlyEmissionManager() { + require(msg.sender == EMISSION_MANAGER, 'ONLY_EMISSION_MANAGER'); + _; + } + + constructor(address emissionManager) { + EMISSION_MANAGER = emissionManager; + } + + /// @inheritdoc IRewardsDistributor + function getRewardsData( + address asset, + address reward + ) external view override returns (uint256, uint256, uint256, uint256) { + return ( + _assets[asset].rewards[reward].index, + _assets[asset].rewards[reward].emissionPerSecond, + _assets[asset].rewards[reward].lastUpdateTimestamp, + _assets[asset].rewards[reward].distributionEnd + ); + } + + /// @inheritdoc IRewardsDistributor + function getAssetIndex( + address asset, + address reward + ) external view override returns (uint256, uint256) { + RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; + return + _getAssetIndex( + rewardData, + IScaledBalanceToken(asset).scaledTotalSupply(), + 10 ** _assets[asset].decimals + ); + } + + /// @inheritdoc IRewardsDistributor + function getDistributionEnd( + address asset, + address reward + ) external view override returns (uint256) { + return _assets[asset].rewards[reward].distributionEnd; + } + + /// @inheritdoc IRewardsDistributor + function getRewardsByAsset(address asset) external view override returns (address[] memory) { + uint128 rewardsCount = _assets[asset].availableRewardsCount; + address[] memory availableRewards = new address[](rewardsCount); + + for (uint128 i = 0; i < rewardsCount; i++) { + availableRewards[i] = _assets[asset].availableRewards[i]; + } + return availableRewards; + } + + /// @inheritdoc IRewardsDistributor + function getRewardsList() external view override returns (address[] memory) { + return _rewardsList; + } + + /// @inheritdoc IRewardsDistributor + function getUserAssetIndex( + address user, + address asset, + address reward + ) external view override returns (uint256) { + return _assets[asset].rewards[reward].usersData[user].index; + } + + /// @inheritdoc IRewardsDistributor + function getUserAccruedRewards( + address user, + address reward + ) external view override returns (uint256) { + uint256 totalAccrued; + for (uint256 i = 0; i < _assetsList.length; i++) { + totalAccrued += _assets[_assetsList[i]].rewards[reward].usersData[user].accrued; + } + + return totalAccrued; + } + + /// @inheritdoc IRewardsDistributor + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view override returns (uint256) { + return _getUserReward(user, reward, _getUserAssetBalances(assets, user)); + } + + /// @inheritdoc IRewardsDistributor + function getAllUserRewards( + address[] calldata assets, + address user + ) + external + view + override + returns (address[] memory rewardsList, uint256[] memory unclaimedAmounts) + { + RewardsDataTypes.UserAssetBalance[] memory userAssetBalances = _getUserAssetBalances( + assets, + user + ); + rewardsList = new address[](_rewardsList.length); + unclaimedAmounts = new uint256[](rewardsList.length); + + // Add unrealized rewards from user to unclaimedRewards + for (uint256 i = 0; i < userAssetBalances.length; i++) { + for (uint256 r = 0; r < rewardsList.length; r++) { + rewardsList[r] = _rewardsList[r]; + unclaimedAmounts[r] += _assets[userAssetBalances[i].asset] + .rewards[rewardsList[r]] + .usersData[user] + .accrued; + + if (userAssetBalances[i].userBalance == 0) { + continue; + } + unclaimedAmounts[r] += _getPendingRewards(user, rewardsList[r], userAssetBalances[i]); + } + } + return (rewardsList, unclaimedAmounts); + } + + /// @inheritdoc IRewardsDistributor + function setDistributionEnd( + address asset, + address reward, + uint32 newDistributionEnd + ) external override onlyEmissionManager { + uint256 oldDistributionEnd = _assets[asset].rewards[reward].distributionEnd; + _assets[asset].rewards[reward].distributionEnd = newDistributionEnd; + + emit AssetConfigUpdated( + asset, + reward, + _assets[asset].rewards[reward].emissionPerSecond, + _assets[asset].rewards[reward].emissionPerSecond, + oldDistributionEnd, + newDistributionEnd, + _assets[asset].rewards[reward].index + ); + } + + /// @inheritdoc IRewardsDistributor + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external override onlyEmissionManager { + require(rewards.length == newEmissionsPerSecond.length, 'INVALID_INPUT'); + for (uint256 i = 0; i < rewards.length; i++) { + RewardsDataTypes.AssetData storage assetConfig = _assets[asset]; + RewardsDataTypes.RewardData storage rewardConfig = _assets[asset].rewards[rewards[i]]; + uint256 decimals = assetConfig.decimals; + require( + decimals != 0 && rewardConfig.lastUpdateTimestamp != 0, + 'DISTRIBUTION_DOES_NOT_EXIST' + ); + + (uint256 newIndex, ) = _updateRewardData( + rewardConfig, + IScaledBalanceToken(asset).scaledTotalSupply(), + 10 ** decimals + ); + + uint256 oldEmissionPerSecond = rewardConfig.emissionPerSecond; + rewardConfig.emissionPerSecond = newEmissionsPerSecond[i]; + + emit AssetConfigUpdated( + asset, + rewards[i], + oldEmissionPerSecond, + newEmissionsPerSecond[i], + rewardConfig.distributionEnd, + rewardConfig.distributionEnd, + newIndex + ); + } + } + + /** + * @dev Configure the _assets for a specific emission + * @param rewardsInput The array of each asset configuration + **/ + function _configureAssets(RewardsDataTypes.RewardsConfigInput[] memory rewardsInput) internal { + for (uint256 i = 0; i < rewardsInput.length; i++) { + if (_assets[rewardsInput[i].asset].decimals == 0) { + //never initialized before, adding to the list of assets + _assetsList.push(rewardsInput[i].asset); + } + + uint256 decimals = _assets[rewardsInput[i].asset].decimals = IERC20Detailed( + rewardsInput[i].asset + ).decimals(); + + RewardsDataTypes.RewardData storage rewardConfig = _assets[rewardsInput[i].asset].rewards[ + rewardsInput[i].reward + ]; + + // Add reward address to asset available rewards if latestUpdateTimestamp is zero + if (rewardConfig.lastUpdateTimestamp == 0) { + _assets[rewardsInput[i].asset].availableRewards[ + _assets[rewardsInput[i].asset].availableRewardsCount + ] = rewardsInput[i].reward; + _assets[rewardsInput[i].asset].availableRewardsCount++; + } + + // Add reward address to global rewards list if still not enabled + if (_isRewardEnabled[rewardsInput[i].reward] == false) { + _isRewardEnabled[rewardsInput[i].reward] = true; + _rewardsList.push(rewardsInput[i].reward); + } + + // Due emissions is still zero, updates only latestUpdateTimestamp + (uint256 newIndex, ) = _updateRewardData( + rewardConfig, + rewardsInput[i].totalSupply, + 10 ** decimals + ); + + // Configure emission and distribution end of the reward per asset + uint88 oldEmissionsPerSecond = rewardConfig.emissionPerSecond; + uint32 oldDistributionEnd = rewardConfig.distributionEnd; + rewardConfig.emissionPerSecond = rewardsInput[i].emissionPerSecond; + rewardConfig.distributionEnd = rewardsInput[i].distributionEnd; + + emit AssetConfigUpdated( + rewardsInput[i].asset, + rewardsInput[i].reward, + oldEmissionsPerSecond, + rewardsInput[i].emissionPerSecond, + oldDistributionEnd, + rewardsInput[i].distributionEnd, + newIndex + ); + } + } + + /** + * @dev Updates the state of the distribution for the specified reward + * @param rewardData Storage pointer to the distribution reward config + * @param totalSupply Current total of underlying assets for this distribution + * @param assetUnit One unit of asset (10**decimals) + * @return The new distribution index + * @return True if the index was updated, false otherwise + **/ + function _updateRewardData( + RewardsDataTypes.RewardData storage rewardData, + uint256 totalSupply, + uint256 assetUnit + ) internal returns (uint256, bool) { + (uint256 oldIndex, uint256 newIndex) = _getAssetIndex(rewardData, totalSupply, assetUnit); + bool indexUpdated; + if (newIndex != oldIndex) { + require(newIndex <= type(uint104).max, 'INDEX_OVERFLOW'); + indexUpdated = true; + + //optimization: storing one after another saves one SSTORE + rewardData.index = uint104(newIndex); + rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); + } else { + rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); + } + + return (newIndex, indexUpdated); + } + + /** + * @dev Updates the state of the distribution for the specific user + * @param rewardData Storage pointer to the distribution reward config + * @param user The address of the user + * @param userBalance The user balance of the asset + * @param newAssetIndex The new index of the asset distribution + * @param assetUnit One unit of asset (10**decimals) + * @return The rewards accrued since the last update + **/ + function _updateUserData( + RewardsDataTypes.RewardData storage rewardData, + address user, + uint256 userBalance, + uint256 newAssetIndex, + uint256 assetUnit + ) internal returns (uint256, bool) { + uint256 userIndex = rewardData.usersData[user].index; + uint256 rewardsAccrued; + bool dataUpdated; + if ((dataUpdated = userIndex != newAssetIndex)) { + // already checked for overflow in _updateRewardData + rewardData.usersData[user].index = uint104(newAssetIndex); + if (userBalance != 0) { + rewardsAccrued = _getRewards(userBalance, newAssetIndex, userIndex, assetUnit); + + rewardData.usersData[user].accrued += rewardsAccrued.toUint128(); + } + } + return (rewardsAccrued, dataUpdated); + } + + /** + * @dev Iterates and accrues all the rewards for asset of the specific user + * @param asset The address of the reference asset of the distribution + * @param user The user address + * @param userBalance The current user asset balance + * @param totalSupply Total supply of the asset + **/ + function _updateData( + address asset, + address user, + uint256 userBalance, + uint256 totalSupply + ) internal { + uint256 assetUnit; + uint256 numAvailableRewards = _assets[asset].availableRewardsCount; + unchecked { + assetUnit = 10 ** _assets[asset].decimals; + } + + if (numAvailableRewards == 0) { + return; + } + unchecked { + for (uint128 r = 0; r < numAvailableRewards; r++) { + address reward = _assets[asset].availableRewards[r]; + RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; + + (uint256 newAssetIndex, bool rewardDataUpdated) = _updateRewardData( + rewardData, + totalSupply, + assetUnit + ); + + (uint256 rewardsAccrued, bool userDataUpdated) = _updateUserData( + rewardData, + user, + userBalance, + newAssetIndex, + assetUnit + ); + + if (rewardDataUpdated || userDataUpdated) { + emit Accrued(asset, reward, user, newAssetIndex, newAssetIndex, rewardsAccrued); + } + } + } + } + + /** + * @dev Accrues all the rewards of the assets specified in the userAssetBalances list + * @param user The address of the user + * @param userAssetBalances List of structs with the user balance and total supply of a set of assets + **/ + function _updateDataMultiple( + address user, + RewardsDataTypes.UserAssetBalance[] memory userAssetBalances + ) internal { + for (uint256 i = 0; i < userAssetBalances.length; i++) { + _updateData( + userAssetBalances[i].asset, + user, + userAssetBalances[i].userBalance, + userAssetBalances[i].totalSupply + ); + } + } + + /** + * @dev Return the accrued unclaimed amount of a reward from a user over a list of distribution + * @param user The address of the user + * @param reward The address of the reward token + * @param userAssetBalances List of structs with the user balance and total supply of a set of assets + * @return unclaimedRewards The accrued rewards for the user until the moment + **/ + function _getUserReward( + address user, + address reward, + RewardsDataTypes.UserAssetBalance[] memory userAssetBalances + ) internal view returns (uint256 unclaimedRewards) { + // Add unrealized rewards + for (uint256 i = 0; i < userAssetBalances.length; i++) { + if (userAssetBalances[i].userBalance == 0) { + unclaimedRewards += _assets[userAssetBalances[i].asset] + .rewards[reward] + .usersData[user] + .accrued; + } else { + unclaimedRewards += + _getPendingRewards(user, reward, userAssetBalances[i]) + + _assets[userAssetBalances[i].asset].rewards[reward].usersData[user].accrued; + } + } + + return unclaimedRewards; + } + + /** + * @dev Calculates the pending (not yet accrued) rewards since the last user action + * @param user The address of the user + * @param reward The address of the reward token + * @param userAssetBalance struct with the user balance and total supply of the incentivized asset + * @return The pending rewards for the user since the last user action + **/ + function _getPendingRewards( + address user, + address reward, + RewardsDataTypes.UserAssetBalance memory userAssetBalance + ) internal view returns (uint256) { + RewardsDataTypes.RewardData storage rewardData = _assets[userAssetBalance.asset].rewards[ + reward + ]; + uint256 assetUnit = 10 ** _assets[userAssetBalance.asset].decimals; + (, uint256 nextIndex) = _getAssetIndex(rewardData, userAssetBalance.totalSupply, assetUnit); + + return + _getRewards( + userAssetBalance.userBalance, + nextIndex, + rewardData.usersData[user].index, + assetUnit + ); + } + + /** + * @dev Internal function for the calculation of user's rewards on a distribution + * @param userBalance Balance of the user asset on a distribution + * @param reserveIndex Current index of the distribution + * @param userIndex Index stored for the user, representation his staking moment + * @param assetUnit One unit of asset (10**decimals) + * @return The rewards + **/ + function _getRewards( + uint256 userBalance, + uint256 reserveIndex, + uint256 userIndex, + uint256 assetUnit + ) internal pure returns (uint256) { + uint256 result = userBalance * (reserveIndex - userIndex); + assembly { + result := div(result, assetUnit) + } + return result; + } + + /** + * @dev Calculates the next value of an specific distribution index, with validations + * @param rewardData Storage pointer to the distribution reward config + * @param totalSupply of the asset being rewarded + * @param assetUnit One unit of asset (10**decimals) + * @return The new index. + **/ + function _getAssetIndex( + RewardsDataTypes.RewardData storage rewardData, + uint256 totalSupply, + uint256 assetUnit + ) internal view returns (uint256, uint256) { + uint256 oldIndex = rewardData.index; + uint256 distributionEnd = rewardData.distributionEnd; + uint256 emissionPerSecond = rewardData.emissionPerSecond; + uint256 lastUpdateTimestamp = rewardData.lastUpdateTimestamp; + + if ( + emissionPerSecond == 0 || + totalSupply == 0 || + lastUpdateTimestamp == block.timestamp || + lastUpdateTimestamp >= distributionEnd + ) { + return (oldIndex, oldIndex); + } + + uint256 currentTimestamp = block.timestamp > distributionEnd + ? distributionEnd + : block.timestamp; + uint256 timeDelta = currentTimestamp - lastUpdateTimestamp; + uint256 firstTerm = emissionPerSecond * timeDelta * assetUnit; + assembly { + firstTerm := div(firstTerm, totalSupply) + } + return (oldIndex, (firstTerm + oldIndex)); + } + + /** + * @dev Get user balances and total supply of all the assets specified by the assets parameter + * @param assets List of assets to retrieve user balance and total supply + * @param user Address of the user + * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets + */ + function _getUserAssetBalances( + address[] calldata assets, + address user + ) internal view virtual returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances); + + /// @inheritdoc IRewardsDistributor + function getAssetDecimals(address asset) external view returns (uint8) { + return _assets[asset].decimals; + } + + /// @inheritdoc IRewardsDistributor + function getEmissionManager() external view returns (address) { + return EMISSION_MANAGER; + } +} + +// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsController.sol + +/** + * @title RewardsController + * @notice Abstract contract template to build Distributors contracts for ERC20 rewards to protocol participants + * @author Aave + **/ +contract RewardsController is RewardsDistributor, VersionedInitializable, IRewardsController { + using SafeCast for uint256; + + uint256 public constant REVISION = 1; + + // This mapping allows whitelisted addresses to claim on behalf of others + // useful for contracts that hold tokens to be rewarded but don't have any native logic to claim Liquidity Mining rewards + mapping(address => address) internal _authorizedClaimers; + + // reward => transfer strategy implementation contract + // The TransferStrategy contract abstracts the logic regarding + // the source of the reward and how to transfer it to the user. + mapping(address => ITransferStrategyBase) internal _transferStrategy; + + // This mapping contains the price oracle per reward. + // A price oracle is enforced for integrators to be able to show incentives at + // the current Aave UI without the need to setup an external price registry + // At the moment of reward configuration, the Incentives Controller performs + // a check to see if the provided reward oracle contains `latestAnswer`. + mapping(address => IEACAggregatorProxy) internal _rewardOracle; + + modifier onlyAuthorizedClaimers(address claimer, address user) { + require(_authorizedClaimers[user] == claimer, 'CLAIMER_UNAUTHORIZED'); + _; + } + + constructor(address emissionManager) RewardsDistributor(emissionManager) {} + + /** + * @dev Initialize for RewardsController + * @dev It expects an address as argument since its initialized via PoolAddressesProvider._updateImpl() + **/ + function initialize(address) external initializer {} + + /// @inheritdoc IRewardsController + function getClaimer(address user) external view override returns (address) { + return _authorizedClaimers[user]; + } + + /** + * @dev Returns the revision of the implementation contract + * @return uint256, current revision version + */ + function getRevision() internal pure override returns (uint256) { + return REVISION; + } + + /// @inheritdoc IRewardsController + function getRewardOracle(address reward) external view override returns (address) { + return address(_rewardOracle[reward]); + } + + /// @inheritdoc IRewardsController + function getTransferStrategy(address reward) external view override returns (address) { + return address(_transferStrategy[reward]); + } + + /// @inheritdoc IRewardsController + function configureAssets( + RewardsDataTypes.RewardsConfigInput[] memory config + ) external override onlyEmissionManager { + for (uint256 i = 0; i < config.length; i++) { + // Get the current Scaled Total Supply of AToken or Debt token + config[i].totalSupply = IScaledBalanceToken(config[i].asset).scaledTotalSupply(); + + // Install TransferStrategy logic at IncentivesController + _installTransferStrategy(config[i].reward, config[i].transferStrategy); + + // Set reward oracle, enforces input oracle to have latestPrice function + _setRewardOracle(config[i].reward, config[i].rewardOracle); + } + _configureAssets(config); + } + + /// @inheritdoc IRewardsController + function setTransferStrategy( + address reward, + ITransferStrategyBase transferStrategy + ) external onlyEmissionManager { + _installTransferStrategy(reward, transferStrategy); + } + + /// @inheritdoc IRewardsController + function setRewardOracle( + address reward, + IEACAggregatorProxy rewardOracle + ) external onlyEmissionManager { + _setRewardOracle(reward, rewardOracle); + } + + /// @inheritdoc IRewardsController + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external override { + _updateData(msg.sender, user, userBalance, totalSupply); + } + + /// @inheritdoc IRewardsController + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external override returns (uint256) { + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimRewards(assets, amount, msg.sender, msg.sender, to, reward); + } + + /// @inheritdoc IRewardsController + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external override onlyAuthorizedClaimers(msg.sender, user) returns (uint256) { + require(user != address(0), 'INVALID_USER_ADDRESS'); + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimRewards(assets, amount, msg.sender, user, to, reward); + } + + /// @inheritdoc IRewardsController + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external override returns (uint256) { + return _claimRewards(assets, amount, msg.sender, msg.sender, msg.sender, reward); + } + + /// @inheritdoc IRewardsController + function claimAllRewards( + address[] calldata assets, + address to + ) external override returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimAllRewards(assets, msg.sender, msg.sender, to); + } + + /// @inheritdoc IRewardsController + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) + external + override + onlyAuthorizedClaimers(msg.sender, user) + returns (address[] memory rewardsList, uint256[] memory claimedAmounts) + { + require(user != address(0), 'INVALID_USER_ADDRESS'); + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimAllRewards(assets, msg.sender, user, to); + } + + /// @inheritdoc IRewardsController + function claimAllRewardsToSelf( + address[] calldata assets + ) external override returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { + return _claimAllRewards(assets, msg.sender, msg.sender, msg.sender); + } + + /// @inheritdoc IRewardsController + function setClaimer(address user, address caller) external override onlyEmissionManager { + _authorizedClaimers[user] = caller; + emit ClaimerSet(user, caller); + } + + /** + * @dev Get user balances and total supply of all the assets specified by the assets parameter + * @param assets List of assets to retrieve user balance and total supply + * @param user Address of the user + * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets + */ + function _getUserAssetBalances( + address[] calldata assets, + address user + ) internal view override returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances) { + userAssetBalances = new RewardsDataTypes.UserAssetBalance[](assets.length); + for (uint256 i = 0; i < assets.length; i++) { + userAssetBalances[i].asset = assets[i]; + (userAssetBalances[i].userBalance, userAssetBalances[i].totalSupply) = IScaledBalanceToken( + assets[i] + ).getScaledUserBalanceAndSupply(user); + } + return userAssetBalances; + } + + /** + * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount Amount of rewards to claim + * @param claimer Address of the claimer who claims rewards on behalf of user + * @param user Address to check and claim rewards + * @param to Address that will be receiving the rewards + * @param reward Address of the reward token + * @return Rewards claimed + **/ + function _claimRewards( + address[] calldata assets, + uint256 amount, + address claimer, + address user, + address to, + address reward + ) internal returns (uint256) { + if (amount == 0) { + return 0; + } + uint256 totalRewards; + + _updateDataMultiple(user, _getUserAssetBalances(assets, user)); + for (uint256 i = 0; i < assets.length; i++) { + address asset = assets[i]; + totalRewards += _assets[asset].rewards[reward].usersData[user].accrued; + + if (totalRewards <= amount) { + _assets[asset].rewards[reward].usersData[user].accrued = 0; + } else { + uint256 difference = totalRewards - amount; + totalRewards -= difference; + _assets[asset].rewards[reward].usersData[user].accrued = difference.toUint128(); + break; + } + } + + if (totalRewards == 0) { + return 0; + } + + _transferRewards(to, reward, totalRewards); + emit RewardsClaimed(user, reward, to, claimer, totalRewards); + + return totalRewards; + } + + /** + * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. + * @param assets List of assets to check eligible distributions before claiming rewards + * @param claimer Address of the claimer on behalf of user + * @param user Address to check and claim rewards + * @param to Address that will be receiving the rewards + * @return + * rewardsList List of reward addresses + * claimedAmount List of claimed amounts, follows "rewardsList" items order + **/ + function _claimAllRewards( + address[] calldata assets, + address claimer, + address user, + address to + ) internal returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { + uint256 rewardsListLength = _rewardsList.length; + rewardsList = new address[](rewardsListLength); + claimedAmounts = new uint256[](rewardsListLength); + + _updateDataMultiple(user, _getUserAssetBalances(assets, user)); + + for (uint256 i = 0; i < assets.length; i++) { + address asset = assets[i]; + for (uint256 j = 0; j < rewardsListLength; j++) { + if (rewardsList[j] == address(0)) { + rewardsList[j] = _rewardsList[j]; + } + uint256 rewardAmount = _assets[asset].rewards[rewardsList[j]].usersData[user].accrued; + if (rewardAmount != 0) { + claimedAmounts[j] += rewardAmount; + _assets[asset].rewards[rewardsList[j]].usersData[user].accrued = 0; + } + } + } + for (uint256 i = 0; i < rewardsListLength; i++) { + _transferRewards(to, rewardsList[i], claimedAmounts[i]); + emit RewardsClaimed(user, rewardsList[i], to, claimer, claimedAmounts[i]); + } + return (rewardsList, claimedAmounts); + } + + /** + * @dev Function to transfer rewards to the desired account using delegatecall and + * @param to Account address to send the rewards + * @param reward Address of the reward token + * @param amount Amount of rewards to transfer + */ + function _transferRewards(address to, address reward, uint256 amount) internal { + ITransferStrategyBase transferStrategy = _transferStrategy[reward]; + + bool success = transferStrategy.performTransfer(to, reward, amount); + + require(success == true, 'TRANSFER_ERROR'); + } + + /** + * @dev Returns true if `account` is a contract. + * @param account The address of the account + * @return bool, true if contract, false otherwise + */ + function _isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + // solhint-disable-next-line no-inline-assembly + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Internal function to call the optional install hook at the TransferStrategy + * @param reward The address of the reward token + * @param transferStrategy The address of the reward TransferStrategy + */ + function _installTransferStrategy( + address reward, + ITransferStrategyBase transferStrategy + ) internal { + require(address(transferStrategy) != address(0), 'STRATEGY_CAN_NOT_BE_ZERO'); + require(_isContract(address(transferStrategy)) == true, 'STRATEGY_MUST_BE_CONTRACT'); + + _transferStrategy[reward] = transferStrategy; + + emit TransferStrategyInstalled(reward, address(transferStrategy)); + } + + /** + * @dev Update the Price Oracle of a reward token. The Price Oracle must follow Chainlink IEACAggregatorProxy interface. + * @notice The Price Oracle of a reward is used for displaying correct data about the incentives at the UI frontend. + * @param reward The address of the reward token + * @param rewardOracle The address of the price oracle + */ + + function _setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) internal { + require(rewardOracle.latestAnswer() > 0, 'ORACLE_MUST_RETURN_PRICE'); + _rewardOracle[reward] = rewardOracle; + emit RewardOracleUpdated(reward, address(rewardOracle)); + } +} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol new file mode 100644 index 00000000..c89baee6 --- /dev/null +++ b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol new file mode 100644 index 00000000..1070227a --- /dev/null +++ b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsController.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsController.sol new file mode 100644 index 00000000..3a817f60 --- /dev/null +++ b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsController.sol @@ -0,0 +1,355 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {VersionedInitializable} from '../misc/aave-upgradeability/VersionedInitializable.sol'; +import {SafeCast} from '../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IScaledBalanceToken} from '../interfaces/IScaledBalanceToken.sol'; +import {RewardsDistributor} from './RewardsDistributor.sol'; +import {IRewardsController} from './interfaces/IRewardsController.sol'; +import {ITransferStrategyBase} from './interfaces/ITransferStrategyBase.sol'; +import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol'; +import {IEACAggregatorProxy} from '../helpers/interfaces/IEACAggregatorProxy.sol'; + +/** + * @title RewardsController + * @notice Abstract contract template to build Distributors contracts for ERC20 rewards to protocol participants + * @author Aave + **/ +contract RewardsController is RewardsDistributor, VersionedInitializable, IRewardsController { + using SafeCast for uint256; + + uint256 public constant REVISION = 1; + + // This mapping allows whitelisted addresses to claim on behalf of others + // useful for contracts that hold tokens to be rewarded but don't have any native logic to claim Liquidity Mining rewards + mapping(address => address) internal _authorizedClaimers; + + // reward => transfer strategy implementation contract + // The TransferStrategy contract abstracts the logic regarding + // the source of the reward and how to transfer it to the user. + mapping(address => ITransferStrategyBase) internal _transferStrategy; + + // This mapping contains the price oracle per reward. + // A price oracle is enforced for integrators to be able to show incentives at + // the current Aave UI without the need to setup an external price registry + // At the moment of reward configuration, the Incentives Controller performs + // a check to see if the provided reward oracle contains `latestAnswer`. + mapping(address => IEACAggregatorProxy) internal _rewardOracle; + + modifier onlyAuthorizedClaimers(address claimer, address user) { + require(_authorizedClaimers[user] == claimer, 'CLAIMER_UNAUTHORIZED'); + _; + } + + constructor(address emissionManager) RewardsDistributor(emissionManager) {} + + /** + * @dev Initialize for RewardsController + * @dev It expects an address as argument since its initialized via PoolAddressesProvider._updateImpl() + **/ + function initialize(address) external initializer {} + + /// @inheritdoc IRewardsController + function getClaimer(address user) external view override returns (address) { + return _authorizedClaimers[user]; + } + + /** + * @dev Returns the revision of the implementation contract + * @return uint256, current revision version + */ + function getRevision() internal pure override returns (uint256) { + return REVISION; + } + + /// @inheritdoc IRewardsController + function getRewardOracle(address reward) external view override returns (address) { + return address(_rewardOracle[reward]); + } + + /// @inheritdoc IRewardsController + function getTransferStrategy(address reward) external view override returns (address) { + return address(_transferStrategy[reward]); + } + + /// @inheritdoc IRewardsController + function configureAssets( + RewardsDataTypes.RewardsConfigInput[] memory config + ) external override onlyEmissionManager { + for (uint256 i = 0; i < config.length; i++) { + // Get the current Scaled Total Supply of AToken or Debt token + config[i].totalSupply = IScaledBalanceToken(config[i].asset).scaledTotalSupply(); + + // Install TransferStrategy logic at IncentivesController + _installTransferStrategy(config[i].reward, config[i].transferStrategy); + + // Set reward oracle, enforces input oracle to have latestPrice function + _setRewardOracle(config[i].reward, config[i].rewardOracle); + } + _configureAssets(config); + } + + /// @inheritdoc IRewardsController + function setTransferStrategy( + address reward, + ITransferStrategyBase transferStrategy + ) external onlyEmissionManager { + _installTransferStrategy(reward, transferStrategy); + } + + /// @inheritdoc IRewardsController + function setRewardOracle( + address reward, + IEACAggregatorProxy rewardOracle + ) external onlyEmissionManager { + _setRewardOracle(reward, rewardOracle); + } + + /// @inheritdoc IRewardsController + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external override { + _updateData(msg.sender, user, userBalance, totalSupply); + } + + /// @inheritdoc IRewardsController + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external override returns (uint256) { + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimRewards(assets, amount, msg.sender, msg.sender, to, reward); + } + + /// @inheritdoc IRewardsController + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external override onlyAuthorizedClaimers(msg.sender, user) returns (uint256) { + require(user != address(0), 'INVALID_USER_ADDRESS'); + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimRewards(assets, amount, msg.sender, user, to, reward); + } + + /// @inheritdoc IRewardsController + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external override returns (uint256) { + return _claimRewards(assets, amount, msg.sender, msg.sender, msg.sender, reward); + } + + /// @inheritdoc IRewardsController + function claimAllRewards( + address[] calldata assets, + address to + ) external override returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimAllRewards(assets, msg.sender, msg.sender, to); + } + + /// @inheritdoc IRewardsController + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) + external + override + onlyAuthorizedClaimers(msg.sender, user) + returns (address[] memory rewardsList, uint256[] memory claimedAmounts) + { + require(user != address(0), 'INVALID_USER_ADDRESS'); + require(to != address(0), 'INVALID_TO_ADDRESS'); + return _claimAllRewards(assets, msg.sender, user, to); + } + + /// @inheritdoc IRewardsController + function claimAllRewardsToSelf( + address[] calldata assets + ) external override returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { + return _claimAllRewards(assets, msg.sender, msg.sender, msg.sender); + } + + /// @inheritdoc IRewardsController + function setClaimer(address user, address caller) external override onlyEmissionManager { + _authorizedClaimers[user] = caller; + emit ClaimerSet(user, caller); + } + + /** + * @dev Get user balances and total supply of all the assets specified by the assets parameter + * @param assets List of assets to retrieve user balance and total supply + * @param user Address of the user + * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets + */ + function _getUserAssetBalances( + address[] calldata assets, + address user + ) internal view override returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances) { + userAssetBalances = new RewardsDataTypes.UserAssetBalance[](assets.length); + for (uint256 i = 0; i < assets.length; i++) { + userAssetBalances[i].asset = assets[i]; + (userAssetBalances[i].userBalance, userAssetBalances[i].totalSupply) = IScaledBalanceToken( + assets[i] + ).getScaledUserBalanceAndSupply(user); + } + return userAssetBalances; + } + + /** + * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount Amount of rewards to claim + * @param claimer Address of the claimer who claims rewards on behalf of user + * @param user Address to check and claim rewards + * @param to Address that will be receiving the rewards + * @param reward Address of the reward token + * @return Rewards claimed + **/ + function _claimRewards( + address[] calldata assets, + uint256 amount, + address claimer, + address user, + address to, + address reward + ) internal returns (uint256) { + if (amount == 0) { + return 0; + } + uint256 totalRewards; + + _updateDataMultiple(user, _getUserAssetBalances(assets, user)); + for (uint256 i = 0; i < assets.length; i++) { + address asset = assets[i]; + totalRewards += _assets[asset].rewards[reward].usersData[user].accrued; + + if (totalRewards <= amount) { + _assets[asset].rewards[reward].usersData[user].accrued = 0; + } else { + uint256 difference = totalRewards - amount; + totalRewards -= difference; + _assets[asset].rewards[reward].usersData[user].accrued = difference.toUint128(); + break; + } + } + + if (totalRewards == 0) { + return 0; + } + + _transferRewards(to, reward, totalRewards); + emit RewardsClaimed(user, reward, to, claimer, totalRewards); + + return totalRewards; + } + + /** + * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. + * @param assets List of assets to check eligible distributions before claiming rewards + * @param claimer Address of the claimer on behalf of user + * @param user Address to check and claim rewards + * @param to Address that will be receiving the rewards + * @return + * rewardsList List of reward addresses + * claimedAmount List of claimed amounts, follows "rewardsList" items order + **/ + function _claimAllRewards( + address[] calldata assets, + address claimer, + address user, + address to + ) internal returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { + uint256 rewardsListLength = _rewardsList.length; + rewardsList = new address[](rewardsListLength); + claimedAmounts = new uint256[](rewardsListLength); + + _updateDataMultiple(user, _getUserAssetBalances(assets, user)); + + for (uint256 i = 0; i < assets.length; i++) { + address asset = assets[i]; + for (uint256 j = 0; j < rewardsListLength; j++) { + if (rewardsList[j] == address(0)) { + rewardsList[j] = _rewardsList[j]; + } + uint256 rewardAmount = _assets[asset].rewards[rewardsList[j]].usersData[user].accrued; + if (rewardAmount != 0) { + claimedAmounts[j] += rewardAmount; + _assets[asset].rewards[rewardsList[j]].usersData[user].accrued = 0; + } + } + } + for (uint256 i = 0; i < rewardsListLength; i++) { + _transferRewards(to, rewardsList[i], claimedAmounts[i]); + emit RewardsClaimed(user, rewardsList[i], to, claimer, claimedAmounts[i]); + } + return (rewardsList, claimedAmounts); + } + + /** + * @dev Function to transfer rewards to the desired account using delegatecall and + * @param to Account address to send the rewards + * @param reward Address of the reward token + * @param amount Amount of rewards to transfer + */ + function _transferRewards(address to, address reward, uint256 amount) internal { + ITransferStrategyBase transferStrategy = _transferStrategy[reward]; + + bool success = transferStrategy.performTransfer(to, reward, amount); + + require(success == true, 'TRANSFER_ERROR'); + } + + /** + * @dev Returns true if `account` is a contract. + * @param account The address of the account + * @return bool, true if contract, false otherwise + */ + function _isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + // solhint-disable-next-line no-inline-assembly + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Internal function to call the optional install hook at the TransferStrategy + * @param reward The address of the reward token + * @param transferStrategy The address of the reward TransferStrategy + */ + function _installTransferStrategy( + address reward, + ITransferStrategyBase transferStrategy + ) internal { + require(address(transferStrategy) != address(0), 'STRATEGY_CAN_NOT_BE_ZERO'); + require(_isContract(address(transferStrategy)) == true, 'STRATEGY_MUST_BE_CONTRACT'); + + _transferStrategy[reward] = transferStrategy; + + emit TransferStrategyInstalled(reward, address(transferStrategy)); + } + + /** + * @dev Update the Price Oracle of a reward token. The Price Oracle must follow Chainlink IEACAggregatorProxy interface. + * @notice The Price Oracle of a reward is used for displaying correct data about the incentives at the UI frontend. + * @param reward The address of the reward token + * @param rewardOracle The address of the price oracle + */ + + function _setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) internal { + require(rewardOracle.latestAnswer() > 0, 'ORACLE_MUST_RETURN_PRICE'); + _rewardOracle[reward] = rewardOracle; + emit RewardOracleUpdated(reward, address(rewardOracle)); + } +} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsDistributor.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsDistributor.sol new file mode 100644 index 00000000..3969a6fd --- /dev/null +++ b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsDistributor.sol @@ -0,0 +1,537 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IScaledBalanceToken} from '../interfaces/IScaledBalanceToken.sol'; +import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IRewardsDistributor} from './interfaces/IRewardsDistributor.sol'; +import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol'; + +/** + * @title RewardsDistributor + * @notice Accounting contract to manage multiple staking distributions with multiple rewards + * @author Aave + **/ +abstract contract RewardsDistributor is IRewardsDistributor { + using SafeCast for uint256; + + // Manager of incentives + address public immutable EMISSION_MANAGER; + // Deprecated: This storage slot is kept for backwards compatibility purposes. + address internal _emissionManager; + + // Map of rewarded asset addresses and their data (assetAddress => assetData) + mapping(address => RewardsDataTypes.AssetData) internal _assets; + + // Map of reward assets (rewardAddress => enabled) + mapping(address => bool) internal _isRewardEnabled; + + // Rewards list + address[] internal _rewardsList; + + // Assets list + address[] internal _assetsList; + + modifier onlyEmissionManager() { + require(msg.sender == EMISSION_MANAGER, 'ONLY_EMISSION_MANAGER'); + _; + } + + constructor(address emissionManager) { + EMISSION_MANAGER = emissionManager; + } + + /// @inheritdoc IRewardsDistributor + function getRewardsData( + address asset, + address reward + ) external view override returns (uint256, uint256, uint256, uint256) { + return ( + _assets[asset].rewards[reward].index, + _assets[asset].rewards[reward].emissionPerSecond, + _assets[asset].rewards[reward].lastUpdateTimestamp, + _assets[asset].rewards[reward].distributionEnd + ); + } + + /// @inheritdoc IRewardsDistributor + function getAssetIndex( + address asset, + address reward + ) external view override returns (uint256, uint256) { + RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; + return + _getAssetIndex( + rewardData, + IScaledBalanceToken(asset).scaledTotalSupply(), + 10 ** _assets[asset].decimals + ); + } + + /// @inheritdoc IRewardsDistributor + function getDistributionEnd( + address asset, + address reward + ) external view override returns (uint256) { + return _assets[asset].rewards[reward].distributionEnd; + } + + /// @inheritdoc IRewardsDistributor + function getRewardsByAsset(address asset) external view override returns (address[] memory) { + uint128 rewardsCount = _assets[asset].availableRewardsCount; + address[] memory availableRewards = new address[](rewardsCount); + + for (uint128 i = 0; i < rewardsCount; i++) { + availableRewards[i] = _assets[asset].availableRewards[i]; + } + return availableRewards; + } + + /// @inheritdoc IRewardsDistributor + function getRewardsList() external view override returns (address[] memory) { + return _rewardsList; + } + + /// @inheritdoc IRewardsDistributor + function getUserAssetIndex( + address user, + address asset, + address reward + ) external view override returns (uint256) { + return _assets[asset].rewards[reward].usersData[user].index; + } + + /// @inheritdoc IRewardsDistributor + function getUserAccruedRewards( + address user, + address reward + ) external view override returns (uint256) { + uint256 totalAccrued; + for (uint256 i = 0; i < _assetsList.length; i++) { + totalAccrued += _assets[_assetsList[i]].rewards[reward].usersData[user].accrued; + } + + return totalAccrued; + } + + /// @inheritdoc IRewardsDistributor + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view override returns (uint256) { + return _getUserReward(user, reward, _getUserAssetBalances(assets, user)); + } + + /// @inheritdoc IRewardsDistributor + function getAllUserRewards( + address[] calldata assets, + address user + ) + external + view + override + returns (address[] memory rewardsList, uint256[] memory unclaimedAmounts) + { + RewardsDataTypes.UserAssetBalance[] memory userAssetBalances = _getUserAssetBalances( + assets, + user + ); + rewardsList = new address[](_rewardsList.length); + unclaimedAmounts = new uint256[](rewardsList.length); + + // Add unrealized rewards from user to unclaimedRewards + for (uint256 i = 0; i < userAssetBalances.length; i++) { + for (uint256 r = 0; r < rewardsList.length; r++) { + rewardsList[r] = _rewardsList[r]; + unclaimedAmounts[r] += _assets[userAssetBalances[i].asset] + .rewards[rewardsList[r]] + .usersData[user] + .accrued; + + if (userAssetBalances[i].userBalance == 0) { + continue; + } + unclaimedAmounts[r] += _getPendingRewards(user, rewardsList[r], userAssetBalances[i]); + } + } + return (rewardsList, unclaimedAmounts); + } + + /// @inheritdoc IRewardsDistributor + function setDistributionEnd( + address asset, + address reward, + uint32 newDistributionEnd + ) external override onlyEmissionManager { + uint256 oldDistributionEnd = _assets[asset].rewards[reward].distributionEnd; + _assets[asset].rewards[reward].distributionEnd = newDistributionEnd; + + emit AssetConfigUpdated( + asset, + reward, + _assets[asset].rewards[reward].emissionPerSecond, + _assets[asset].rewards[reward].emissionPerSecond, + oldDistributionEnd, + newDistributionEnd, + _assets[asset].rewards[reward].index + ); + } + + /// @inheritdoc IRewardsDistributor + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external override onlyEmissionManager { + require(rewards.length == newEmissionsPerSecond.length, 'INVALID_INPUT'); + for (uint256 i = 0; i < rewards.length; i++) { + RewardsDataTypes.AssetData storage assetConfig = _assets[asset]; + RewardsDataTypes.RewardData storage rewardConfig = _assets[asset].rewards[rewards[i]]; + uint256 decimals = assetConfig.decimals; + require( + decimals != 0 && rewardConfig.lastUpdateTimestamp != 0, + 'DISTRIBUTION_DOES_NOT_EXIST' + ); + + (uint256 newIndex, ) = _updateRewardData( + rewardConfig, + IScaledBalanceToken(asset).scaledTotalSupply(), + 10 ** decimals + ); + + uint256 oldEmissionPerSecond = rewardConfig.emissionPerSecond; + rewardConfig.emissionPerSecond = newEmissionsPerSecond[i]; + + emit AssetConfigUpdated( + asset, + rewards[i], + oldEmissionPerSecond, + newEmissionsPerSecond[i], + rewardConfig.distributionEnd, + rewardConfig.distributionEnd, + newIndex + ); + } + } + + /** + * @dev Configure the _assets for a specific emission + * @param rewardsInput The array of each asset configuration + **/ + function _configureAssets(RewardsDataTypes.RewardsConfigInput[] memory rewardsInput) internal { + for (uint256 i = 0; i < rewardsInput.length; i++) { + if (_assets[rewardsInput[i].asset].decimals == 0) { + //never initialized before, adding to the list of assets + _assetsList.push(rewardsInput[i].asset); + } + + uint256 decimals = _assets[rewardsInput[i].asset].decimals = IERC20Detailed( + rewardsInput[i].asset + ).decimals(); + + RewardsDataTypes.RewardData storage rewardConfig = _assets[rewardsInput[i].asset].rewards[ + rewardsInput[i].reward + ]; + + // Add reward address to asset available rewards if latestUpdateTimestamp is zero + if (rewardConfig.lastUpdateTimestamp == 0) { + _assets[rewardsInput[i].asset].availableRewards[ + _assets[rewardsInput[i].asset].availableRewardsCount + ] = rewardsInput[i].reward; + _assets[rewardsInput[i].asset].availableRewardsCount++; + } + + // Add reward address to global rewards list if still not enabled + if (_isRewardEnabled[rewardsInput[i].reward] == false) { + _isRewardEnabled[rewardsInput[i].reward] = true; + _rewardsList.push(rewardsInput[i].reward); + } + + // Due emissions is still zero, updates only latestUpdateTimestamp + (uint256 newIndex, ) = _updateRewardData( + rewardConfig, + rewardsInput[i].totalSupply, + 10 ** decimals + ); + + // Configure emission and distribution end of the reward per asset + uint88 oldEmissionsPerSecond = rewardConfig.emissionPerSecond; + uint32 oldDistributionEnd = rewardConfig.distributionEnd; + rewardConfig.emissionPerSecond = rewardsInput[i].emissionPerSecond; + rewardConfig.distributionEnd = rewardsInput[i].distributionEnd; + + emit AssetConfigUpdated( + rewardsInput[i].asset, + rewardsInput[i].reward, + oldEmissionsPerSecond, + rewardsInput[i].emissionPerSecond, + oldDistributionEnd, + rewardsInput[i].distributionEnd, + newIndex + ); + } + } + + /** + * @dev Updates the state of the distribution for the specified reward + * @param rewardData Storage pointer to the distribution reward config + * @param totalSupply Current total of underlying assets for this distribution + * @param assetUnit One unit of asset (10**decimals) + * @return The new distribution index + * @return True if the index was updated, false otherwise + **/ + function _updateRewardData( + RewardsDataTypes.RewardData storage rewardData, + uint256 totalSupply, + uint256 assetUnit + ) internal returns (uint256, bool) { + (uint256 oldIndex, uint256 newIndex) = _getAssetIndex(rewardData, totalSupply, assetUnit); + bool indexUpdated; + if (newIndex != oldIndex) { + require(newIndex <= type(uint104).max, 'INDEX_OVERFLOW'); + indexUpdated = true; + + //optimization: storing one after another saves one SSTORE + rewardData.index = uint104(newIndex); + rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); + } else { + rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); + } + + return (newIndex, indexUpdated); + } + + /** + * @dev Updates the state of the distribution for the specific user + * @param rewardData Storage pointer to the distribution reward config + * @param user The address of the user + * @param userBalance The user balance of the asset + * @param newAssetIndex The new index of the asset distribution + * @param assetUnit One unit of asset (10**decimals) + * @return The rewards accrued since the last update + **/ + function _updateUserData( + RewardsDataTypes.RewardData storage rewardData, + address user, + uint256 userBalance, + uint256 newAssetIndex, + uint256 assetUnit + ) internal returns (uint256, bool) { + uint256 userIndex = rewardData.usersData[user].index; + uint256 rewardsAccrued; + bool dataUpdated; + if ((dataUpdated = userIndex != newAssetIndex)) { + // already checked for overflow in _updateRewardData + rewardData.usersData[user].index = uint104(newAssetIndex); + if (userBalance != 0) { + rewardsAccrued = _getRewards(userBalance, newAssetIndex, userIndex, assetUnit); + + rewardData.usersData[user].accrued += rewardsAccrued.toUint128(); + } + } + return (rewardsAccrued, dataUpdated); + } + + /** + * @dev Iterates and accrues all the rewards for asset of the specific user + * @param asset The address of the reference asset of the distribution + * @param user The user address + * @param userBalance The current user asset balance + * @param totalSupply Total supply of the asset + **/ + function _updateData( + address asset, + address user, + uint256 userBalance, + uint256 totalSupply + ) internal { + uint256 assetUnit; + uint256 numAvailableRewards = _assets[asset].availableRewardsCount; + unchecked { + assetUnit = 10 ** _assets[asset].decimals; + } + + if (numAvailableRewards == 0) { + return; + } + unchecked { + for (uint128 r = 0; r < numAvailableRewards; r++) { + address reward = _assets[asset].availableRewards[r]; + RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; + + (uint256 newAssetIndex, bool rewardDataUpdated) = _updateRewardData( + rewardData, + totalSupply, + assetUnit + ); + + (uint256 rewardsAccrued, bool userDataUpdated) = _updateUserData( + rewardData, + user, + userBalance, + newAssetIndex, + assetUnit + ); + + if (rewardDataUpdated || userDataUpdated) { + emit Accrued(asset, reward, user, newAssetIndex, newAssetIndex, rewardsAccrued); + } + } + } + } + + /** + * @dev Accrues all the rewards of the assets specified in the userAssetBalances list + * @param user The address of the user + * @param userAssetBalances List of structs with the user balance and total supply of a set of assets + **/ + function _updateDataMultiple( + address user, + RewardsDataTypes.UserAssetBalance[] memory userAssetBalances + ) internal { + for (uint256 i = 0; i < userAssetBalances.length; i++) { + _updateData( + userAssetBalances[i].asset, + user, + userAssetBalances[i].userBalance, + userAssetBalances[i].totalSupply + ); + } + } + + /** + * @dev Return the accrued unclaimed amount of a reward from a user over a list of distribution + * @param user The address of the user + * @param reward The address of the reward token + * @param userAssetBalances List of structs with the user balance and total supply of a set of assets + * @return unclaimedRewards The accrued rewards for the user until the moment + **/ + function _getUserReward( + address user, + address reward, + RewardsDataTypes.UserAssetBalance[] memory userAssetBalances + ) internal view returns (uint256 unclaimedRewards) { + // Add unrealized rewards + for (uint256 i = 0; i < userAssetBalances.length; i++) { + if (userAssetBalances[i].userBalance == 0) { + unclaimedRewards += _assets[userAssetBalances[i].asset] + .rewards[reward] + .usersData[user] + .accrued; + } else { + unclaimedRewards += + _getPendingRewards(user, reward, userAssetBalances[i]) + + _assets[userAssetBalances[i].asset].rewards[reward].usersData[user].accrued; + } + } + + return unclaimedRewards; + } + + /** + * @dev Calculates the pending (not yet accrued) rewards since the last user action + * @param user The address of the user + * @param reward The address of the reward token + * @param userAssetBalance struct with the user balance and total supply of the incentivized asset + * @return The pending rewards for the user since the last user action + **/ + function _getPendingRewards( + address user, + address reward, + RewardsDataTypes.UserAssetBalance memory userAssetBalance + ) internal view returns (uint256) { + RewardsDataTypes.RewardData storage rewardData = _assets[userAssetBalance.asset].rewards[ + reward + ]; + uint256 assetUnit = 10 ** _assets[userAssetBalance.asset].decimals; + (, uint256 nextIndex) = _getAssetIndex(rewardData, userAssetBalance.totalSupply, assetUnit); + + return + _getRewards( + userAssetBalance.userBalance, + nextIndex, + rewardData.usersData[user].index, + assetUnit + ); + } + + /** + * @dev Internal function for the calculation of user's rewards on a distribution + * @param userBalance Balance of the user asset on a distribution + * @param reserveIndex Current index of the distribution + * @param userIndex Index stored for the user, representation his staking moment + * @param assetUnit One unit of asset (10**decimals) + * @return The rewards + **/ + function _getRewards( + uint256 userBalance, + uint256 reserveIndex, + uint256 userIndex, + uint256 assetUnit + ) internal pure returns (uint256) { + uint256 result = userBalance * (reserveIndex - userIndex); + assembly { + result := div(result, assetUnit) + } + return result; + } + + /** + * @dev Calculates the next value of an specific distribution index, with validations + * @param rewardData Storage pointer to the distribution reward config + * @param totalSupply of the asset being rewarded + * @param assetUnit One unit of asset (10**decimals) + * @return The new index. + **/ + function _getAssetIndex( + RewardsDataTypes.RewardData storage rewardData, + uint256 totalSupply, + uint256 assetUnit + ) internal view returns (uint256, uint256) { + uint256 oldIndex = rewardData.index; + uint256 distributionEnd = rewardData.distributionEnd; + uint256 emissionPerSecond = rewardData.emissionPerSecond; + uint256 lastUpdateTimestamp = rewardData.lastUpdateTimestamp; + + if ( + emissionPerSecond == 0 || + totalSupply == 0 || + lastUpdateTimestamp == block.timestamp || + lastUpdateTimestamp >= distributionEnd + ) { + return (oldIndex, oldIndex); + } + + uint256 currentTimestamp = block.timestamp > distributionEnd + ? distributionEnd + : block.timestamp; + uint256 timeDelta = currentTimestamp - lastUpdateTimestamp; + uint256 firstTerm = emissionPerSecond * timeDelta * assetUnit; + assembly { + firstTerm := div(firstTerm, totalSupply) + } + return (oldIndex, (firstTerm + oldIndex)); + } + + /** + * @dev Get user balances and total supply of all the assets specified by the assets parameter + * @param assets List of assets to retrieve user balance and total supply + * @param user Address of the user + * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets + */ + function _getUserAssetBalances( + address[] calldata assets, + address user + ) internal view virtual returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances); + + /// @inheritdoc IRewardsDistributor + function getAssetDecimals(address asset) external view returns (uint8) { + return _assets[asset].decimals; + } + + /// @inheritdoc IRewardsDistributor + function getEmissionManager() external view returns (address) { + return EMISSION_MANAGER; + } +} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsController.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsController.sol new file mode 100644 index 00000000..cdb2ac29 --- /dev/null +++ b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsController.sol @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IRewardsDistributor} from './IRewardsDistributor.sol'; +import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; +import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; +import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; + +/** + * @title IRewardsController + * @author Aave + * @notice Defines the basic interface for a Rewards Controller. + */ +interface IRewardsController is IRewardsDistributor { + /** + * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user + * @param user The address of the user + * @param claimer The address of the claimer + */ + event ClaimerSet(address indexed user, address indexed claimer); + + /** + * @dev Emitted when rewards are claimed + * @param user The address of the user rewards has been claimed on behalf of + * @param reward The address of the token reward is claimed + * @param to The address of the receiver of the rewards + * @param claimer The address of the claimer + * @param amount The amount of rewards claimed + */ + event RewardsClaimed( + address indexed user, + address indexed reward, + address indexed to, + address claimer, + uint256 amount + ); + + /** + * @dev Emitted when a transfer strategy is installed for the reward distribution + * @param reward The address of the token reward + * @param transferStrategy The address of TransferStrategy contract + */ + event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); + + /** + * @dev Emitted when the reward oracle is updated + * @param reward The address of the token reward + * @param rewardOracle The address of oracle + */ + event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Get the price aggregator oracle address + * @param reward The address of the reward + * @return The price oracle of the reward + */ + function getRewardOracle(address reward) external view returns (address); + + /** + * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) + * @param user The address of the user + * @return The claimer address + */ + function getClaimer(address user) external view returns (address); + + /** + * @dev Returns the Transfer Strategy implementation contract address being used for a reward address + * @param reward The address of the reward + * @return The address of the TransferStrategy contract + */ + function getTransferStrategy(address reward) external view returns (address); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + **/ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + + /** + * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The + * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external returns (uint256); + + /** + * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" + **/ + function claimAllRewards( + address[] calldata assets, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must + * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsToSelf( + address[] calldata assets + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); +} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsDistributor.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsDistributor.sol new file mode 100644 index 00000000..5cb58856 --- /dev/null +++ b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsDistributor.sol @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title IRewardsDistributor + * @author Aave + * @notice Defines the basic interface for a Rewards Distributor. + */ +interface IRewardsDistributor { + /** + * @dev Emitted when the configuration of the rewards of an asset is updated. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param oldEmission The old emissions per second value of the reward distribution + * @param newEmission The new emissions per second value of the reward distribution + * @param oldDistributionEnd The old end timestamp of the reward distribution + * @param newDistributionEnd The new end timestamp of the reward distribution + * @param assetIndex The index of the asset distribution + */ + event AssetConfigUpdated( + address indexed asset, + address indexed reward, + uint256 oldEmission, + uint256 newEmission, + uint256 oldDistributionEnd, + uint256 newDistributionEnd, + uint256 assetIndex + ); + + /** + * @dev Emitted when rewards of an asset are accrued on behalf of a user. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param user The address of the user that rewards are accrued on behalf of + * @param assetIndex The index of the asset distribution + * @param userIndex The index of the asset distribution on behalf of the user + * @param rewardsAccrued The amount of rewards accrued + */ + event Accrued( + address indexed asset, + address indexed reward, + address indexed user, + uint256 assetIndex, + uint256 userIndex, + uint256 rewardsAccrued + ); + + /** + * @dev Sets the end date for the distribution + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Gets the end date for the distribution + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The timestamp with the end of the distribution, in unix time format + **/ + function getDistributionEnd(address asset, address reward) external view returns (uint256); + + /** + * @dev Returns the index of a user on a reward distribution + * @param user Address of the user + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The current user asset index, not including new distributions + **/ + function getUserAssetIndex( + address user, + address asset, + address reward + ) external view returns (uint256); + + /** + * @dev Returns the configuration of the distribution reward for a certain asset + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The index of the asset distribution + * @return The emission per second of the reward distribution + * @return The timestamp of the last update of the index + * @return The timestamp of the distribution end + **/ + function getRewardsData( + address asset, + address reward + ) external view returns (uint256, uint256, uint256, uint256); + + /** + * @dev Calculates the next value of an specific distribution index, with validations. + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The old index of the asset distribution + * @return The new index of the asset distribution + **/ + function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); + + /** + * @dev Returns the list of available reward token addresses of an incentivized asset + * @param asset The incentivized asset + * @return List of rewards addresses of the input asset + **/ + function getRewardsByAsset(address asset) external view returns (address[] memory); + + /** + * @dev Returns the list of available reward addresses + * @return List of rewards supported in this contract + **/ + function getRewardsList() external view returns (address[] memory); + + /** + * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. + * @param user The address of the user + * @param reward The address of the reward token + * @return Unclaimed rewards, not including new distributions + **/ + function getUserAccruedRewards(address user, address reward) external view returns (uint256); + + /** + * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @param reward The address of the reward token + * @return The rewards amount + **/ + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view returns (uint256); + + /** + * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @return The list of reward addresses + * @return The list of unclaimed amount of rewards + **/ + function getAllUserRewards( + address[] calldata assets, + address user + ) external view returns (address[] memory, uint256[] memory); + + /** + * @dev Returns the decimals of an asset to calculate the distribution delta + * @param asset The address to retrieve decimals + * @return The decimals of an underlying asset + */ + function getAssetDecimals(address asset) external view returns (uint8); + + /** + * @dev Returns the address of the emission manager + * @return The address of the EmissionManager + */ + function EMISSION_MANAGER() external view returns (address); + + /** + * @dev Returns the address of the emission manager. + * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. + * @return The address of the EmissionManager + */ + function getEmissionManager() external view returns (address); +} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/ITransferStrategyBase.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/ITransferStrategyBase.sol new file mode 100644 index 00000000..d2848fef --- /dev/null +++ b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/ITransferStrategyBase.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +interface ITransferStrategyBase { + event EmergencyWithdrawal( + address indexed caller, + address indexed token, + address indexed to, + uint256 amount + ); + + /** + * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation + * @param to Account to transfer rewards + * @param reward Address of the reward token + * @param amount Amount to transfer to the "to" address parameter + * @return Returns true bool if transfer logic succeeds + */ + function performTransfer(address to, address reward, uint256 amount) external returns (bool); + + /** + * @return Returns the address of the Incentives Controller + */ + function getIncentivesController() external view returns (address); + + /** + * @return Returns the address of the Rewards admin + */ + function getRewardsAdmin() external view returns (address); + + /** + * @dev Perform an emergency token withdrawal only callable by the Rewards admin + * @param token Address of the token to withdraw funds from this contract + * @param to Address of the recipient of the withdrawal + * @param amount Amount of the withdrawal + */ + function emergencyWithdrawal(address token, address to, uint256 amount) external; +} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/libraries/RewardsDataTypes.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/libraries/RewardsDataTypes.sol new file mode 100644 index 00000000..38fe87c5 --- /dev/null +++ b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/libraries/RewardsDataTypes.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; +import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; + +library RewardsDataTypes { + struct RewardsConfigInput { + uint88 emissionPerSecond; + uint256 totalSupply; + uint32 distributionEnd; + address asset; + address reward; + ITransferStrategyBase transferStrategy; + IEACAggregatorProxy rewardOracle; + } + + struct UserAssetBalance { + address asset; + uint256 userBalance; + uint256 totalSupply; + } + + struct UserData { + // Liquidity index of the reward distribution for the user + uint104 index; + // Amount of accrued rewards for the user since last user index update + uint128 accrued; + } + + struct RewardData { + // Liquidity index of the reward distribution + uint104 index; + // Amount of reward tokens distributed per second + uint88 emissionPerSecond; + // Timestamp of the last reward index update + uint32 lastUpdateTimestamp; + // The end of the distribution of rewards (in seconds) + uint32 distributionEnd; + // Map of user addresses and their rewards data (userAddress => userData) + mapping(address => UserData) usersData; + } + + struct AssetData { + // Map of reward token addresses and their data (rewardTokenAddress => rewardData) + mapping(address => RewardData) rewards; + // List of reward token addresses for the asset + mapping(uint128 => address) availableRewards; + // Count of reward tokens for the asset + uint128 availableRewardsCount; + // Number of decimals of the asset + uint8 decimals; + } +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol new file mode 100644 index 00000000..1be027ab --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol @@ -0,0 +1,3230 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/ICreditDelegationToken.sol + +/** + * @title ICreditDelegationToken + * @author Aave + * @notice Defines the basic interface for a token supporting credit delegation. + */ +interface ICreditDelegationToken { + /** + * @dev Emitted on `approveDelegation` and `borrowAllowance + * @param fromUser The address of the delegator + * @param toUser The address of the delegatee + * @param asset The address of the delegated asset + * @param amount The amount being delegated + */ + event BorrowAllowanceDelegated( + address indexed fromUser, + address indexed toUser, + address indexed asset, + uint256 amount + ); + + /** + * @notice Delegates borrowing power to a user on the specific debt token. + * Delegation will still respect the liquidation constraints (even if delegated, a + * delegatee cannot force a delegator HF to go below 1) + * @param delegatee The address receiving the delegated borrowing power + * @param amount The maximum amount being delegated. + */ + function approveDelegation(address delegatee, uint256 amount) external; + + /** + * @notice Returns the borrow allowance of the user + * @param fromUser The user to giving allowance + * @param toUser The user to give allowance to + * @return The current allowance of `toUser` + */ + function borrowAllowance(address fromUser, address toUser) external view returns (uint256); + + /** + * @notice Delegates borrowing power to a user on the specific debt token via ERC712 signature + * @param delegator The delegator of the credit + * @param delegatee The delegatee that can use the credit + * @param value The amount to be delegated + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v The V signature param + * @param s The S signature param + * @param r The R signature param + */ + function delegationWithSig( + address delegator, + address delegatee, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol + +/** + * @title EIP712Base + * @author Aave + * @notice Base contract implementation of EIP712. + */ +abstract contract EIP712Base { + bytes public constant EIP712_REVISION = bytes('1'); + bytes32 internal constant EIP712_DOMAIN = + keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); + + // Map of address nonces (address => nonce) + mapping(address => uint256) internal _nonces; + + bytes32 internal _domainSeparator; + uint256 internal immutable _chainId; + + /** + * @dev Constructor. + */ + constructor() { + _chainId = block.chainid; + } + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { + if (block.chainid == _chainId) { + return _domainSeparator; + } + return _calculateDomainSeparator(); + } + + /** + * @notice Returns the nonce value for address specified as parameter + * @param owner The address for which the nonce is being returned + * @return The nonce value for the input address` + */ + function nonces(address owner) public view virtual returns (uint256) { + return _nonces[owner]; + } + + /** + * @notice Compute the current domain separator + * @return The domain separator for the token + */ + function _calculateDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + EIP712_DOMAIN, + keccak256(bytes(_EIP712BaseId())), + keccak256(EIP712_REVISION), + block.chainid, + address(this) + ) + ); + } + + /** + * @notice Returns the user readable name of signing domain (e.g. token name) + * @return The name of the signing domain + */ + function _EIP712BaseId() internal view virtual returns (string memory); +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/DebtTokenBase.sol + +/** + * @title DebtTokenBase + * @author Aave + * @notice Base contract for different types of debt tokens, like VariableDebtToken + */ +abstract contract DebtTokenBase is + VersionedInitializable, + EIP712Base, + Context, + ICreditDelegationToken +{ + // Map of borrow allowances (delegator => delegatee => borrowAllowanceAmount) + mapping(address => mapping(address => uint256)) internal _borrowAllowances; + + // Credit Delegation Typehash + bytes32 public constant DELEGATION_WITH_SIG_TYPEHASH = + keccak256('DelegationWithSig(address delegatee,uint256 value,uint256 nonce,uint256 deadline)'); + + address internal _underlyingAsset; + + /** + * @dev Constructor. + */ + constructor() EIP712Base() { + // Intentionally left blank + } + + /// @inheritdoc ICreditDelegationToken + function approveDelegation(address delegatee, uint256 amount) external override { + _approveDelegation(_msgSender(), delegatee, amount); + } + + /// @inheritdoc ICreditDelegationToken + function delegationWithSig( + address delegator, + address delegatee, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external { + require(delegator != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + //solium-disable-next-line + require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); + uint256 currentValidNonce = _nonces[delegator]; + bytes32 digest = keccak256( + abi.encodePacked( + '\x19\x01', + DOMAIN_SEPARATOR(), + keccak256( + abi.encode(DELEGATION_WITH_SIG_TYPEHASH, delegatee, value, currentValidNonce, deadline) + ) + ) + ); + require(delegator == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); + _nonces[delegator] = currentValidNonce + 1; + _approveDelegation(delegator, delegatee, value); + } + + /// @inheritdoc ICreditDelegationToken + function borrowAllowance( + address fromUser, + address toUser + ) external view override returns (uint256) { + return _borrowAllowances[fromUser][toUser]; + } + + /** + * @notice Updates the borrow allowance of a user on the specific debt token. + * @param delegator The address delegating the borrowing power + * @param delegatee The address receiving the delegated borrowing power + * @param amount The allowance amount being delegated. + */ + function _approveDelegation(address delegator, address delegatee, uint256 amount) internal { + _borrowAllowances[delegator][delegatee] = amount; + emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, amount); + } + + /** + * @notice Decreases the borrow allowance of a user on the specific debt token. + * @param delegator The address delegating the borrowing power + * @param delegatee The address receiving the delegated borrowing power + * @param amount The amount to subtract from the current allowance + */ + function _decreaseBorrowAllowance(address delegator, address delegatee, uint256 amount) internal { + uint256 newAllowance = _borrowAllowances[delegator][delegatee] - amount; + + _borrowAllowances[delegator][delegatee] = newAllowance; + + emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, newAllowance); + } +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol + +/** + * @title MintableIncentivizedERC20 + * @author Aave + * @notice Implements mint and burn functions for IncentivizedERC20 + */ +abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) IncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /** + * @notice Mints tokens to an account and apply incentives if defined + * @param account The address receiving tokens + * @param amount The amount of tokens to mint + */ + function _mint(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply + amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } + + /** + * @notice Burns tokens from an account and apply incentives if defined + * @param account The account whose tokens are burnt + * @param amount The amount of tokens to burn + */ + function _burn(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply - amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance - amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol + +/** + * @title ScaledBalanceTokenBase + * @author Aave + * @notice Basic ERC20 implementation of scaled balance token + */ +abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) MintableIncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /// @inheritdoc IScaledBalanceToken + function scaledBalanceOf(address user) external view override returns (uint256) { + return super.balanceOf(user); + } + + /// @inheritdoc IScaledBalanceToken + function getScaledUserBalanceAndSupply( + address user + ) external view override returns (uint256, uint256) { + return (super.balanceOf(user), super.totalSupply()); + } + + /// @inheritdoc IScaledBalanceToken + function scaledTotalSupply() public view virtual override returns (uint256) { + return super.totalSupply(); + } + + /// @inheritdoc IScaledBalanceToken + function getPreviousIndex(address user) external view virtual override returns (uint256) { + return _userState[user].additionalData; + } + + /** + * @notice Implements the basic logic to mint a scaled balance token. + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the scaled tokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function _mintScaled( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) internal returns (bool) { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); + + uint256 scaledBalance = super.balanceOf(onBehalfOf); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[onBehalfOf].additionalData); + + _userState[onBehalfOf].additionalData = index.toUint128(); + + _mint(onBehalfOf, amountScaled.toUint128()); + + uint256 amountToMint = amount + balanceIncrease; + emit Transfer(address(0), onBehalfOf, amountToMint); + emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); + + return (scaledBalance == 0); + } + + /** + * @notice Implements the basic logic to burn a scaled balance token. + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param user The user which debt is burnt + * @param target The address that will receive the underlying, if any + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + */ + function _burnScaled(address user, address target, uint256 amount, uint256 index) internal { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); + + uint256 scaledBalance = super.balanceOf(user); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[user].additionalData); + + _userState[user].additionalData = index.toUint128(); + + _burn(user, amountScaled.toUint128()); + + if (balanceIncrease > amount) { + uint256 amountToMint = balanceIncrease - amount; + emit Transfer(address(0), user, amountToMint); + emit Mint(user, user, amountToMint, balanceIncrease, index); + } else { + uint256 amountToBurn = amount - balanceIncrease; + emit Transfer(user, address(0), amountToBurn); + emit Burn(user, target, amountToBurn, balanceIncrease, index); + } + } + + /** + * @notice Implements the basic logic to transfer scaled balance tokens between two users + * @dev It emits a mint event with the interest accrued per user + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + * @param index The next liquidity index of the reserve + */ + function _transfer(address sender, address recipient, uint256 amount, uint256 index) internal { + uint256 senderScaledBalance = super.balanceOf(sender); + uint256 senderBalanceIncrease = senderScaledBalance.rayMul(index) - + senderScaledBalance.rayMul(_userState[sender].additionalData); + + uint256 recipientScaledBalance = super.balanceOf(recipient); + uint256 recipientBalanceIncrease = recipientScaledBalance.rayMul(index) - + recipientScaledBalance.rayMul(_userState[recipient].additionalData); + + _userState[sender].additionalData = index.toUint128(); + _userState[recipient].additionalData = index.toUint128(); + + super._transfer(sender, recipient, amount.rayDiv(index).toUint128()); + + if (senderBalanceIncrease > 0) { + emit Transfer(address(0), sender, senderBalanceIncrease); + emit Mint(_msgSender(), sender, senderBalanceIncrease, senderBalanceIncrease, index); + } + + if (sender != recipient && recipientBalanceIncrease > 0) { + emit Transfer(address(0), recipient, recipientBalanceIncrease); + emit Mint(_msgSender(), recipient, recipientBalanceIncrease, recipientBalanceIncrease, index); + } + + emit Transfer(sender, recipient, amount); + } +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/VariableDebtToken.sol + +/** + * @title VariableDebtToken + * @author Aave + * @notice Implements a variable debt token to track the borrowing positions of users + * at variable rate mode + * @dev Transfer and approve functionalities are disabled since its a non-transferable token + */ +abstract contract VariableDebtToken is DebtTokenBase, ScaledBalanceTokenBase, IVariableDebtToken { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Constructor. + * @param pool The address of the Pool contract + */ + constructor( + IPool pool + ) + DebtTokenBase() + ScaledBalanceTokenBase(pool, 'VARIABLE_DEBT_TOKEN_IMPL', 'VARIABLE_DEBT_TOKEN_IMPL', 0) + { + // Intentionally left blank + } + + /// @inheritdoc IInitializableDebtToken + function initialize( + IPool initializingPool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external virtual; + + /// @inheritdoc IERC20 + function balanceOf(address user) public view virtual override returns (uint256) { + uint256 scaledBalance = super.balanceOf(user); + + if (scaledBalance == 0) { + return 0; + } + + return scaledBalance.rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); + } + + /// @inheritdoc IVariableDebtToken + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external virtual override onlyPool returns (bool, uint256) { + if (user != onBehalfOf) { + _decreaseBorrowAllowance(onBehalfOf, user, amount); + } + return (_mintScaled(user, onBehalfOf, amount, index), scaledTotalSupply()); + } + + /// @inheritdoc IVariableDebtToken + function burn( + address from, + uint256 amount, + uint256 index + ) external virtual override onlyPool returns (uint256) { + _burnScaled(from, address(0), amount, index); + return scaledTotalSupply(); + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return super.totalSupply().rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); + } + + /// @inheritdoc EIP712Base + function _EIP712BaseId() internal view override returns (string memory) { + return name(); + } + + /** + * @dev Being non transferrable, the debt token does not implement any of the + * standard ERC20 functions for transfer and allowance. + */ + function transfer(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function allowance(address, address) external view virtual override returns (uint256) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function approve(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function transferFrom(address, address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function increaseAllowance(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function decreaseAllowance(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + /// @inheritdoc IVariableDebtToken + function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { + return _underlyingAsset; + } +} + +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/instances/VariableDebtTokenInstance.sol + +contract VariableDebtTokenInstance is VariableDebtToken { + uint256 public constant DEBT_TOKEN_REVISION = 1; + + constructor(IPool pool) VariableDebtToken(pool) {} + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure virtual override returns (uint256) { + return DEBT_TOKEN_REVISION; + } + + /// @inheritdoc IInitializableDebtToken + function initialize( + IPool initializingPool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external override initializer { + require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); + _setName(debtTokenName); + _setSymbol(debtTokenSymbol); + _setDecimals(debtTokenDecimals); + + _underlyingAsset = underlyingAsset; + _incentivesController = incentivesController; + + _domainSeparator = _calculateDomainSeparator(); + + emit Initialized( + underlyingAsset, + address(POOL), + address(incentivesController), + debtTokenDecimals, + debtTokenName, + debtTokenSymbol, + params + ); + } +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/instances/VariableDebtTokenInstance.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/instances/VariableDebtTokenInstance.sol new file mode 100644 index 00000000..eeb2f71a --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/instances/VariableDebtTokenInstance.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {VariableDebtToken, IPool, IInitializableDebtToken, VersionedInitializable, IAaveIncentivesController, Errors} from '../protocol/tokenization/VariableDebtToken.sol'; + +contract VariableDebtTokenInstance is VariableDebtToken { + uint256 public constant DEBT_TOKEN_REVISION = 1; + + constructor(IPool pool) VariableDebtToken(pool) {} + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure virtual override returns (uint256) { + return DEBT_TOKEN_REVISION; + } + + /// @inheritdoc IInitializableDebtToken + function initialize( + IPool initializingPool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external override initializer { + require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); + _setName(debtTokenName); + _setSymbol(debtTokenSymbol); + _setDecimals(debtTokenDecimals); + + _underlyingAsset = underlyingAsset; + _incentivesController = incentivesController; + + _domainSeparator = _calculateDomainSeparator(); + + emit Initialized( + underlyingAsset, + address(POOL), + address(incentivesController), + debtTokenDecimals, + debtTokenName, + debtTokenSymbol, + params + ); + } +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/ICreditDelegationToken.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/ICreditDelegationToken.sol new file mode 100644 index 00000000..8fc17a22 --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/ICreditDelegationToken.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title ICreditDelegationToken + * @author Aave + * @notice Defines the basic interface for a token supporting credit delegation. + */ +interface ICreditDelegationToken { + /** + * @dev Emitted on `approveDelegation` and `borrowAllowance + * @param fromUser The address of the delegator + * @param toUser The address of the delegatee + * @param asset The address of the delegated asset + * @param amount The amount being delegated + */ + event BorrowAllowanceDelegated( + address indexed fromUser, + address indexed toUser, + address indexed asset, + uint256 amount + ); + + /** + * @notice Delegates borrowing power to a user on the specific debt token. + * Delegation will still respect the liquidation constraints (even if delegated, a + * delegatee cannot force a delegator HF to go below 1) + * @param delegatee The address receiving the delegated borrowing power + * @param amount The maximum amount being delegated. + */ + function approveDelegation(address delegatee, uint256 amount) external; + + /** + * @notice Returns the borrow allowance of the user + * @param fromUser The user to giving allowance + * @param toUser The user to give allowance to + * @return The current allowance of `toUser` + */ + function borrowAllowance(address fromUser, address toUser) external view returns (uint256); + + /** + * @notice Delegates borrowing power to a user on the specific debt token via ERC712 signature + * @param delegator The delegator of the credit + * @param delegatee The delegatee that can use the credit + * @param value The amount to be delegated + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v The V signature param + * @param s The S signature param + * @param r The R signature param + */ + function delegationWithSig( + address delegator, + address delegatee, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPool.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol new file mode 100644 index 00000000..1070227a --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/VariableDebtToken.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/VariableDebtToken.sol new file mode 100644 index 00000000..37494c85 --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/VariableDebtToken.sol @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {SafeCast} from '../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {VersionedInitializable} from '../../misc/aave-upgradeability/VersionedInitializable.sol'; +import {WadRayMath} from '../libraries/math/WadRayMath.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; +import {IPool} from '../../interfaces/IPool.sol'; +import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; +import {IInitializableDebtToken} from '../../interfaces/IInitializableDebtToken.sol'; +import {IVariableDebtToken} from '../../interfaces/IVariableDebtToken.sol'; +import {EIP712Base} from './base/EIP712Base.sol'; +import {DebtTokenBase} from './base/DebtTokenBase.sol'; +import {ScaledBalanceTokenBase} from './base/ScaledBalanceTokenBase.sol'; + +/** + * @title VariableDebtToken + * @author Aave + * @notice Implements a variable debt token to track the borrowing positions of users + * at variable rate mode + * @dev Transfer and approve functionalities are disabled since its a non-transferable token + */ +abstract contract VariableDebtToken is DebtTokenBase, ScaledBalanceTokenBase, IVariableDebtToken { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Constructor. + * @param pool The address of the Pool contract + */ + constructor( + IPool pool + ) + DebtTokenBase() + ScaledBalanceTokenBase(pool, 'VARIABLE_DEBT_TOKEN_IMPL', 'VARIABLE_DEBT_TOKEN_IMPL', 0) + { + // Intentionally left blank + } + + /// @inheritdoc IInitializableDebtToken + function initialize( + IPool initializingPool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external virtual; + + /// @inheritdoc IERC20 + function balanceOf(address user) public view virtual override returns (uint256) { + uint256 scaledBalance = super.balanceOf(user); + + if (scaledBalance == 0) { + return 0; + } + + return scaledBalance.rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); + } + + /// @inheritdoc IVariableDebtToken + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external virtual override onlyPool returns (bool, uint256) { + if (user != onBehalfOf) { + _decreaseBorrowAllowance(onBehalfOf, user, amount); + } + return (_mintScaled(user, onBehalfOf, amount, index), scaledTotalSupply()); + } + + /// @inheritdoc IVariableDebtToken + function burn( + address from, + uint256 amount, + uint256 index + ) external virtual override onlyPool returns (uint256) { + _burnScaled(from, address(0), amount, index); + return scaledTotalSupply(); + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return super.totalSupply().rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); + } + + /// @inheritdoc EIP712Base + function _EIP712BaseId() internal view override returns (string memory) { + return name(); + } + + /** + * @dev Being non transferrable, the debt token does not implement any of the + * standard ERC20 functions for transfer and allowance. + */ + function transfer(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function allowance(address, address) external view virtual override returns (uint256) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function approve(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function transferFrom(address, address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function increaseAllowance(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + function decreaseAllowance(address, uint256) external virtual override returns (bool) { + revert(Errors.OPERATION_NOT_SUPPORTED); + } + + /// @inheritdoc IVariableDebtToken + function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { + return _underlyingAsset; + } +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/DebtTokenBase.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/DebtTokenBase.sol new file mode 100644 index 00000000..626b6d8b --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/DebtTokenBase.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {VersionedInitializable} from '../../../misc/aave-upgradeability/VersionedInitializable.sol'; +import {ICreditDelegationToken} from '../../../interfaces/ICreditDelegationToken.sol'; +import {EIP712Base} from './EIP712Base.sol'; + +/** + * @title DebtTokenBase + * @author Aave + * @notice Base contract for different types of debt tokens, like VariableDebtToken + */ +abstract contract DebtTokenBase is + VersionedInitializable, + EIP712Base, + Context, + ICreditDelegationToken +{ + // Map of borrow allowances (delegator => delegatee => borrowAllowanceAmount) + mapping(address => mapping(address => uint256)) internal _borrowAllowances; + + // Credit Delegation Typehash + bytes32 public constant DELEGATION_WITH_SIG_TYPEHASH = + keccak256('DelegationWithSig(address delegatee,uint256 value,uint256 nonce,uint256 deadline)'); + + address internal _underlyingAsset; + + /** + * @dev Constructor. + */ + constructor() EIP712Base() { + // Intentionally left blank + } + + /// @inheritdoc ICreditDelegationToken + function approveDelegation(address delegatee, uint256 amount) external override { + _approveDelegation(_msgSender(), delegatee, amount); + } + + /// @inheritdoc ICreditDelegationToken + function delegationWithSig( + address delegator, + address delegatee, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external { + require(delegator != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + //solium-disable-next-line + require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); + uint256 currentValidNonce = _nonces[delegator]; + bytes32 digest = keccak256( + abi.encodePacked( + '\x19\x01', + DOMAIN_SEPARATOR(), + keccak256( + abi.encode(DELEGATION_WITH_SIG_TYPEHASH, delegatee, value, currentValidNonce, deadline) + ) + ) + ); + require(delegator == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); + _nonces[delegator] = currentValidNonce + 1; + _approveDelegation(delegator, delegatee, value); + } + + /// @inheritdoc ICreditDelegationToken + function borrowAllowance( + address fromUser, + address toUser + ) external view override returns (uint256) { + return _borrowAllowances[fromUser][toUser]; + } + + /** + * @notice Updates the borrow allowance of a user on the specific debt token. + * @param delegator The address delegating the borrowing power + * @param delegatee The address receiving the delegated borrowing power + * @param amount The allowance amount being delegated. + */ + function _approveDelegation(address delegator, address delegatee, uint256 amount) internal { + _borrowAllowances[delegator][delegatee] = amount; + emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, amount); + } + + /** + * @notice Decreases the borrow allowance of a user on the specific debt token. + * @param delegator The address delegating the borrowing power + * @param delegatee The address receiving the delegated borrowing power + * @param amount The amount to subtract from the current allowance + */ + function _decreaseBorrowAllowance(address delegator, address delegatee, uint256 amount) internal { + uint256 newAllowance = _borrowAllowances[delegator][delegatee] - amount; + + _borrowAllowances[delegator][delegatee] = newAllowance; + + emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, newAllowance); + } +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol new file mode 100644 index 00000000..97abc425 --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title EIP712Base + * @author Aave + * @notice Base contract implementation of EIP712. + */ +abstract contract EIP712Base { + bytes public constant EIP712_REVISION = bytes('1'); + bytes32 internal constant EIP712_DOMAIN = + keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); + + // Map of address nonces (address => nonce) + mapping(address => uint256) internal _nonces; + + bytes32 internal _domainSeparator; + uint256 internal immutable _chainId; + + /** + * @dev Constructor. + */ + constructor() { + _chainId = block.chainid; + } + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { + if (block.chainid == _chainId) { + return _domainSeparator; + } + return _calculateDomainSeparator(); + } + + /** + * @notice Returns the nonce value for address specified as parameter + * @param owner The address for which the nonce is being returned + * @return The nonce value for the input address` + */ + function nonces(address owner) public view virtual returns (uint256) { + return _nonces[owner]; + } + + /** + * @notice Compute the current domain separator + * @return The domain separator for the token + */ + function _calculateDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + EIP712_DOMAIN, + keccak256(bytes(_EIP712BaseId())), + keccak256(EIP712_REVISION), + block.chainid, + address(this) + ) + ); + } + + /** + * @notice Returns the user readable name of signing domain (e.g. token name) + * @return The name of the signing domain + */ + function _EIP712BaseId() internal view virtual returns (string memory); +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol new file mode 100644 index 00000000..b07b1673 --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IncentivizedERC20} from './IncentivizedERC20.sol'; + +/** + * @title MintableIncentivizedERC20 + * @author Aave + * @notice Implements mint and burn functions for IncentivizedERC20 + */ +abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) IncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /** + * @notice Mints tokens to an account and apply incentives if defined + * @param account The address receiving tokens + * @param amount The amount of tokens to mint + */ + function _mint(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply + amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } + + /** + * @notice Burns tokens from an account and apply incentives if defined + * @param account The account whose tokens are burnt + * @param amount The amount of tokens to burn + */ + function _burn(address account, uint128 amount) internal virtual { + uint256 oldTotalSupply = _totalSupply; + _totalSupply = oldTotalSupply - amount; + + uint128 oldAccountBalance = _userState[account].balance; + _userState[account].balance = oldAccountBalance - amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + + if (address(incentivesControllerLocal) != address(0)) { + incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); + } + } +} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol new file mode 100644 index 00000000..a79d8917 --- /dev/null +++ b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {MintableIncentivizedERC20} from './MintableIncentivizedERC20.sol'; + +/** + * @title ScaledBalanceTokenBase + * @author Aave + * @notice Basic ERC20 implementation of scaled balance token + */ +abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name The name of the token + * @param symbol The symbol of the token + * @param decimals The number of decimals of the token + */ + constructor( + IPool pool, + string memory name, + string memory symbol, + uint8 decimals + ) MintableIncentivizedERC20(pool, name, symbol, decimals) { + // Intentionally left blank + } + + /// @inheritdoc IScaledBalanceToken + function scaledBalanceOf(address user) external view override returns (uint256) { + return super.balanceOf(user); + } + + /// @inheritdoc IScaledBalanceToken + function getScaledUserBalanceAndSupply( + address user + ) external view override returns (uint256, uint256) { + return (super.balanceOf(user), super.totalSupply()); + } + + /// @inheritdoc IScaledBalanceToken + function scaledTotalSupply() public view virtual override returns (uint256) { + return super.totalSupply(); + } + + /// @inheritdoc IScaledBalanceToken + function getPreviousIndex(address user) external view virtual override returns (uint256) { + return _userState[user].additionalData; + } + + /** + * @notice Implements the basic logic to mint a scaled balance token. + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the scaled tokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function _mintScaled( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) internal returns (bool) { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); + + uint256 scaledBalance = super.balanceOf(onBehalfOf); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[onBehalfOf].additionalData); + + _userState[onBehalfOf].additionalData = index.toUint128(); + + _mint(onBehalfOf, amountScaled.toUint128()); + + uint256 amountToMint = amount + balanceIncrease; + emit Transfer(address(0), onBehalfOf, amountToMint); + emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); + + return (scaledBalance == 0); + } + + /** + * @notice Implements the basic logic to burn a scaled balance token. + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param user The user which debt is burnt + * @param target The address that will receive the underlying, if any + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + */ + function _burnScaled(address user, address target, uint256 amount, uint256 index) internal { + uint256 amountScaled = amount.rayDiv(index); + require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); + + uint256 scaledBalance = super.balanceOf(user); + uint256 balanceIncrease = scaledBalance.rayMul(index) - + scaledBalance.rayMul(_userState[user].additionalData); + + _userState[user].additionalData = index.toUint128(); + + _burn(user, amountScaled.toUint128()); + + if (balanceIncrease > amount) { + uint256 amountToMint = balanceIncrease - amount; + emit Transfer(address(0), user, amountToMint); + emit Mint(user, user, amountToMint, balanceIncrease, index); + } else { + uint256 amountToBurn = amount - balanceIncrease; + emit Transfer(user, address(0), amountToBurn); + emit Burn(user, target, amountToBurn, balanceIncrease, index); + } + } + + /** + * @notice Implements the basic logic to transfer scaled balance tokens between two users + * @dev It emits a mint event with the interest accrued per user + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + * @param index The next liquidity index of the reserve + */ + function _transfer(address sender, address recipient, uint256 amount, uint256 index) internal { + uint256 senderScaledBalance = super.balanceOf(sender); + uint256 senderBalanceIncrease = senderScaledBalance.rayMul(index) - + senderScaledBalance.rayMul(_userState[sender].additionalData); + + uint256 recipientScaledBalance = super.balanceOf(recipient); + uint256 recipientBalanceIncrease = recipientScaledBalance.rayMul(index) - + recipientScaledBalance.rayMul(_userState[recipient].additionalData); + + _userState[sender].additionalData = index.toUint128(); + _userState[recipient].additionalData = index.toUint128(); + + super._transfer(sender, recipient, amount.rayDiv(index).toUint128()); + + if (senderBalanceIncrease > 0) { + emit Transfer(address(0), sender, senderBalanceIncrease); + emit Mint(_msgSender(), sender, senderBalanceIncrease, senderBalanceIncrease, index); + } + + if (sender != recipient && recipientBalanceIncrease > 0) { + emit Transfer(address(0), recipient, recipientBalanceIncrease); + emit Mint(_msgSender(), recipient, recipientBalanceIncrease, recipientBalanceIncrease, index); + } + + emit Transfer(sender, recipient, amount); + } +} diff --git a/downloads/LINEA/EMISSION_MANAGER.sol b/downloads/LINEA/EMISSION_MANAGER.sol new file mode 100644 index 00000000..9de846c4 --- /dev/null +++ b/downloads/LINEA/EMISSION_MANAGER.sol @@ -0,0 +1,789 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} + +// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsDistributor.sol + +/** + * @title IRewardsDistributor + * @author Aave + * @notice Defines the basic interface for a Rewards Distributor. + */ +interface IRewardsDistributor { + /** + * @dev Emitted when the configuration of the rewards of an asset is updated. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param oldEmission The old emissions per second value of the reward distribution + * @param newEmission The new emissions per second value of the reward distribution + * @param oldDistributionEnd The old end timestamp of the reward distribution + * @param newDistributionEnd The new end timestamp of the reward distribution + * @param assetIndex The index of the asset distribution + */ + event AssetConfigUpdated( + address indexed asset, + address indexed reward, + uint256 oldEmission, + uint256 newEmission, + uint256 oldDistributionEnd, + uint256 newDistributionEnd, + uint256 assetIndex + ); + + /** + * @dev Emitted when rewards of an asset are accrued on behalf of a user. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param user The address of the user that rewards are accrued on behalf of + * @param assetIndex The index of the asset distribution + * @param userIndex The index of the asset distribution on behalf of the user + * @param rewardsAccrued The amount of rewards accrued + */ + event Accrued( + address indexed asset, + address indexed reward, + address indexed user, + uint256 assetIndex, + uint256 userIndex, + uint256 rewardsAccrued + ); + + /** + * @dev Sets the end date for the distribution + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Gets the end date for the distribution + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The timestamp with the end of the distribution, in unix time format + **/ + function getDistributionEnd(address asset, address reward) external view returns (uint256); + + /** + * @dev Returns the index of a user on a reward distribution + * @param user Address of the user + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The current user asset index, not including new distributions + **/ + function getUserAssetIndex( + address user, + address asset, + address reward + ) external view returns (uint256); + + /** + * @dev Returns the configuration of the distribution reward for a certain asset + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The index of the asset distribution + * @return The emission per second of the reward distribution + * @return The timestamp of the last update of the index + * @return The timestamp of the distribution end + **/ + function getRewardsData( + address asset, + address reward + ) external view returns (uint256, uint256, uint256, uint256); + + /** + * @dev Calculates the next value of an specific distribution index, with validations. + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The old index of the asset distribution + * @return The new index of the asset distribution + **/ + function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); + + /** + * @dev Returns the list of available reward token addresses of an incentivized asset + * @param asset The incentivized asset + * @return List of rewards addresses of the input asset + **/ + function getRewardsByAsset(address asset) external view returns (address[] memory); + + /** + * @dev Returns the list of available reward addresses + * @return List of rewards supported in this contract + **/ + function getRewardsList() external view returns (address[] memory); + + /** + * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. + * @param user The address of the user + * @param reward The address of the reward token + * @return Unclaimed rewards, not including new distributions + **/ + function getUserAccruedRewards(address user, address reward) external view returns (uint256); + + /** + * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @param reward The address of the reward token + * @return The rewards amount + **/ + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view returns (uint256); + + /** + * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @return The list of reward addresses + * @return The list of unclaimed amount of rewards + **/ + function getAllUserRewards( + address[] calldata assets, + address user + ) external view returns (address[] memory, uint256[] memory); + + /** + * @dev Returns the decimals of an asset to calculate the distribution delta + * @param asset The address to retrieve decimals + * @return The decimals of an underlying asset + */ + function getAssetDecimals(address asset) external view returns (uint8); + + /** + * @dev Returns the address of the emission manager + * @return The address of the EmissionManager + */ + function EMISSION_MANAGER() external view returns (address); + + /** + * @dev Returns the address of the emission manager. + * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. + * @return The address of the EmissionManager + */ + function getEmissionManager() external view returns (address); +} + +// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/ITransferStrategyBase.sol + +interface ITransferStrategyBase { + event EmergencyWithdrawal( + address indexed caller, + address indexed token, + address indexed to, + uint256 amount + ); + + /** + * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation + * @param to Account to transfer rewards + * @param reward Address of the reward token + * @param amount Amount to transfer to the "to" address parameter + * @return Returns true bool if transfer logic succeeds + */ + function performTransfer(address to, address reward, uint256 amount) external returns (bool); + + /** + * @return Returns the address of the Incentives Controller + */ + function getIncentivesController() external view returns (address); + + /** + * @return Returns the address of the Rewards admin + */ + function getRewardsAdmin() external view returns (address); + + /** + * @dev Perform an emergency token withdrawal only callable by the Rewards admin + * @param token Address of the token to withdraw funds from this contract + * @param to Address of the recipient of the withdrawal + * @param amount Amount of the withdrawal + */ + function emergencyWithdrawal(address token, address to, uint256 amount) external; +} + +// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} + +// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/libraries/RewardsDataTypes.sol + +library RewardsDataTypes { + struct RewardsConfigInput { + uint88 emissionPerSecond; + uint256 totalSupply; + uint32 distributionEnd; + address asset; + address reward; + ITransferStrategyBase transferStrategy; + IEACAggregatorProxy rewardOracle; + } + + struct UserAssetBalance { + address asset; + uint256 userBalance; + uint256 totalSupply; + } + + struct UserData { + // Liquidity index of the reward distribution for the user + uint104 index; + // Amount of accrued rewards for the user since last user index update + uint128 accrued; + } + + struct RewardData { + // Liquidity index of the reward distribution + uint104 index; + // Amount of reward tokens distributed per second + uint88 emissionPerSecond; + // Timestamp of the last reward index update + uint32 lastUpdateTimestamp; + // The end of the distribution of rewards (in seconds) + uint32 distributionEnd; + // Map of user addresses and their rewards data (userAddress => userData) + mapping(address => UserData) usersData; + } + + struct AssetData { + // Map of reward token addresses and their data (rewardTokenAddress => rewardData) + mapping(address => RewardData) rewards; + // List of reward token addresses for the asset + mapping(uint128 => address) availableRewards; + // Count of reward tokens for the asset + uint128 availableRewardsCount; + // Number of decimals of the asset + uint8 decimals; + } +} + +// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsController.sol + +/** + * @title IRewardsController + * @author Aave + * @notice Defines the basic interface for a Rewards Controller. + */ +interface IRewardsController is IRewardsDistributor { + /** + * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user + * @param user The address of the user + * @param claimer The address of the claimer + */ + event ClaimerSet(address indexed user, address indexed claimer); + + /** + * @dev Emitted when rewards are claimed + * @param user The address of the user rewards has been claimed on behalf of + * @param reward The address of the token reward is claimed + * @param to The address of the receiver of the rewards + * @param claimer The address of the claimer + * @param amount The amount of rewards claimed + */ + event RewardsClaimed( + address indexed user, + address indexed reward, + address indexed to, + address claimer, + uint256 amount + ); + + /** + * @dev Emitted when a transfer strategy is installed for the reward distribution + * @param reward The address of the token reward + * @param transferStrategy The address of TransferStrategy contract + */ + event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); + + /** + * @dev Emitted when the reward oracle is updated + * @param reward The address of the token reward + * @param rewardOracle The address of oracle + */ + event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Get the price aggregator oracle address + * @param reward The address of the reward + * @return The price oracle of the reward + */ + function getRewardOracle(address reward) external view returns (address); + + /** + * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) + * @param user The address of the user + * @return The claimer address + */ + function getClaimer(address user) external view returns (address); + + /** + * @dev Returns the Transfer Strategy implementation contract address being used for a reward address + * @param reward The address of the reward + * @return The address of the TransferStrategy contract + */ + function getTransferStrategy(address reward) external view returns (address); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + **/ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + + /** + * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The + * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external returns (uint256); + + /** + * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" + **/ + function claimAllRewards( + address[] calldata assets, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must + * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsToSelf( + address[] calldata assets + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); +} + +// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IEmissionManager.sol + +/** + * @title IEmissionManager + * @author Aave + * @notice Defines the basic interface for the Emission Manager + */ +interface IEmissionManager { + /** + * @dev Emitted when the admin of a reward emission is updated. + * @param reward The address of the rewarding token + * @param oldAdmin The address of the old emission admin + * @param newAdmin The address of the new emission admin + */ + event EmissionAdminUpdated( + address indexed reward, + address indexed oldAdmin, + address indexed newAdmin + ); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @dev Only callable by the emission admin of the given rewards + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @dev Only callable by the emission admin of the given reward + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @dev Only callable by the emission admin of the given reward + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Sets the end date for the distribution + * @dev Only callable by the emission admin of the given reward + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @dev Only callable by the owner of the EmissionManager + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Updates the admin of the reward emission + * @dev Only callable by the owner of the EmissionManager + * @param reward The address of the reward token + * @param admin The address of the new admin of the emission + */ + function setEmissionAdmin(address reward, address admin) external; + + /** + * @dev Updates the address of the rewards controller + * @dev Only callable by the owner of the EmissionManager + * @param controller the address of the RewardsController contract + */ + function setRewardsController(address controller) external; + + /** + * @dev Returns the rewards controller address + * @return The address of the RewardsController contract + */ + function getRewardsController() external view returns (IRewardsController); + + /** + * @dev Returns the admin of the given reward emission + * @param reward The address of the reward token + * @return The address of the emission admin + */ + function getEmissionAdmin(address reward) external view returns (address); +} + +// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/EmissionManager.sol + +/** + * @title EmissionManager + * @author Aave + * @notice It manages the list of admins of reward emissions and provides functions to control reward emissions. + */ +contract EmissionManager is Ownable, IEmissionManager { + // reward => emissionAdmin + mapping(address => address) internal _emissionAdmins; + + IRewardsController internal _rewardsController; + + /** + * @dev Only emission admin of the given reward can call functions marked by this modifier. + **/ + modifier onlyEmissionAdmin(address reward) { + require(msg.sender == _emissionAdmins[reward], 'ONLY_EMISSION_ADMIN'); + _; + } + + /** + * Constructor. + * @param owner The address of the owner + */ + constructor(address owner) { + transferOwnership(owner); + } + + /// @inheritdoc IEmissionManager + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external override { + for (uint256 i = 0; i < config.length; i++) { + require(_emissionAdmins[config[i].reward] == msg.sender, 'ONLY_EMISSION_ADMIN'); + } + _rewardsController.configureAssets(config); + } + + /// @inheritdoc IEmissionManager + function setTransferStrategy( + address reward, + ITransferStrategyBase transferStrategy + ) external override onlyEmissionAdmin(reward) { + _rewardsController.setTransferStrategy(reward, transferStrategy); + } + + /// @inheritdoc IEmissionManager + function setRewardOracle( + address reward, + IEACAggregatorProxy rewardOracle + ) external override onlyEmissionAdmin(reward) { + _rewardsController.setRewardOracle(reward, rewardOracle); + } + + /// @inheritdoc IEmissionManager + function setDistributionEnd( + address asset, + address reward, + uint32 newDistributionEnd + ) external override onlyEmissionAdmin(reward) { + _rewardsController.setDistributionEnd(asset, reward, newDistributionEnd); + } + + /// @inheritdoc IEmissionManager + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external override { + for (uint256 i = 0; i < rewards.length; i++) { + require(_emissionAdmins[rewards[i]] == msg.sender, 'ONLY_EMISSION_ADMIN'); + } + _rewardsController.setEmissionPerSecond(asset, rewards, newEmissionsPerSecond); + } + + /// @inheritdoc IEmissionManager + function setClaimer(address user, address claimer) external override onlyOwner { + _rewardsController.setClaimer(user, claimer); + } + + /// @inheritdoc IEmissionManager + function setEmissionAdmin(address reward, address admin) external override onlyOwner { + address oldAdmin = _emissionAdmins[reward]; + _emissionAdmins[reward] = admin; + emit EmissionAdminUpdated(reward, oldAdmin, admin); + } + + /// @inheritdoc IEmissionManager + function setRewardsController(address controller) external override onlyOwner { + _rewardsController = IRewardsController(controller); + } + + /// @inheritdoc IEmissionManager + function getRewardsController() external view override returns (IRewardsController) { + return _rewardsController; + } + + /// @inheritdoc IEmissionManager + function getEmissionAdmin(address reward) external view override returns (address) { + return _emissionAdmins[reward]; + } +} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol new file mode 100644 index 00000000..7917b722 --- /dev/null +++ b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +import './Context.sol'; + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol new file mode 100644 index 00000000..c89baee6 --- /dev/null +++ b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/EmissionManager.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/EmissionManager.sol new file mode 100644 index 00000000..b18473ff --- /dev/null +++ b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/EmissionManager.sol @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {Ownable} from '../dependencies/openzeppelin/contracts/Ownable.sol'; +import {IEACAggregatorProxy} from '../helpers/interfaces/IEACAggregatorProxy.sol'; +import {IEmissionManager} from './interfaces/IEmissionManager.sol'; +import {ITransferStrategyBase} from './interfaces/ITransferStrategyBase.sol'; +import {IRewardsController} from './interfaces/IRewardsController.sol'; +import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol'; + +/** + * @title EmissionManager + * @author Aave + * @notice It manages the list of admins of reward emissions and provides functions to control reward emissions. + */ +contract EmissionManager is Ownable, IEmissionManager { + // reward => emissionAdmin + mapping(address => address) internal _emissionAdmins; + + IRewardsController internal _rewardsController; + + /** + * @dev Only emission admin of the given reward can call functions marked by this modifier. + **/ + modifier onlyEmissionAdmin(address reward) { + require(msg.sender == _emissionAdmins[reward], 'ONLY_EMISSION_ADMIN'); + _; + } + + /** + * Constructor. + * @param owner The address of the owner + */ + constructor(address owner) { + transferOwnership(owner); + } + + /// @inheritdoc IEmissionManager + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external override { + for (uint256 i = 0; i < config.length; i++) { + require(_emissionAdmins[config[i].reward] == msg.sender, 'ONLY_EMISSION_ADMIN'); + } + _rewardsController.configureAssets(config); + } + + /// @inheritdoc IEmissionManager + function setTransferStrategy( + address reward, + ITransferStrategyBase transferStrategy + ) external override onlyEmissionAdmin(reward) { + _rewardsController.setTransferStrategy(reward, transferStrategy); + } + + /// @inheritdoc IEmissionManager + function setRewardOracle( + address reward, + IEACAggregatorProxy rewardOracle + ) external override onlyEmissionAdmin(reward) { + _rewardsController.setRewardOracle(reward, rewardOracle); + } + + /// @inheritdoc IEmissionManager + function setDistributionEnd( + address asset, + address reward, + uint32 newDistributionEnd + ) external override onlyEmissionAdmin(reward) { + _rewardsController.setDistributionEnd(asset, reward, newDistributionEnd); + } + + /// @inheritdoc IEmissionManager + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external override { + for (uint256 i = 0; i < rewards.length; i++) { + require(_emissionAdmins[rewards[i]] == msg.sender, 'ONLY_EMISSION_ADMIN'); + } + _rewardsController.setEmissionPerSecond(asset, rewards, newEmissionsPerSecond); + } + + /// @inheritdoc IEmissionManager + function setClaimer(address user, address claimer) external override onlyOwner { + _rewardsController.setClaimer(user, claimer); + } + + /// @inheritdoc IEmissionManager + function setEmissionAdmin(address reward, address admin) external override onlyOwner { + address oldAdmin = _emissionAdmins[reward]; + _emissionAdmins[reward] = admin; + emit EmissionAdminUpdated(reward, oldAdmin, admin); + } + + /// @inheritdoc IEmissionManager + function setRewardsController(address controller) external override onlyOwner { + _rewardsController = IRewardsController(controller); + } + + /// @inheritdoc IEmissionManager + function getRewardsController() external view override returns (IRewardsController) { + return _rewardsController; + } + + /// @inheritdoc IEmissionManager + function getEmissionAdmin(address reward) external view override returns (address) { + return _emissionAdmins[reward]; + } +} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IEmissionManager.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IEmissionManager.sol new file mode 100644 index 00000000..4853af21 --- /dev/null +++ b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IEmissionManager.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; +import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; +import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; +import {IRewardsController} from './IRewardsController.sol'; + +/** + * @title IEmissionManager + * @author Aave + * @notice Defines the basic interface for the Emission Manager + */ +interface IEmissionManager { + /** + * @dev Emitted when the admin of a reward emission is updated. + * @param reward The address of the rewarding token + * @param oldAdmin The address of the old emission admin + * @param newAdmin The address of the new emission admin + */ + event EmissionAdminUpdated( + address indexed reward, + address indexed oldAdmin, + address indexed newAdmin + ); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @dev Only callable by the emission admin of the given rewards + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @dev Only callable by the emission admin of the given reward + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @dev Only callable by the emission admin of the given reward + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Sets the end date for the distribution + * @dev Only callable by the emission admin of the given reward + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @dev Only callable by the owner of the EmissionManager + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Updates the admin of the reward emission + * @dev Only callable by the owner of the EmissionManager + * @param reward The address of the reward token + * @param admin The address of the new admin of the emission + */ + function setEmissionAdmin(address reward, address admin) external; + + /** + * @dev Updates the address of the rewards controller + * @dev Only callable by the owner of the EmissionManager + * @param controller the address of the RewardsController contract + */ + function setRewardsController(address controller) external; + + /** + * @dev Returns the rewards controller address + * @return The address of the RewardsController contract + */ + function getRewardsController() external view returns (IRewardsController); + + /** + * @dev Returns the admin of the given reward emission + * @param reward The address of the reward token + * @return The address of the emission admin + */ + function getEmissionAdmin(address reward) external view returns (address); +} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsController.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsController.sol new file mode 100644 index 00000000..cdb2ac29 --- /dev/null +++ b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsController.sol @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IRewardsDistributor} from './IRewardsDistributor.sol'; +import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; +import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; +import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; + +/** + * @title IRewardsController + * @author Aave + * @notice Defines the basic interface for a Rewards Controller. + */ +interface IRewardsController is IRewardsDistributor { + /** + * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user + * @param user The address of the user + * @param claimer The address of the claimer + */ + event ClaimerSet(address indexed user, address indexed claimer); + + /** + * @dev Emitted when rewards are claimed + * @param user The address of the user rewards has been claimed on behalf of + * @param reward The address of the token reward is claimed + * @param to The address of the receiver of the rewards + * @param claimer The address of the claimer + * @param amount The amount of rewards claimed + */ + event RewardsClaimed( + address indexed user, + address indexed reward, + address indexed to, + address claimer, + uint256 amount + ); + + /** + * @dev Emitted when a transfer strategy is installed for the reward distribution + * @param reward The address of the token reward + * @param transferStrategy The address of TransferStrategy contract + */ + event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); + + /** + * @dev Emitted when the reward oracle is updated + * @param reward The address of the token reward + * @param rewardOracle The address of oracle + */ + event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Get the price aggregator oracle address + * @param reward The address of the reward + * @return The price oracle of the reward + */ + function getRewardOracle(address reward) external view returns (address); + + /** + * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) + * @param user The address of the user + * @return The claimer address + */ + function getClaimer(address user) external view returns (address); + + /** + * @dev Returns the Transfer Strategy implementation contract address being used for a reward address + * @param reward The address of the reward + * @return The address of the TransferStrategy contract + */ + function getTransferStrategy(address reward) external view returns (address); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + **/ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + + /** + * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The + * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external returns (uint256); + + /** + * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" + **/ + function claimAllRewards( + address[] calldata assets, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must + * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsToSelf( + address[] calldata assets + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); +} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsDistributor.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsDistributor.sol new file mode 100644 index 00000000..5cb58856 --- /dev/null +++ b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsDistributor.sol @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title IRewardsDistributor + * @author Aave + * @notice Defines the basic interface for a Rewards Distributor. + */ +interface IRewardsDistributor { + /** + * @dev Emitted when the configuration of the rewards of an asset is updated. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param oldEmission The old emissions per second value of the reward distribution + * @param newEmission The new emissions per second value of the reward distribution + * @param oldDistributionEnd The old end timestamp of the reward distribution + * @param newDistributionEnd The new end timestamp of the reward distribution + * @param assetIndex The index of the asset distribution + */ + event AssetConfigUpdated( + address indexed asset, + address indexed reward, + uint256 oldEmission, + uint256 newEmission, + uint256 oldDistributionEnd, + uint256 newDistributionEnd, + uint256 assetIndex + ); + + /** + * @dev Emitted when rewards of an asset are accrued on behalf of a user. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param user The address of the user that rewards are accrued on behalf of + * @param assetIndex The index of the asset distribution + * @param userIndex The index of the asset distribution on behalf of the user + * @param rewardsAccrued The amount of rewards accrued + */ + event Accrued( + address indexed asset, + address indexed reward, + address indexed user, + uint256 assetIndex, + uint256 userIndex, + uint256 rewardsAccrued + ); + + /** + * @dev Sets the end date for the distribution + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Gets the end date for the distribution + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The timestamp with the end of the distribution, in unix time format + **/ + function getDistributionEnd(address asset, address reward) external view returns (uint256); + + /** + * @dev Returns the index of a user on a reward distribution + * @param user Address of the user + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The current user asset index, not including new distributions + **/ + function getUserAssetIndex( + address user, + address asset, + address reward + ) external view returns (uint256); + + /** + * @dev Returns the configuration of the distribution reward for a certain asset + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The index of the asset distribution + * @return The emission per second of the reward distribution + * @return The timestamp of the last update of the index + * @return The timestamp of the distribution end + **/ + function getRewardsData( + address asset, + address reward + ) external view returns (uint256, uint256, uint256, uint256); + + /** + * @dev Calculates the next value of an specific distribution index, with validations. + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The old index of the asset distribution + * @return The new index of the asset distribution + **/ + function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); + + /** + * @dev Returns the list of available reward token addresses of an incentivized asset + * @param asset The incentivized asset + * @return List of rewards addresses of the input asset + **/ + function getRewardsByAsset(address asset) external view returns (address[] memory); + + /** + * @dev Returns the list of available reward addresses + * @return List of rewards supported in this contract + **/ + function getRewardsList() external view returns (address[] memory); + + /** + * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. + * @param user The address of the user + * @param reward The address of the reward token + * @return Unclaimed rewards, not including new distributions + **/ + function getUserAccruedRewards(address user, address reward) external view returns (uint256); + + /** + * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @param reward The address of the reward token + * @return The rewards amount + **/ + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view returns (uint256); + + /** + * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @return The list of reward addresses + * @return The list of unclaimed amount of rewards + **/ + function getAllUserRewards( + address[] calldata assets, + address user + ) external view returns (address[] memory, uint256[] memory); + + /** + * @dev Returns the decimals of an asset to calculate the distribution delta + * @param asset The address to retrieve decimals + * @return The decimals of an underlying asset + */ + function getAssetDecimals(address asset) external view returns (uint8); + + /** + * @dev Returns the address of the emission manager + * @return The address of the EmissionManager + */ + function EMISSION_MANAGER() external view returns (address); + + /** + * @dev Returns the address of the emission manager. + * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. + * @return The address of the EmissionManager + */ + function getEmissionManager() external view returns (address); +} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/ITransferStrategyBase.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/ITransferStrategyBase.sol new file mode 100644 index 00000000..d2848fef --- /dev/null +++ b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/ITransferStrategyBase.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +interface ITransferStrategyBase { + event EmergencyWithdrawal( + address indexed caller, + address indexed token, + address indexed to, + uint256 amount + ); + + /** + * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation + * @param to Account to transfer rewards + * @param reward Address of the reward token + * @param amount Amount to transfer to the "to" address parameter + * @return Returns true bool if transfer logic succeeds + */ + function performTransfer(address to, address reward, uint256 amount) external returns (bool); + + /** + * @return Returns the address of the Incentives Controller + */ + function getIncentivesController() external view returns (address); + + /** + * @return Returns the address of the Rewards admin + */ + function getRewardsAdmin() external view returns (address); + + /** + * @dev Perform an emergency token withdrawal only callable by the Rewards admin + * @param token Address of the token to withdraw funds from this contract + * @param to Address of the recipient of the withdrawal + * @param amount Amount of the withdrawal + */ + function emergencyWithdrawal(address token, address to, uint256 amount) external; +} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/libraries/RewardsDataTypes.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/libraries/RewardsDataTypes.sol new file mode 100644 index 00000000..38fe87c5 --- /dev/null +++ b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/libraries/RewardsDataTypes.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; +import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; + +library RewardsDataTypes { + struct RewardsConfigInput { + uint88 emissionPerSecond; + uint256 totalSupply; + uint32 distributionEnd; + address asset; + address reward; + ITransferStrategyBase transferStrategy; + IEACAggregatorProxy rewardOracle; + } + + struct UserAssetBalance { + address asset; + uint256 userBalance; + uint256 totalSupply; + } + + struct UserData { + // Liquidity index of the reward distribution for the user + uint104 index; + // Amount of accrued rewards for the user since last user index update + uint128 accrued; + } + + struct RewardData { + // Liquidity index of the reward distribution + uint104 index; + // Amount of reward tokens distributed per second + uint88 emissionPerSecond; + // Timestamp of the last reward index update + uint32 lastUpdateTimestamp; + // The end of the distribution of rewards (in seconds) + uint32 distributionEnd; + // Map of user addresses and their rewards data (userAddress => userData) + mapping(address => UserData) usersData; + } + + struct AssetData { + // Map of reward token addresses and their data (rewardTokenAddress => rewardData) + mapping(address => RewardData) rewards; + // List of reward token addresses for the asset + mapping(uint128 => address) availableRewards; + // Count of reward tokens for the asset + uint128 availableRewardsCount; + // Number of decimals of the asset + uint8 decimals; + } +} diff --git a/downloads/LINEA/EMODE_LOGIC.sol b/downloads/LINEA/EMODE_LOGIC.sol new file mode 100644 index 00000000..948a894b --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC.sol @@ -0,0 +1,5536 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} + +// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..e7ba8f7a --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..647fc7e7 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..cd5b83c6 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..dd5c637d --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..e08a30e8 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,642 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..9adca939 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC.sol b/downloads/LINEA/FLASHLOAN_LOGIC.sol new file mode 100644 index 00000000..639a33a3 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC.sol @@ -0,0 +1,6143 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol + +/** + * @title IFlashLoanReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + */ +interface IFlashLoanReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed assets + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param assets The addresses of the flash-borrowed assets + * @param amounts The amounts of the flash-borrowed assets + * @param premiums The fee of each flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata premiums, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol + +/** + * @title IFlashLoanSimpleReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + */ +interface IFlashLoanSimpleReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed asset + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param asset The address of the flash-borrowed asset + * @param amount The amount of the flash-borrowed asset + * @param premium The fee of the flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address asset, + uint256 amount, + uint256 premium, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol + +/** + * @title BorrowLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to borrowing + */ +library BorrowLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the + * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the + * isolated debt. + * @dev Emits the `Borrow()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the borrow function + */ + function executeBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteBorrowParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ( + bool isolationModeActive, + address isolationModeCollateralAddress, + uint256 isolationModeDebtCeiling + ) = userConfig.getIsolationModeState(reservesData, reservesList); + + ValidationLogic.validateBorrow( + reservesData, + reservesList, + eModeCategories, + DataTypes.ValidateBorrowParams({ + reserveCache: reserveCache, + userConfig: userConfig, + asset: params.asset, + userAddress: params.onBehalfOf, + amount: params.amount, + interestRateMode: params.interestRateMode, + reservesCount: params.reservesCount, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory, + priceOracleSentinel: params.priceOracleSentinel, + isolationModeActive: isolationModeActive, + isolationModeCollateralAddress: isolationModeCollateralAddress, + isolationModeDebtCeiling: isolationModeDebtCeiling + }) + ); + + bool isFirstBorrowing = false; + + (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); + + if (isFirstBorrowing) { + userConfig.setBorrowing(reserve.id, true); + } + + if (isolationModeActive) { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt += (params.amount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + 0, + params.releaseUnderlying ? params.amount : 0 + ); + + if (params.releaseUnderlying) { + IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); + } + + emit Borrow( + params.asset, + params.user, + params.onBehalfOf, + params.amount, + DataTypes.InterestRateMode.VARIABLE, + reserve.currentVariableBorrowRate, + params.referralCode + ); + } + + /** + * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the + * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also + * reduces the isolated debt. + * @dev Emits the `Repay()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the repay function + * @return The actual amount being repaid + */ + function executeRepay( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteRepayParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + + uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( + params.onBehalfOf + ); + + ValidationLogic.validateRepay( + reserveCache, + params.amount, + params.interestRateMode, + params.onBehalfOf, + variableDebt + ); + + uint256 paybackAmount = variableDebt; + + // Allows a user to repay with aTokens without leaving dust from interest. + if (params.useATokens && params.amount == type(uint256).max) { + params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); + } + + if (params.amount < paybackAmount) { + paybackAmount = params.amount; + } + + reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) + .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + params.useATokens ? 0 : paybackAmount, + 0 + ); + + if (variableDebt - paybackAmount == 0) { + userConfig.setBorrowing(reserve.id, false); + } + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + reserveCache, + paybackAmount + ); + + if (params.useATokens) { + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + reserveCache.aTokenAddress, + paybackAmount, + reserveCache.nextLiquidityIndex + ); + // in case of aToken repayment the msg.sender must always repay on behalf of itself + if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + } else { + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); + IAToken(reserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.onBehalfOf, + paybackAmount + ); + } + + emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); + + return paybackAmount; + } +} + +// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol + +/** + * @title FlashLoanLogic library + * @author Aave + * @notice Implements the logic for the flash loans + */ +library FlashLoanLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + + // See `IPool` for descriptions + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + // Helper struct for internal variables used in the `executeFlashLoan` function + struct FlashLoanLocalVars { + IFlashLoanReceiver receiver; + address currentAsset; + uint256 currentAmount; + uint256[] totalPremiums; + uint256 flashloanPremiumTotal; + uint256 flashloanPremiumToProtocol; + } + + /** + * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction + * as long as the amount taken plus fee is returned or debt is opened. + * @dev For authorized flashborrowers the fee is waived + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the flashloan function + */ + function executeFlashLoan( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.FlashloanParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); + + FlashLoanLocalVars memory vars; + + vars.totalPremiums = new uint256[](params.assets.length); + + vars.receiver = IFlashLoanReceiver(params.receiverAddress); + (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower + ? (0, 0) + : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); + + for (uint256 i = 0; i < params.assets.length; i++) { + vars.currentAmount = params.amounts[i]; + vars.totalPremiums[i] = DataTypes.InterestRateMode(params.interestRateModes[i]) == + DataTypes.InterestRateMode.NONE + ? vars.currentAmount.percentMul(vars.flashloanPremiumTotal) + : 0; + + if (reservesData[params.assets[i]].configuration.getIsVirtualAccActive()) { + reservesData[params.assets[i]].virtualUnderlyingBalance -= vars.currentAmount.toUint128(); + } + + IAToken(reservesData[params.assets[i]].aTokenAddress).transferUnderlyingTo( + params.receiverAddress, + vars.currentAmount + ); + } + + require( + vars.receiver.executeOperation( + params.assets, + params.amounts, + vars.totalPremiums, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + for (uint256 i = 0; i < params.assets.length; i++) { + vars.currentAsset = params.assets[i]; + vars.currentAmount = params.amounts[i]; + + if ( + DataTypes.InterestRateMode(params.interestRateModes[i]) == DataTypes.InterestRateMode.NONE + ) { + _handleFlashLoanRepayment( + reservesData[vars.currentAsset], + DataTypes.FlashLoanRepaymentParams({ + asset: vars.currentAsset, + receiverAddress: params.receiverAddress, + amount: vars.currentAmount, + totalPremium: vars.totalPremiums[i], + flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } else { + // If the user chose to not return the funds, the system checks if there is enough collateral and + // eventually opens a debt position + BorrowLogic.executeBorrow( + reservesData, + reservesList, + eModeCategories, + userConfig, + DataTypes.ExecuteBorrowParams({ + asset: vars.currentAsset, + user: msg.sender, + onBehalfOf: params.onBehalfOf, + amount: vars.currentAmount, + interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[i]), + referralCode: params.referralCode, + releaseUnderlying: false, + reservesCount: IPool(params.pool).getReservesCount(), + oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), + userEModeCategory: IPool(params.pool).getUserEMode(params.onBehalfOf).toUint8(), + priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) + .getPriceOracleSentinel() + }) + ); + // no premium is paid when taking on the flashloan as debt + emit FlashLoan( + params.receiverAddress, + msg.sender, + vars.currentAsset, + vars.currentAmount, + DataTypes.InterestRateMode(params.interestRateModes[i]), + 0, + params.referralCode + ); + } + } + } + + /** + * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one + * transaction as long as the amount taken plus fee is returned. + * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the simple flashloan function + */ + function executeFlashLoanSimple( + DataTypes.ReserveData storage reserve, + DataTypes.FlashloanSimpleParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloanSimple(reserve, params.amount); + + IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); + uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); + + if (reserve.configuration.getIsVirtualAccActive()) { + reserve.virtualUnderlyingBalance -= params.amount.toUint128(); + } + + IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); + + require( + receiver.executeOperation( + params.asset, + params.amount, + totalPremium, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + _handleFlashLoanRepayment( + reserve, + DataTypes.FlashLoanRepaymentParams({ + asset: params.asset, + receiverAddress: params.receiverAddress, + amount: params.amount, + totalPremium: totalPremium, + flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } + + /** + * @notice Handles repayment of flashloaned assets + premium + * @dev Will pull the amount + premium from the receiver, so must have approved pool + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the repayment function + */ + function _handleFlashLoanRepayment( + DataTypes.ReserveData storage reserve, + DataTypes.FlashLoanRepaymentParams memory params + ) internal { + uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); + uint256 premiumToLP = params.totalPremium - premiumToProtocol; + uint256 amountPlusPremium = params.amount + params.totalPremium; + + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply() + + uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), + premiumToLP + ); + + reserve.accruedToTreasury += premiumToProtocol + .rayDiv(reserveCache.nextLiquidityIndex) + .toUint128(); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, amountPlusPremium, 0); + + IERC20(params.asset).safeTransferFrom( + params.receiverAddress, + reserveCache.aTokenAddress, + amountPlusPremium + ); + + IAToken(reserveCache.aTokenAddress).handleRepayment( + params.receiverAddress, + params.receiverAddress, + amountPlusPremium + ); + + emit FlashLoan( + params.receiverAddress, + msg.sender, + params.asset, + params.amount, + DataTypes.InterestRateMode.NONE, + params.totalPremium, + params.referralCode + ); + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..e7ba8f7a --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol new file mode 100644 index 00000000..a3a55684 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; + +/** + * @title IFlashLoanReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + */ +interface IFlashLoanReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed assets + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param assets The addresses of the flash-borrowed assets + * @param amounts The amounts of the flash-borrowed assets + * @param premiums The fee of each flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata premiums, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol new file mode 100644 index 00000000..bff21ae4 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; + +/** + * @title IFlashLoanSimpleReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + */ +interface IFlashLoanSimpleReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed asset + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param asset The address of the flash-borrowed asset + * @param amount The amount of the flash-borrowed asset + * @param premium The fee of the flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address asset, + uint256 amount, + uint256 premium, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol new file mode 100644 index 00000000..c4ed26ed --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {IsolationModeLogic} from './IsolationModeLogic.sol'; + +/** + * @title BorrowLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to borrowing + */ +library BorrowLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the + * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the + * isolated debt. + * @dev Emits the `Borrow()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the borrow function + */ + function executeBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteBorrowParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ( + bool isolationModeActive, + address isolationModeCollateralAddress, + uint256 isolationModeDebtCeiling + ) = userConfig.getIsolationModeState(reservesData, reservesList); + + ValidationLogic.validateBorrow( + reservesData, + reservesList, + eModeCategories, + DataTypes.ValidateBorrowParams({ + reserveCache: reserveCache, + userConfig: userConfig, + asset: params.asset, + userAddress: params.onBehalfOf, + amount: params.amount, + interestRateMode: params.interestRateMode, + reservesCount: params.reservesCount, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory, + priceOracleSentinel: params.priceOracleSentinel, + isolationModeActive: isolationModeActive, + isolationModeCollateralAddress: isolationModeCollateralAddress, + isolationModeDebtCeiling: isolationModeDebtCeiling + }) + ); + + bool isFirstBorrowing = false; + + (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); + + if (isFirstBorrowing) { + userConfig.setBorrowing(reserve.id, true); + } + + if (isolationModeActive) { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt += (params.amount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + 0, + params.releaseUnderlying ? params.amount : 0 + ); + + if (params.releaseUnderlying) { + IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); + } + + emit Borrow( + params.asset, + params.user, + params.onBehalfOf, + params.amount, + DataTypes.InterestRateMode.VARIABLE, + reserve.currentVariableBorrowRate, + params.referralCode + ); + } + + /** + * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the + * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also + * reduces the isolated debt. + * @dev Emits the `Repay()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the repay function + * @return The actual amount being repaid + */ + function executeRepay( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteRepayParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + + uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( + params.onBehalfOf + ); + + ValidationLogic.validateRepay( + reserveCache, + params.amount, + params.interestRateMode, + params.onBehalfOf, + variableDebt + ); + + uint256 paybackAmount = variableDebt; + + // Allows a user to repay with aTokens without leaving dust from interest. + if (params.useATokens && params.amount == type(uint256).max) { + params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); + } + + if (params.amount < paybackAmount) { + paybackAmount = params.amount; + } + + reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) + .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + params.useATokens ? 0 : paybackAmount, + 0 + ); + + if (variableDebt - paybackAmount == 0) { + userConfig.setBorrowing(reserve.id, false); + } + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + reserveCache, + paybackAmount + ); + + if (params.useATokens) { + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + reserveCache.aTokenAddress, + paybackAmount, + reserveCache.nextLiquidityIndex + ); + // in case of aToken repayment the msg.sender must always repay on behalf of itself + if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + } else { + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); + IAToken(reserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.onBehalfOf, + paybackAmount + ); + } + + emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); + + return paybackAmount; + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..647fc7e7 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol new file mode 100644 index 00000000..31ffb288 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol @@ -0,0 +1,277 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IFlashLoanReceiver} from '../../../misc/flashloan/interfaces/IFlashLoanReceiver.sol'; +import {IFlashLoanSimpleReceiver} from '../../../misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {BorrowLogic} from './BorrowLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title FlashLoanLogic library + * @author Aave + * @notice Implements the logic for the flash loans + */ +library FlashLoanLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + + // See `IPool` for descriptions + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + // Helper struct for internal variables used in the `executeFlashLoan` function + struct FlashLoanLocalVars { + IFlashLoanReceiver receiver; + address currentAsset; + uint256 currentAmount; + uint256[] totalPremiums; + uint256 flashloanPremiumTotal; + uint256 flashloanPremiumToProtocol; + } + + /** + * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction + * as long as the amount taken plus fee is returned or debt is opened. + * @dev For authorized flashborrowers the fee is waived + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the flashloan function + */ + function executeFlashLoan( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.FlashloanParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); + + FlashLoanLocalVars memory vars; + + vars.totalPremiums = new uint256[](params.assets.length); + + vars.receiver = IFlashLoanReceiver(params.receiverAddress); + (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower + ? (0, 0) + : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); + + for (uint256 i = 0; i < params.assets.length; i++) { + vars.currentAmount = params.amounts[i]; + vars.totalPremiums[i] = DataTypes.InterestRateMode(params.interestRateModes[i]) == + DataTypes.InterestRateMode.NONE + ? vars.currentAmount.percentMul(vars.flashloanPremiumTotal) + : 0; + + if (reservesData[params.assets[i]].configuration.getIsVirtualAccActive()) { + reservesData[params.assets[i]].virtualUnderlyingBalance -= vars.currentAmount.toUint128(); + } + + IAToken(reservesData[params.assets[i]].aTokenAddress).transferUnderlyingTo( + params.receiverAddress, + vars.currentAmount + ); + } + + require( + vars.receiver.executeOperation( + params.assets, + params.amounts, + vars.totalPremiums, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + for (uint256 i = 0; i < params.assets.length; i++) { + vars.currentAsset = params.assets[i]; + vars.currentAmount = params.amounts[i]; + + if ( + DataTypes.InterestRateMode(params.interestRateModes[i]) == DataTypes.InterestRateMode.NONE + ) { + _handleFlashLoanRepayment( + reservesData[vars.currentAsset], + DataTypes.FlashLoanRepaymentParams({ + asset: vars.currentAsset, + receiverAddress: params.receiverAddress, + amount: vars.currentAmount, + totalPremium: vars.totalPremiums[i], + flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } else { + // If the user chose to not return the funds, the system checks if there is enough collateral and + // eventually opens a debt position + BorrowLogic.executeBorrow( + reservesData, + reservesList, + eModeCategories, + userConfig, + DataTypes.ExecuteBorrowParams({ + asset: vars.currentAsset, + user: msg.sender, + onBehalfOf: params.onBehalfOf, + amount: vars.currentAmount, + interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[i]), + referralCode: params.referralCode, + releaseUnderlying: false, + reservesCount: IPool(params.pool).getReservesCount(), + oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), + userEModeCategory: IPool(params.pool).getUserEMode(params.onBehalfOf).toUint8(), + priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) + .getPriceOracleSentinel() + }) + ); + // no premium is paid when taking on the flashloan as debt + emit FlashLoan( + params.receiverAddress, + msg.sender, + vars.currentAsset, + vars.currentAmount, + DataTypes.InterestRateMode(params.interestRateModes[i]), + 0, + params.referralCode + ); + } + } + } + + /** + * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one + * transaction as long as the amount taken plus fee is returned. + * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the simple flashloan function + */ + function executeFlashLoanSimple( + DataTypes.ReserveData storage reserve, + DataTypes.FlashloanSimpleParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloanSimple(reserve, params.amount); + + IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); + uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); + + if (reserve.configuration.getIsVirtualAccActive()) { + reserve.virtualUnderlyingBalance -= params.amount.toUint128(); + } + + IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); + + require( + receiver.executeOperation( + params.asset, + params.amount, + totalPremium, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + _handleFlashLoanRepayment( + reserve, + DataTypes.FlashLoanRepaymentParams({ + asset: params.asset, + receiverAddress: params.receiverAddress, + amount: params.amount, + totalPremium: totalPremium, + flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } + + /** + * @notice Handles repayment of flashloaned assets + premium + * @dev Will pull the amount + premium from the receiver, so must have approved pool + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the repayment function + */ + function _handleFlashLoanRepayment( + DataTypes.ReserveData storage reserve, + DataTypes.FlashLoanRepaymentParams memory params + ) internal { + uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); + uint256 premiumToLP = params.totalPremium - premiumToProtocol; + uint256 amountPlusPremium = params.amount + params.totalPremium; + + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply() + + uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), + premiumToLP + ); + + reserve.accruedToTreasury += premiumToProtocol + .rayDiv(reserveCache.nextLiquidityIndex) + .toUint128(); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, amountPlusPremium, 0); + + IERC20(params.asset).safeTransferFrom( + params.receiverAddress, + reserveCache.aTokenAddress, + amountPlusPremium + ); + + IAToken(reserveCache.aTokenAddress).handleRepayment( + params.receiverAddress, + params.receiverAddress, + amountPlusPremium + ); + + emit FlashLoan( + params.receiverAddress, + msg.sender, + params.asset, + params.amount, + DataTypes.InterestRateMode.NONE, + params.totalPremium, + params.referralCode + ); + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..cd5b83c6 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol new file mode 100644 index 00000000..473840ea --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..dd5c637d --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..e08a30e8 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,642 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..9adca939 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/LINEA/L2_ENCODER.sol b/downloads/LINEA/L2_ENCODER.sol new file mode 100644 index 00000000..42a55800 --- /dev/null +++ b/downloads/LINEA/L2_ENCODER.sol @@ -0,0 +1,1932 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/helpers/L2Encoder.sol + +/** + * @title L2Encoder + * @author Aave + * @notice Helper contract to encode calldata, used to optimize calldata size in L2Pool for transaction cost reduction + * only indented to help generate calldata for uses/frontends. + */ +contract L2Encoder { + using SafeCast for uint256; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The address of the Pool contract + */ + constructor(IPool pool) { + POOL = pool; + } + + /** + * @notice Encodes supply parameters from standard input to compact representation of 1 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param referralCode referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @return compact representation of supply parameters + */ + function encodeSupplyParams( + address asset, + uint256 amount, + uint16 referralCode + ) external view returns (bytes32) { + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount.toUint128(); + bytes32 res; + + assembly { + res := add(assetId, add(shl(16, shortenedAmount), shl(144, referralCode))) + } + return res; + } + + /** + * @notice Encodes supplyWithPermit parameters from standard input to compact representation of 3 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param referralCode referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return compact representation of supplyWithPermit parameters + * @return The R parameter of ERC712 permit sig + * @return The S parameter of ERC712 permit sig + */ + function encodeSupplyWithPermitParams( + address asset, + uint256 amount, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external view returns (bytes32, bytes32, bytes32) { + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount.toUint128(); + uint32 shortenedDeadline = deadline.toUint32(); + + bytes32 res; + assembly { + res := add( + assetId, + add( + shl(16, shortenedAmount), + add(shl(144, referralCode), add(shl(160, shortenedDeadline), shl(192, permitV))) + ) + ) + } + + return (res, permitR, permitS); + } + + /** + * @notice Encodes withdraw parameters from standard input to compact representation of 1 bytes32 + * @dev Without a to parameter as the compact calls to L2Pool will use msg.sender as to + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * @return compact representation of withdraw parameters + */ + function encodeWithdrawParams(address asset, uint256 amount) external view returns (bytes32) { + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); + + bytes32 res; + assembly { + res := add(assetId, shl(16, shortenedAmount)) + } + return res; + } + + /** + * @notice Encodes borrow parameters from standard input to compact representation of 1 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode The interest rate mode at which the user wants to borrow: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @return compact representation of withdraw parameters + */ + function encodeBorrowParams( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode + ) external view returns (bytes32) { + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount.toUint128(); + uint8 shortenedInterestRateMode = interestRateMode.toUint8(); + bytes32 res; + assembly { + res := add( + assetId, + add( + shl(16, shortenedAmount), + add(shl(144, shortenedInterestRateMode), shl(152, referralCode)) + ) + ) + } + return res; + } + + /** + * @notice Encodes repay parameters from standard input to compact representation of 1 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `interestRateMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @return compact representation of repay parameters + */ + function encodeRepayParams( + address asset, + uint256 amount, + uint256 interestRateMode + ) public view returns (bytes32) { + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); + uint8 shortenedInterestRateMode = interestRateMode.toUint8(); + + bytes32 res; + assembly { + res := add(assetId, add(shl(16, shortenedAmount), shl(144, shortenedInterestRateMode))) + } + return res; + } + + /** + * @notice Encodes repayWithPermit parameters from standard input to compact representation of 3 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return compact representation of repayWithPermit parameters + * @return The R parameter of ERC712 permit sig + * @return The S parameter of ERC712 permit sig + */ + function encodeRepayWithPermitParams( + address asset, + uint256 amount, + uint256 interestRateMode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external view returns (bytes32, bytes32, bytes32) { + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); + uint8 shortenedInterestRateMode = interestRateMode.toUint8(); + uint32 shortenedDeadline = deadline.toUint32(); + + bytes32 res; + assembly { + res := add( + assetId, + add( + shl(16, shortenedAmount), + add( + shl(144, shortenedInterestRateMode), + add(shl(152, shortenedDeadline), shl(184, permitV)) + ) + ) + ) + } + return (res, permitR, permitS); + } + + /** + * @notice Encodes repay with aToken parameters from standard input to compact representation of 1 bytes32 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @return compact representation of repay with aToken parameters + */ + function encodeRepayWithATokensParams( + address asset, + uint256 amount, + uint256 interestRateMode + ) external view returns (bytes32) { + return encodeRepayParams(asset, amount, interestRateMode); + } + + /** + * @notice Encodes set user use reserve as collateral parameters from standard input to compact representation of 1 bytes32 + * @param asset The address of the underlying asset borrowed + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + * @return compact representation of set user use reserve as collateral parameters + */ + function encodeSetUserUseReserveAsCollateral( + address asset, + bool useAsCollateral + ) external view returns (bytes32) { + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + uint16 assetId = data.id; + bytes32 res; + assembly { + res := add(assetId, shl(16, useAsCollateral)) + } + return res; + } + + /** + * @notice Encodes liquidation call parameters from standard input to compact representation of 2 bytes32 + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + * @return First half ot compact representation of liquidation call parameters + * @return Second half ot compact representation of liquidation call parameters + */ + function encodeLiquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external view returns (bytes32, bytes32) { + DataTypes.ReserveDataLegacy memory collateralData = POOL.getReserveData(collateralAsset); + uint16 collateralAssetId = collateralData.id; + + DataTypes.ReserveDataLegacy memory debtData = POOL.getReserveData(debtAsset); + uint16 debtAssetId = debtData.id; + + uint128 shortenedDebtToCover = debtToCover == type(uint256).max + ? type(uint128).max + : debtToCover.toUint128(); + + bytes32 res1; + bytes32 res2; + + assembly { + res1 := add(add(collateralAssetId, shl(16, debtAssetId)), shl(32, user)) + res2 := add(shortenedDebtToCover, shl(128, receiveAToken)) + } + return (res1, res2); + } +} diff --git a/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/helpers/L2Encoder.sol b/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/helpers/L2Encoder.sol new file mode 100644 index 00000000..7c1bd96c --- /dev/null +++ b/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/helpers/L2Encoder.sol @@ -0,0 +1,296 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {SafeCast} from '../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IPool} from '../interfaces/IPool.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title L2Encoder + * @author Aave + * @notice Helper contract to encode calldata, used to optimize calldata size in L2Pool for transaction cost reduction + * only indented to help generate calldata for uses/frontends. + */ +contract L2Encoder { + using SafeCast for uint256; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The address of the Pool contract + */ + constructor(IPool pool) { + POOL = pool; + } + + /** + * @notice Encodes supply parameters from standard input to compact representation of 1 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param referralCode referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @return compact representation of supply parameters + */ + function encodeSupplyParams( + address asset, + uint256 amount, + uint16 referralCode + ) external view returns (bytes32) { + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount.toUint128(); + bytes32 res; + + assembly { + res := add(assetId, add(shl(16, shortenedAmount), shl(144, referralCode))) + } + return res; + } + + /** + * @notice Encodes supplyWithPermit parameters from standard input to compact representation of 3 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param referralCode referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return compact representation of supplyWithPermit parameters + * @return The R parameter of ERC712 permit sig + * @return The S parameter of ERC712 permit sig + */ + function encodeSupplyWithPermitParams( + address asset, + uint256 amount, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external view returns (bytes32, bytes32, bytes32) { + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount.toUint128(); + uint32 shortenedDeadline = deadline.toUint32(); + + bytes32 res; + assembly { + res := add( + assetId, + add( + shl(16, shortenedAmount), + add(shl(144, referralCode), add(shl(160, shortenedDeadline), shl(192, permitV))) + ) + ) + } + + return (res, permitR, permitS); + } + + /** + * @notice Encodes withdraw parameters from standard input to compact representation of 1 bytes32 + * @dev Without a to parameter as the compact calls to L2Pool will use msg.sender as to + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * @return compact representation of withdraw parameters + */ + function encodeWithdrawParams(address asset, uint256 amount) external view returns (bytes32) { + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); + + bytes32 res; + assembly { + res := add(assetId, shl(16, shortenedAmount)) + } + return res; + } + + /** + * @notice Encodes borrow parameters from standard input to compact representation of 1 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode The interest rate mode at which the user wants to borrow: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @return compact representation of withdraw parameters + */ + function encodeBorrowParams( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode + ) external view returns (bytes32) { + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount.toUint128(); + uint8 shortenedInterestRateMode = interestRateMode.toUint8(); + bytes32 res; + assembly { + res := add( + assetId, + add( + shl(16, shortenedAmount), + add(shl(144, shortenedInterestRateMode), shl(152, referralCode)) + ) + ) + } + return res; + } + + /** + * @notice Encodes repay parameters from standard input to compact representation of 1 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `interestRateMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @return compact representation of repay parameters + */ + function encodeRepayParams( + address asset, + uint256 amount, + uint256 interestRateMode + ) public view returns (bytes32) { + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); + uint8 shortenedInterestRateMode = interestRateMode.toUint8(); + + bytes32 res; + assembly { + res := add(assetId, add(shl(16, shortenedAmount), shl(144, shortenedInterestRateMode))) + } + return res; + } + + /** + * @notice Encodes repayWithPermit parameters from standard input to compact representation of 3 bytes32 + * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return compact representation of repayWithPermit parameters + * @return The R parameter of ERC712 permit sig + * @return The S parameter of ERC712 permit sig + */ + function encodeRepayWithPermitParams( + address asset, + uint256 amount, + uint256 interestRateMode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external view returns (bytes32, bytes32, bytes32) { + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + + uint16 assetId = data.id; + uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); + uint8 shortenedInterestRateMode = interestRateMode.toUint8(); + uint32 shortenedDeadline = deadline.toUint32(); + + bytes32 res; + assembly { + res := add( + assetId, + add( + shl(16, shortenedAmount), + add( + shl(144, shortenedInterestRateMode), + add(shl(152, shortenedDeadline), shl(184, permitV)) + ) + ) + ) + } + return (res, permitR, permitS); + } + + /** + * @notice Encodes repay with aToken parameters from standard input to compact representation of 1 bytes32 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @return compact representation of repay with aToken parameters + */ + function encodeRepayWithATokensParams( + address asset, + uint256 amount, + uint256 interestRateMode + ) external view returns (bytes32) { + return encodeRepayParams(asset, amount, interestRateMode); + } + + /** + * @notice Encodes set user use reserve as collateral parameters from standard input to compact representation of 1 bytes32 + * @param asset The address of the underlying asset borrowed + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + * @return compact representation of set user use reserve as collateral parameters + */ + function encodeSetUserUseReserveAsCollateral( + address asset, + bool useAsCollateral + ) external view returns (bytes32) { + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); + uint16 assetId = data.id; + bytes32 res; + assembly { + res := add(assetId, shl(16, useAsCollateral)) + } + return res; + } + + /** + * @notice Encodes liquidation call parameters from standard input to compact representation of 2 bytes32 + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + * @return First half ot compact representation of liquidation call parameters + * @return Second half ot compact representation of liquidation call parameters + */ + function encodeLiquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external view returns (bytes32, bytes32) { + DataTypes.ReserveDataLegacy memory collateralData = POOL.getReserveData(collateralAsset); + uint16 collateralAssetId = collateralData.id; + + DataTypes.ReserveDataLegacy memory debtData = POOL.getReserveData(debtAsset); + uint16 debtAssetId = debtData.id; + + uint128 shortenedDebtToCover = debtToCover == type(uint256).max + ? type(uint128).max + : debtToCover.toUint128(); + + bytes32 res1; + bytes32 res2; + + assembly { + res1 := add(add(collateralAssetId, shl(16, debtAssetId)), shl(32, user)) + res2 := add(shortenedDebtToCover, shl(128, receiveAToken)) + } + return (res1, res2); + } +} diff --git a/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPool.sol b/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL.sol b/downloads/LINEA/L2_POOL_IMPL.sol new file mode 100644 index 00000000..8f4817d9 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL.sol @@ -0,0 +1,8682 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IL2Pool.sol + +/** + * @title IL2Pool + * @author Aave + * @notice Defines the basic extension interface for an L2 Aave Pool. + */ +interface IL2Pool { + /** + * @notice Calldata efficient wrapper of the supply function on behalf of the caller + * @param args Arguments for the supply function packed in one bytes32 + * 96 bits 16 bits 128 bits 16 bits + * | 0-padding | referralCode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + */ + function supply(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the supplyWithPermit function on behalf of the caller + * @param args Arguments for the supply function packed in one bytes32 + * 56 bits 8 bits 32 bits 16 bits 128 bits 16 bits + * | 0-padding | permitV | shortenedDeadline | referralCode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @param r The R parameter of ERC712 permit sig + * @param s The S parameter of ERC712 permit sig + */ + function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s) external; + + /** + * @notice Calldata efficient wrapper of the withdraw function, withdrawing to the caller + * @param args Arguments for the withdraw function packed in one bytes32 + * 112 bits 128 bits 16 bits + * | 0-padding | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @return The final amount withdrawn + */ + function withdraw(bytes32 args) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the borrow function, borrowing on behalf of the caller + * @param args Arguments for the borrow function packed in one bytes32 + * 88 bits 16 bits 8 bits 128 bits 16 bits + * | 0-padding | referralCode | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + */ + function borrow(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the repay function, repaying on behalf of the caller + * @param args Arguments for the repay function packed in one bytes32 + * 104 bits 8 bits 128 bits 16 bits + * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @return The final amount repaid + */ + function repay(bytes32 args) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the repayWithPermit function, repaying on behalf of the caller + * @param args Arguments for the repayWithPermit function packed in one bytes32 + * 64 bits 8 bits 32 bits 8 bits 128 bits 16 bits + * | 0-padding | permitV | shortenedDeadline | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @param r The R parameter of ERC712 permit sig + * @param s The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the repayWithATokens function + * @param args Arguments for the repayWithATokens function packed in one bytes32 + * 104 bits 8 bits 128 bits 16 bits + * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @return The final amount repaid + */ + function repayWithATokens(bytes32 args) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the setUserUseReserveAsCollateral function + * @param args Arguments for the setUserUseReserveAsCollateral function packed in one bytes32 + * 239 bits 1 bit 16 bits + * | 0-padding | useAsCollateral | assetId | + * @dev assetId is the index of the asset in the reservesList. + */ + function setUserUseReserveAsCollateral(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the liquidationCall function + * @param args1 part of the arguments for the liquidationCall function packed in one bytes32 + * 64 bits 160 bits 16 bits 16 bits + * | 0-padding | user address | debtAssetId | collateralAssetId | + * @param args2 part of the arguments for the liquidationCall function packed in one bytes32 + * 127 bits 1 bit 128 bits + * | 0-padding | receiveAToken | shortenedDebtToCover | + * @dev the shortenedDebtToCover is cast to 256 bits at decode time, + * if type(uint128).max the value will be expanded to type(uint256).max + */ + function liquidationCall(bytes32 args1, bytes32 args2) external; +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/CalldataLogic.sol + +/** + * @title CalldataLogic library + * @author Aave + * @notice Library to decode calldata, used to optimize calldata size in L2Pool for transaction cost reduction + */ +library CalldataLogic { + /** + * @notice Decodes compressed supply params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed supply params + * @return The address of the underlying reserve + * @return The amount to supply + * @return The referralCode + */ + function decodeSupplyParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint16) { + uint16 assetId; + uint256 amount; + uint16 referralCode; + + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + referralCode := and(shr(144, args), 0xFFFF) + } + return (reservesList[assetId], amount, referralCode); + } + + /** + * @notice Decodes compressed supply params to standard params along with permit params + * @param reservesList The addresses of all the active reserves + * @param args The packed supply with permit params + * @return The address of the underlying reserve + * @return The amount to supply + * @return The referralCode + * @return The deadline of the permit + * @return The V value of the permit signature + */ + function decodeSupplyWithPermitParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint16, uint256, uint8) { + uint256 deadline; + uint8 permitV; + + assembly { + deadline := and(shr(160, args), 0xFFFFFFFF) + permitV := and(shr(192, args), 0xFF) + } + (address asset, uint256 amount, uint16 referralCode) = decodeSupplyParams(reservesList, args); + + return (asset, amount, referralCode, deadline, permitV); + } + + /** + * @notice Decodes compressed withdraw params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed withdraw params + * @return The address of the underlying reserve + * @return The amount to withdraw + */ + function decodeWithdrawParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256) { + uint16 assetId; + uint256 amount; + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + } + if (amount == type(uint128).max) { + amount = type(uint256).max; + } + return (reservesList[assetId], amount); + } + + /** + * @notice Decodes compressed borrow params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed borrow params + * @return The address of the underlying reserve + * @return The amount to borrow + * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) + * @return The referralCode + */ + function decodeBorrowParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint256, uint16) { + uint16 assetId; + uint256 amount; + uint256 interestRateMode; + uint16 referralCode; + + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + interestRateMode := and(shr(144, args), 0xFF) + referralCode := and(shr(152, args), 0xFFFF) + } + + return (reservesList[assetId], amount, interestRateMode, referralCode); + } + + /** + * @notice Decodes compressed repay params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed repay params + * @return The address of the underlying reserve + * @return The amount to repay + * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) + */ + function decodeRepayParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint256) { + uint16 assetId; + uint256 amount; + uint256 interestRateMode; + + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + interestRateMode := and(shr(144, args), 0xFF) + } + + if (amount == type(uint128).max) { + amount = type(uint256).max; + } + + return (reservesList[assetId], amount, interestRateMode); + } + + /** + * @notice Decodes compressed repay params to standard params along with permit params + * @param reservesList The addresses of all the active reserves + * @param args The packed repay with permit params + * @return The address of the underlying reserve + * @return The amount to repay + * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) + * @return The deadline of the permit + * @return The V value of the permit signature + */ + function decodeRepayWithPermitParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint256, uint256, uint8) { + uint256 deadline; + uint8 permitV; + + (address asset, uint256 amount, uint256 interestRateMode) = decodeRepayParams( + reservesList, + args + ); + + assembly { + deadline := and(shr(152, args), 0xFFFFFFFF) + permitV := and(shr(184, args), 0xFF) + } + + return (asset, amount, interestRateMode, deadline, permitV); + } + + /** + * @notice Decodes compressed set user use reserve as collateral params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed set user use reserve as collateral params + * @return The address of the underlying reserve + * @return True if to set using as collateral, false otherwise + */ + function decodeSetUserUseReserveAsCollateralParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, bool) { + uint16 assetId; + bool useAsCollateral; + assembly { + assetId := and(args, 0xFFFF) + useAsCollateral := and(shr(16, args), 0x1) + } + return (reservesList[assetId], useAsCollateral); + } + + /** + * @notice Decodes compressed liquidation call params to standard params + * @param reservesList The addresses of all the active reserves + * @param args1 The first half of packed liquidation call params + * @param args2 The second half of the packed liquidation call params + * @return The address of the underlying collateral asset + * @return The address of the underlying debt asset + * @return The address of the user to liquidate + * @return The amount of debt to cover + * @return True if receiving aTokens, false otherwise + */ + function decodeLiquidationCallParams( + mapping(uint256 => address) storage reservesList, + bytes32 args1, + bytes32 args2 + ) internal view returns (address, address, address, uint256, bool) { + uint16 collateralAssetId; + uint16 debtAssetId; + address user; + uint256 debtToCover; + bool receiveAToken; + + assembly { + collateralAssetId := and(args1, 0xFFFF) + debtAssetId := and(shr(16, args1), 0xFFFF) + user := and(shr(32, args1), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + + debtToCover := and(args2, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + receiveAToken := and(shr(128, args2), 0x1) + } + + if (debtToCover == type(uint128).max) { + debtToCover = type(uint256).max; + } + + return ( + reservesList[collateralAssetId], + reservesList[debtAssetId], + user, + debtToCover, + receiveAToken + ); + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IERC20WithPermit.sol + +/** + * @title IERC20WithPermit + * @author Aave + * @notice Interface for the permit function (EIP-2612) + */ +interface IERC20WithPermit is IERC20 { + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleSentinel.sol + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/MathUtils.sol + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol + +/** + * @title IFlashLoanReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + */ +interface IFlashLoanReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed assets + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param assets The addresses of the flash-borrowed assets + * @param amounts The amounts of the flash-borrowed assets + * @param premiums The fee of each flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata premiums, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol + +/** + * @title IFlashLoanSimpleReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + */ +interface IFlashLoanSimpleReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed asset + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param asset The address of the flash-borrowed asset + * @param amount The amount of the flash-borrowed asset + * @param premium The fee of the flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address asset, + uint256 amount, + uint256 premium, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ReserveLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/PoolStorage.sol + +/** + * @title PoolStorage + * @author Aave + * @notice Contract used as storage of the Pool contract. + * @dev It defines the storage layout of the Pool contract. + */ +contract PoolStorage { + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + // Map of reserves and their data (underlyingAssetOfReserve => reserveData) + mapping(address => DataTypes.ReserveData) internal _reserves; + + // Map of users address and their configuration data (userAddress => userConfiguration) + mapping(address => DataTypes.UserConfigurationMap) internal _usersConfig; + + // List of reserves as a map (reserveId => reserve). + // It is structured as a mapping for gas savings reasons, using the reserve id as index + mapping(uint256 => address) internal _reservesList; + + // List of eMode categories as a map (eModeCategoryId => eModeCategory). + // It is structured as a mapping for gas savings reasons, using the eModeCategoryId as index + mapping(uint8 => DataTypes.EModeCategory) internal _eModeCategories; + + // Map of users address and their eMode category (userAddress => eModeCategoryId) + mapping(address => uint8) internal _usersEModeCategory; + + // Fee of the protocol bridge, expressed in bps + uint256 internal _bridgeProtocolFee; + + // Total FlashLoan Premium, expressed in bps + uint128 internal _flashLoanPremiumTotal; + + // FlashLoan premium paid to protocol treasury, expressed in bps + uint128 internal _flashLoanPremiumToProtocol; + + // DEPRECATED on v3.2.0 + uint64 internal __DEPRECATED_maxStableRateBorrowSizePercent; + + // Maximum number of active reserves there have been in the protocol. It is the upper bound of the reserves list + uint16 internal _reservesCount; +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/EModeLogic.sol + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/GenericLogic.sol + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ValidationLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BridgeLogic.sol + +library BridgeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. + * @dev Essentially a supply without transferring the underlying. + * @dev Emits the `MintUnbacked` event + * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param asset The address of the underlying asset to mint aTokens of + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function executeMintUnbacked( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, reserve, amount, onBehalfOf); + + uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); + uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); + + uint256 unbacked = reserve.unbacked += amount.toUint128(); + + require( + unbacked <= unbackedMintCap * (10 ** reserveDecimals), + Errors.UNBACKED_MINT_CAP_EXCEEDED + ); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, 0, 0); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + onBehalfOf, + amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration, + reserveCache.aTokenAddress + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); + } + } + + emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); + } + + /** + * @notice Back the current unbacked with `amount` and pay `fee`. + * @dev It is not possible to back more than the existing unbacked amount of the reserve + * @dev Emits the `BackUnbacked` event + * @param reserve The reserve to back unbacked for + * @param asset The address of the underlying asset to repay + * @param amount The amount to back + * @param fee The amount paid in fees + * @param protocolFeeBps The fraction of fees in basis points paid to the protocol + * @return The backed amount + */ + function executeBackUnbacked( + DataTypes.ReserveData storage reserve, + address asset, + uint256 amount, + uint256 fee, + uint256 protocolFeeBps + ) external returns (uint256) { + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; + + uint256 feeToProtocol = fee.percentMul(protocolFeeBps); + uint256 feeToLP = fee - feeToProtocol; + uint256 added = backingAmount + fee; + + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply() + + uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), + feeToLP + ); + + reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + + reserve.unbacked -= backingAmount.toUint128(); + reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, added, 0); + + IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); + + emit BackUnbacked(asset, msg.sender, backingAmount, fee); + + return backingAmount; + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/PoolLogic.sol + +/** + * @title PoolLogic library + * @author Aave + * @notice Implements the logic for Pool specific functions + */ +library PoolLogic { + using GPv2SafeERC20 for IERC20; + using WadRayMath for uint256; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice Initialize an asset reserve and add the reserve to the list of reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param params Additional parameters needed for initiation + * @return true if appended, false if inserted at existing empty spot + */ + function executeInitReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.InitReserveParams memory params + ) external returns (bool) { + require(Address.isContract(params.asset), Errors.NOT_CONTRACT); + reservesData[params.asset].init( + params.aTokenAddress, + params.variableDebtAddress, + params.interestRateStrategyAddress + ); + + bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || + reservesList[0] == params.asset; + require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); + + for (uint16 i = 0; i < params.reservesCount; i++) { + if (reservesList[i] == address(0)) { + reservesData[params.asset].id = i; + reservesList[i] = params.asset; + return false; + } + } + + require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); + reservesData[params.asset].id = params.reservesCount; + reservesList[params.reservesCount] = params.asset; + return true; + } + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function executeRescueTokens(address token, address to, uint256 amount) external { + IERC20(token).safeTransfer(to, amount); + } + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param reservesData The state of all the reserves + * @param assets The list of reserves for which the minting needs to be executed + */ + function executeMintToTreasury( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] calldata assets + ) external { + for (uint256 i = 0; i < assets.length; i++) { + address assetAddress = assets[i]; + + DataTypes.ReserveData storage reserve = reservesData[assetAddress]; + + // this cover both inactive reserves and invalid reserves since the flag will be 0 for both + if (!reserve.configuration.getActive()) { + continue; + } + + uint256 accruedToTreasury = reserve.accruedToTreasury; + + if (accruedToTreasury != 0) { + reserve.accruedToTreasury = 0; + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); + IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); + + emit MintedToTreasury(assetAddress, amountToMint); + } + } + } + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function executeResetIsolationModeTotalDebt( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset + ) external { + require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); + reservesData[asset].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(asset, 0); + } + + /** + * @notice Sets the liquidation grace period of the asset + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + */ + function executeSetLiquidationGracePeriod( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset, + uint40 until + ) external { + reservesData[asset].liquidationGracePeriodUntil = until; + } + + /** + * @notice Drop a reserve + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param asset The address of the underlying asset of the reserve + */ + function executeDropReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + address asset + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + ValidationLogic.validateDropReserve(reservesList, reserve, asset); + reservesList[reservesData[asset].id] = address(0); + delete reservesData[asset]; + } + + /** + * @notice Returns the user account data across all the reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the calculation + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function executeGetUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ) + { + ( + totalCollateralBase, + totalDebtBase, + ltv, + currentLiquidationThreshold, + healthFactor, + + ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); + + availableBorrowsBase = GenericLogic.calculateAvailableBorrows( + totalCollateralBase, + totalDebtBase, + ltv + ); + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/SupplyLogic.sol + +/** + * @title SupplyLogic library + * @author Aave + * @notice Implements the base logic for supply/withdraw + */ +library SupplyLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. + * @dev Emits the `Supply()` event. + * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as + * collateral. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the supply function + */ + function executeSupply( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSupplyParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, reserve, params.amount, params.onBehalfOf); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, params.amount, 0); + + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + params.onBehalfOf, + params.amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration, + reserveCache.aTokenAddress + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); + } + } + + emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); + } + + /** + * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset + * previously supplied in the Aave protocol. + * @dev Emits the `Withdraw()` event. + * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the withdraw function + * @return The actual amount withdrawn + */ + function executeWithdraw( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteWithdrawParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + require(params.to != reserveCache.aTokenAddress, Errors.WITHDRAW_TO_ATOKEN); + + reserve.updateState(reserveCache); + + uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( + reserveCache.nextLiquidityIndex + ); + + uint256 amountToWithdraw = params.amount; + + if (params.amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + + ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, amountToWithdraw); + + bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); + + if (isCollateral && amountToWithdraw == userBalance) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + params.to, + amountToWithdraw, + reserveCache.nextLiquidityIndex + ); + + if (isCollateral && userConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + params.asset, + msg.sender, + params.reservesCount, + params.oracle, + params.userEModeCategory + ); + } + + emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); + + return amountToWithdraw; + } + + /** + * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid + * collateralization constraints violation. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as + * collateral. + * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param params The additional parameters needed to execute the finalizeTransfer function + */ + function executeFinalizeTransfer( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.FinalizeTransferParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + + ValidationLogic.validateTransfer(reserve); + + uint256 reserveId = reserve.id; + uint256 scaledAmount = params.amount.rayDiv(reserve.getNormalizedIncome()); + + if (params.from != params.to && scaledAmount != 0) { + DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; + + if (fromConfig.isUsingAsCollateral(reserveId)) { + if (fromConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + usersConfig[params.from], + params.asset, + params.from, + params.reservesCount, + params.oracle, + params.fromEModeCategory + ); + } + if (params.balanceFromBefore == params.amount) { + fromConfig.setUsingAsCollateral(reserveId, false); + emit ReserveUsedAsCollateralDisabled(params.asset, params.from); + } + } + + if (params.balanceToBefore == 0) { + DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + toConfig, + reserve.configuration, + reserve.aTokenAddress + ) + ) { + toConfig.setUsingAsCollateral(reserveId, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.to); + } + } + } + } + + /** + * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as + * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor + * checks to ensure collateralization. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. + * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The users configuration mapping that track the supplied/borrowed assets + * @param asset The address of the asset being configured as collateral + * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise + * @param reservesCount The number of initialized reserves + * @param priceOracle The address of the price oracle + * @param userEModeCategory The eMode category chosen by the user + */ + function executeUseReserveAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + bool useAsCollateral, + uint256 reservesCount, + address priceOracle, + uint8 userEModeCategory + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); + + ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); + + if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; + + if (useAsCollateral) { + require( + ValidationLogic.validateUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration + ), + Errors.USER_IN_ISOLATION_MODE_OR_LTV_ZERO + ); + + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, msg.sender); + } else { + userConfig.setUsingAsCollateral(reserve.id, false); + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + asset, + msg.sender, + reservesCount, + priceOracle, + userEModeCategory + ); + + emit ReserveUsedAsCollateralDisabled(asset, msg.sender); + } + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BorrowLogic.sol + +/** + * @title BorrowLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to borrowing + */ +library BorrowLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the + * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the + * isolated debt. + * @dev Emits the `Borrow()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the borrow function + */ + function executeBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteBorrowParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ( + bool isolationModeActive, + address isolationModeCollateralAddress, + uint256 isolationModeDebtCeiling + ) = userConfig.getIsolationModeState(reservesData, reservesList); + + ValidationLogic.validateBorrow( + reservesData, + reservesList, + eModeCategories, + DataTypes.ValidateBorrowParams({ + reserveCache: reserveCache, + userConfig: userConfig, + asset: params.asset, + userAddress: params.onBehalfOf, + amount: params.amount, + interestRateMode: params.interestRateMode, + reservesCount: params.reservesCount, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory, + priceOracleSentinel: params.priceOracleSentinel, + isolationModeActive: isolationModeActive, + isolationModeCollateralAddress: isolationModeCollateralAddress, + isolationModeDebtCeiling: isolationModeDebtCeiling + }) + ); + + bool isFirstBorrowing = false; + + (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); + + if (isFirstBorrowing) { + userConfig.setBorrowing(reserve.id, true); + } + + if (isolationModeActive) { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt += (params.amount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + 0, + params.releaseUnderlying ? params.amount : 0 + ); + + if (params.releaseUnderlying) { + IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); + } + + emit Borrow( + params.asset, + params.user, + params.onBehalfOf, + params.amount, + DataTypes.InterestRateMode.VARIABLE, + reserve.currentVariableBorrowRate, + params.referralCode + ); + } + + /** + * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the + * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also + * reduces the isolated debt. + * @dev Emits the `Repay()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the repay function + * @return The actual amount being repaid + */ + function executeRepay( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteRepayParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + + uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( + params.onBehalfOf + ); + + ValidationLogic.validateRepay( + reserveCache, + params.amount, + params.interestRateMode, + params.onBehalfOf, + variableDebt + ); + + uint256 paybackAmount = variableDebt; + + // Allows a user to repay with aTokens without leaving dust from interest. + if (params.useATokens && params.amount == type(uint256).max) { + params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); + } + + if (params.amount < paybackAmount) { + paybackAmount = params.amount; + } + + reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) + .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + params.useATokens ? 0 : paybackAmount, + 0 + ); + + if (variableDebt - paybackAmount == 0) { + userConfig.setBorrowing(reserve.id, false); + } + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + reserveCache, + paybackAmount + ); + + if (params.useATokens) { + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + reserveCache.aTokenAddress, + paybackAmount, + reserveCache.nextLiquidityIndex + ); + // in case of aToken repayment the msg.sender must always repay on behalf of itself + if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + } else { + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); + IAToken(reserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.onBehalfOf, + paybackAmount + ); + } + + emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); + + return paybackAmount; + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/LiquidationLogic.sol + +/** + * @title LiquidationLogic library + * @author Aave + * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations + */ +library LiquidationLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Default percentage of borrower's debt to be repaid in a liquidation. + * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 0.5e4 results in 50.00% + */ + uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; + + /** + * @dev Maximum percentage of borrower's debt to be repaid in a liquidation + * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 1e4 results in 100.00% + */ + uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; + + /** + * @dev This constant represents below which health factor value it is possible to liquidate + * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. + * A value of 0.95e18 results in 0.95 + */ + uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; + + struct LiquidationCallLocalVars { + uint256 userCollateralBalance; + uint256 userTotalDebt; + uint256 actualDebtToLiquidate; + uint256 actualCollateralToLiquidate; + uint256 liquidationBonus; + uint256 healthFactor; + uint256 liquidationProtocolFeeAmount; + IAToken collateralAToken; + DataTypes.ReserveCache debtReserveCache; + } + + /** + * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) + * covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportional amount of the `collateralAsset` plus a bonus to cover market risk + * @dev Emits the `LiquidationCall()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params The additional parameters needed to execute the liquidation function + */ + function executeLiquidationCall( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ExecuteLiquidationCallParams memory params + ) external { + LiquidationCallLocalVars memory vars; + + DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; + DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; + DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; + vars.debtReserveCache = debtReserve.cache(); + debtReserve.updateState(vars.debtReserveCache); + + (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: params.reservesCount, + user: params.user, + oracle: params.priceOracle, + userEModeCategory: params.userEModeCategory + }) + ); + + (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( + vars.debtReserveCache, + params, + vars.healthFactor + ); + + ValidationLogic.validateLiquidationCall( + userConfig, + collateralReserve, + debtReserve, + DataTypes.ValidateLiquidationCallParams({ + debtReserveCache: vars.debtReserveCache, + totalDebt: vars.userTotalDebt, + healthFactor: vars.healthFactor, + priceOracleSentinel: params.priceOracleSentinel + }) + ); + + vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); + if ( + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + collateralReserve.id + ) + ) { + vars.liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; + } else { + vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); + } + + vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); + + ( + vars.actualCollateralToLiquidate, + vars.actualDebtToLiquidate, + vars.liquidationProtocolFeeAmount + ) = _calculateAvailableCollateralToLiquidate( + collateralReserve, + vars.debtReserveCache, + params.collateralAsset, + params.debtAsset, + vars.actualDebtToLiquidate, + vars.userCollateralBalance, + vars.liquidationBonus, + IPriceOracleGetter(params.priceOracle) + ); + + if (vars.userTotalDebt == vars.actualDebtToLiquidate) { + userConfig.setBorrowing(debtReserve.id, false); + } + + // If the collateral being liquidated is equal to the user balance, + // we set the currency as not being used as collateral anymore + if ( + vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == + vars.userCollateralBalance + ) { + userConfig.setUsingAsCollateral(collateralReserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); + } + + _burnDebtTokens(params, vars); + + debtReserve.updateInterestRatesAndVirtualBalance( + vars.debtReserveCache, + params.debtAsset, + vars.actualDebtToLiquidate, + 0 + ); + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + vars.debtReserveCache, + vars.actualDebtToLiquidate + ); + + if (params.receiveAToken) { + _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); + } else { + _burnCollateralATokens(collateralReserve, params, vars); + } + + // Transfer fee to treasury if it is non-zero + if (vars.liquidationProtocolFeeAmount != 0) { + uint256 liquidityIndex = collateralReserve.getNormalizedIncome(); + uint256 scaledDownLiquidationProtocolFee = vars.liquidationProtocolFeeAmount.rayDiv( + liquidityIndex + ); + uint256 scaledDownUserBalance = vars.collateralAToken.scaledBalanceOf(params.user); + // To avoid trying to send more aTokens than available on balance, due to 1 wei imprecision + if (scaledDownLiquidationProtocolFee > scaledDownUserBalance) { + vars.liquidationProtocolFeeAmount = scaledDownUserBalance.rayMul(liquidityIndex); + } + vars.collateralAToken.transferOnLiquidation( + params.user, + vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), + vars.liquidationProtocolFeeAmount + ); + } + + // Transfers the debt asset being repaid to the aToken, where the liquidity is kept + IERC20(params.debtAsset).safeTransferFrom( + msg.sender, + vars.debtReserveCache.aTokenAddress, + vars.actualDebtToLiquidate + ); + + IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.user, + vars.actualDebtToLiquidate + ); + + emit LiquidationCall( + params.collateralAsset, + params.debtAsset, + params.user, + vars.actualDebtToLiquidate, + vars.actualCollateralToLiquidate, + msg.sender, + params.receiveAToken + ); + } + + /** + * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. + * @dev The function also updates the state and the interest rate of the collateral reserve. + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _burnCollateralATokens( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); + collateralReserve.updateState(collateralReserveCache); + collateralReserve.updateInterestRatesAndVirtualBalance( + collateralReserveCache, + params.collateralAsset, + 0, + vars.actualCollateralToLiquidate + ); + + // Burn the equivalent amount of aToken, sending the underlying to the liquidator + vars.collateralAToken.burn( + params.user, + msg.sender, + vars.actualCollateralToLiquidate, + collateralReserveCache.nextLiquidityIndex + ); + } + + /** + * @notice Liquidates the user aTokens by transferring them to the liquidator. + * @dev The function also checks the state of the liquidator and activates the aToken as collateral + * as in standard transfers if the isolation mode constraints are respected. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _liquidateATokens( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); + vars.collateralAToken.transferOnLiquidation( + params.user, + msg.sender, + vars.actualCollateralToLiquidate + ); + + if (liquidatorPreviousATokenBalance == 0) { + DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + liquidatorConfig, + collateralReserve.configuration, + collateralReserve.aTokenAddress + ) + ) { + liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); + } + } + } + + /** + * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. + * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. + * @param params The additional parameters needed to execute the liquidation function + * @param vars the executeLiquidationCall() function local vars + */ + function _burnDebtTokens( + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( + vars.debtReserveCache.variableDebtTokenAddress + ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); + } + + /** + * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor + * and corresponding close factor. + * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR + * @param debtReserveCache The reserve cache data object of the debt reserve + * @param params The additional parameters needed to execute the liquidation function + * @param healthFactor The health factor of the position + * @return The total debt of the user + * @return The actual debt to liquidate as a function of the closeFactor + */ + function _calculateDebt( + DataTypes.ReserveCache memory debtReserveCache, + DataTypes.ExecuteLiquidationCallParams memory params, + uint256 healthFactor + ) internal view returns (uint256, uint256) { + uint256 userVariableDebt = IERC20(debtReserveCache.variableDebtTokenAddress).balanceOf( + params.user + ); + + uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD + ? DEFAULT_LIQUIDATION_CLOSE_FACTOR + : MAX_LIQUIDATION_CLOSE_FACTOR; + + uint256 maxLiquidatableDebt = userVariableDebt.percentMul(closeFactor); + + uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt + ? maxLiquidatableDebt + : params.debtToCover; + + return (userVariableDebt, actualDebtToLiquidate); + } + + struct AvailableCollateralToLiquidateLocalVars { + uint256 collateralPrice; + uint256 debtAssetPrice; + uint256 maxCollateralToLiquidate; + uint256 baseCollateral; + uint256 bonusCollateral; + uint256 debtAssetDecimals; + uint256 collateralDecimals; + uint256 collateralAssetUnit; + uint256 debtAssetUnit; + uint256 collateralAmount; + uint256 debtAmountNeeded; + uint256 liquidationProtocolFeePercentage; + uint256 liquidationProtocolFee; + } + + /** + * @notice Calculates how much of a specific collateral can be liquidated, given + * a certain amount of debt asset. + * @dev This function needs to be called after all the checks to validate the liquidation have been performed, + * otherwise it might fail. + * @param collateralReserve The data of the collateral reserve + * @param debtReserveCache The cached data of the debt reserve + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated + * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation + * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) + * @return The amount to repay with the liquidation + * @return The fee taken from the liquidation bonus amount to be paid to the protocol + */ + function _calculateAvailableCollateralToLiquidate( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveCache memory debtReserveCache, + address collateralAsset, + address debtAsset, + uint256 debtToCover, + uint256 userCollateralBalance, + uint256 liquidationBonus, + IPriceOracleGetter oracle + ) internal view returns (uint256, uint256, uint256) { + AvailableCollateralToLiquidateLocalVars memory vars; + + vars.collateralPrice = oracle.getAssetPrice(collateralAsset); + vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); + + vars.collateralDecimals = collateralReserve.configuration.getDecimals(); + vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); + + unchecked { + vars.collateralAssetUnit = 10 ** vars.collateralDecimals; + vars.debtAssetUnit = 10 ** vars.debtAssetDecimals; + } + + vars.liquidationProtocolFeePercentage = collateralReserve + .configuration + .getLiquidationProtocolFee(); + + // This is the base collateral to liquidate based on the given debt to cover + vars.baseCollateral = + ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / + (vars.collateralPrice * vars.debtAssetUnit); + + vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); + + if (vars.maxCollateralToLiquidate > userCollateralBalance) { + vars.collateralAmount = userCollateralBalance; + vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / + (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); + } else { + vars.collateralAmount = vars.maxCollateralToLiquidate; + vars.debtAmountNeeded = debtToCover; + } + + if (vars.liquidationProtocolFeePercentage != 0) { + vars.bonusCollateral = + vars.collateralAmount - + vars.collateralAmount.percentDiv(liquidationBonus); + + vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( + vars.liquidationProtocolFeePercentage + ); + + return ( + vars.collateralAmount - vars.liquidationProtocolFee, + vars.debtAmountNeeded, + vars.liquidationProtocolFee + ); + } else { + return (vars.collateralAmount, vars.debtAmountNeeded, 0); + } + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol + +/** + * @title FlashLoanLogic library + * @author Aave + * @notice Implements the logic for the flash loans + */ +library FlashLoanLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + + // See `IPool` for descriptions + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + // Helper struct for internal variables used in the `executeFlashLoan` function + struct FlashLoanLocalVars { + IFlashLoanReceiver receiver; + address currentAsset; + uint256 currentAmount; + uint256[] totalPremiums; + uint256 flashloanPremiumTotal; + uint256 flashloanPremiumToProtocol; + } + + /** + * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction + * as long as the amount taken plus fee is returned or debt is opened. + * @dev For authorized flashborrowers the fee is waived + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the flashloan function + */ + function executeFlashLoan( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.FlashloanParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); + + FlashLoanLocalVars memory vars; + + vars.totalPremiums = new uint256[](params.assets.length); + + vars.receiver = IFlashLoanReceiver(params.receiverAddress); + (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower + ? (0, 0) + : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); + + for (uint256 i = 0; i < params.assets.length; i++) { + vars.currentAmount = params.amounts[i]; + vars.totalPremiums[i] = DataTypes.InterestRateMode(params.interestRateModes[i]) == + DataTypes.InterestRateMode.NONE + ? vars.currentAmount.percentMul(vars.flashloanPremiumTotal) + : 0; + + if (reservesData[params.assets[i]].configuration.getIsVirtualAccActive()) { + reservesData[params.assets[i]].virtualUnderlyingBalance -= vars.currentAmount.toUint128(); + } + + IAToken(reservesData[params.assets[i]].aTokenAddress).transferUnderlyingTo( + params.receiverAddress, + vars.currentAmount + ); + } + + require( + vars.receiver.executeOperation( + params.assets, + params.amounts, + vars.totalPremiums, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + for (uint256 i = 0; i < params.assets.length; i++) { + vars.currentAsset = params.assets[i]; + vars.currentAmount = params.amounts[i]; + + if ( + DataTypes.InterestRateMode(params.interestRateModes[i]) == DataTypes.InterestRateMode.NONE + ) { + _handleFlashLoanRepayment( + reservesData[vars.currentAsset], + DataTypes.FlashLoanRepaymentParams({ + asset: vars.currentAsset, + receiverAddress: params.receiverAddress, + amount: vars.currentAmount, + totalPremium: vars.totalPremiums[i], + flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } else { + // If the user chose to not return the funds, the system checks if there is enough collateral and + // eventually opens a debt position + BorrowLogic.executeBorrow( + reservesData, + reservesList, + eModeCategories, + userConfig, + DataTypes.ExecuteBorrowParams({ + asset: vars.currentAsset, + user: msg.sender, + onBehalfOf: params.onBehalfOf, + amount: vars.currentAmount, + interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[i]), + referralCode: params.referralCode, + releaseUnderlying: false, + reservesCount: IPool(params.pool).getReservesCount(), + oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), + userEModeCategory: IPool(params.pool).getUserEMode(params.onBehalfOf).toUint8(), + priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) + .getPriceOracleSentinel() + }) + ); + // no premium is paid when taking on the flashloan as debt + emit FlashLoan( + params.receiverAddress, + msg.sender, + vars.currentAsset, + vars.currentAmount, + DataTypes.InterestRateMode(params.interestRateModes[i]), + 0, + params.referralCode + ); + } + } + } + + /** + * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one + * transaction as long as the amount taken plus fee is returned. + * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the simple flashloan function + */ + function executeFlashLoanSimple( + DataTypes.ReserveData storage reserve, + DataTypes.FlashloanSimpleParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloanSimple(reserve, params.amount); + + IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); + uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); + + if (reserve.configuration.getIsVirtualAccActive()) { + reserve.virtualUnderlyingBalance -= params.amount.toUint128(); + } + + IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); + + require( + receiver.executeOperation( + params.asset, + params.amount, + totalPremium, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + _handleFlashLoanRepayment( + reserve, + DataTypes.FlashLoanRepaymentParams({ + asset: params.asset, + receiverAddress: params.receiverAddress, + amount: params.amount, + totalPremium: totalPremium, + flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } + + /** + * @notice Handles repayment of flashloaned assets + premium + * @dev Will pull the amount + premium from the receiver, so must have approved pool + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the repayment function + */ + function _handleFlashLoanRepayment( + DataTypes.ReserveData storage reserve, + DataTypes.FlashLoanRepaymentParams memory params + ) internal { + uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); + uint256 premiumToLP = params.totalPremium - premiumToProtocol; + uint256 amountPlusPremium = params.amount + params.totalPremium; + + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply() + + uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), + premiumToLP + ); + + reserve.accruedToTreasury += premiumToProtocol + .rayDiv(reserveCache.nextLiquidityIndex) + .toUint128(); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, amountPlusPremium, 0); + + IERC20(params.asset).safeTransferFrom( + params.receiverAddress, + reserveCache.aTokenAddress, + amountPlusPremium + ); + + IAToken(reserveCache.aTokenAddress).handleRepayment( + params.receiverAddress, + params.receiverAddress, + amountPlusPremium + ); + + emit FlashLoan( + params.receiverAddress, + msg.sender, + params.asset, + params.amount, + DataTypes.InterestRateMode.NONE, + params.totalPremium, + params.referralCode + ); + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/Pool.sol + +/** + * @title Pool contract + * @author Aave + * @notice Main point of interaction with an Aave protocol's market + * - Users can: + * # Supply + * # Withdraw + * # Borrow + * # Repay + * # Enable/disable their supplied assets as collateral + * # Liquidate positions + * # Execute Flash Loans + * @dev To be covered by a proxy contract, owned by the PoolAddressesProvider of the specific market + * @dev All admin functions are callable by the PoolConfigurator contract defined also in the + * PoolAddressesProvider + */ +abstract contract Pool is VersionedInitializable, PoolStorage, IPool { + using ReserveLogic for DataTypes.ReserveData; + + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @dev Only pool configurator can call functions marked by this modifier. + */ + modifier onlyPoolConfigurator() { + _onlyPoolConfigurator(); + _; + } + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + _onlyPoolAdmin(); + _; + } + + /** + * @dev Only bridge can call functions marked by this modifier. + */ + modifier onlyBridge() { + _onlyBridge(); + _; + } + + function _onlyPoolConfigurator() internal view virtual { + require( + ADDRESSES_PROVIDER.getPoolConfigurator() == msg.sender, + Errors.CALLER_NOT_POOL_CONFIGURATOR + ); + } + + function _onlyPoolAdmin() internal view virtual { + require( + IACLManager(ADDRESSES_PROVIDER.getACLManager()).isPoolAdmin(msg.sender), + Errors.CALLER_NOT_POOL_ADMIN + ); + } + + function _onlyBridge() internal view virtual { + require( + IACLManager(ADDRESSES_PROVIDER.getACLManager()).isBridge(msg.sender), + Errors.CALLER_NOT_BRIDGE + ); + } + + /** + * @dev Constructor. + * @param provider The address of the PoolAddressesProvider contract + */ + constructor(IPoolAddressesProvider provider) { + ADDRESSES_PROVIDER = provider; + } + + /** + * @notice Initializes the Pool. + * @dev Function is invoked by the proxy contract when the Pool contract is added to the + * PoolAddressesProvider of the market. + * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations + * @param provider The address of the PoolAddressesProvider + */ + function initialize(IPoolAddressesProvider provider) external virtual; + + /// @inheritdoc IPool + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external virtual override onlyBridge { + BridgeLogic.executeMintUnbacked( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + asset, + amount, + onBehalfOf, + referralCode + ); + } + + /// @inheritdoc IPool + function backUnbacked( + address asset, + uint256 amount, + uint256 fee + ) external virtual override onlyBridge returns (uint256) { + return + BridgeLogic.executeBackUnbacked(_reserves[asset], asset, amount, fee, _bridgeProtocolFee); + } + + /// @inheritdoc IPool + function supply( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) public virtual override { + SupplyLogic.executeSupply( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteSupplyParams({ + asset: asset, + amount: amount, + onBehalfOf: onBehalfOf, + referralCode: referralCode + }) + ); + } + + /// @inheritdoc IPool + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) public virtual override { + try + IERC20WithPermit(asset).permit( + msg.sender, + address(this), + amount, + deadline, + permitV, + permitR, + permitS + ) + {} catch {} + SupplyLogic.executeSupply( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteSupplyParams({ + asset: asset, + amount: amount, + onBehalfOf: onBehalfOf, + referralCode: referralCode + }) + ); + } + + /// @inheritdoc IPool + function withdraw( + address asset, + uint256 amount, + address to + ) public virtual override returns (uint256) { + return + SupplyLogic.executeWithdraw( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[msg.sender], + DataTypes.ExecuteWithdrawParams({ + asset: asset, + amount: amount, + to: to, + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[msg.sender] + }) + ); + } + + /// @inheritdoc IPool + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) public virtual override { + BorrowLogic.executeBorrow( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[onBehalfOf], + DataTypes.ExecuteBorrowParams({ + asset: asset, + user: msg.sender, + onBehalfOf: onBehalfOf, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + referralCode: referralCode, + releaseUnderlying: true, + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[onBehalfOf], + priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() + }) + ); + } + + /// @inheritdoc IPool + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) public virtual override returns (uint256) { + return + BorrowLogic.executeRepay( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteRepayParams({ + asset: asset, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + onBehalfOf: onBehalfOf, + useATokens: false + }) + ); + } + + /// @inheritdoc IPool + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) public virtual override returns (uint256) { + try + IERC20WithPermit(asset).permit( + msg.sender, + address(this), + amount, + deadline, + permitV, + permitR, + permitS + ) + {} catch {} + + { + DataTypes.ExecuteRepayParams memory params = DataTypes.ExecuteRepayParams({ + asset: asset, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + onBehalfOf: onBehalfOf, + useATokens: false + }); + return BorrowLogic.executeRepay(_reserves, _reservesList, _usersConfig[onBehalfOf], params); + } + } + + /// @inheritdoc IPool + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) public virtual override returns (uint256) { + return + BorrowLogic.executeRepay( + _reserves, + _reservesList, + _usersConfig[msg.sender], + DataTypes.ExecuteRepayParams({ + asset: asset, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + onBehalfOf: msg.sender, + useATokens: true + }) + ); + } + + /// @inheritdoc IPool + function setUserUseReserveAsCollateral( + address asset, + bool useAsCollateral + ) public virtual override { + SupplyLogic.executeUseReserveAsCollateral( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[msg.sender], + asset, + useAsCollateral, + _reservesCount, + ADDRESSES_PROVIDER.getPriceOracle(), + _usersEModeCategory[msg.sender] + ); + } + + /// @inheritdoc IPool + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) public virtual override { + LiquidationLogic.executeLiquidationCall( + _reserves, + _reservesList, + _usersConfig, + _eModeCategories, + DataTypes.ExecuteLiquidationCallParams({ + reservesCount: _reservesCount, + debtToCover: debtToCover, + collateralAsset: collateralAsset, + debtAsset: debtAsset, + user: user, + receiveAToken: receiveAToken, + priceOracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[user], + priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() + }) + ); + } + + /// @inheritdoc IPool + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) public virtual override { + DataTypes.FlashloanParams memory flashParams = DataTypes.FlashloanParams({ + receiverAddress: receiverAddress, + assets: assets, + amounts: amounts, + interestRateModes: interestRateModes, + onBehalfOf: onBehalfOf, + params: params, + referralCode: referralCode, + flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, + flashLoanPremiumTotal: _flashLoanPremiumTotal, + reservesCount: _reservesCount, + addressesProvider: address(ADDRESSES_PROVIDER), + pool: address(this), + userEModeCategory: _usersEModeCategory[onBehalfOf], + isAuthorizedFlashBorrower: IACLManager(ADDRESSES_PROVIDER.getACLManager()).isFlashBorrower( + msg.sender + ) + }); + + FlashLoanLogic.executeFlashLoan( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[onBehalfOf], + flashParams + ); + } + + /// @inheritdoc IPool + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) public virtual override { + DataTypes.FlashloanSimpleParams memory flashParams = DataTypes.FlashloanSimpleParams({ + receiverAddress: receiverAddress, + asset: asset, + amount: amount, + params: params, + referralCode: referralCode, + flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, + flashLoanPremiumTotal: _flashLoanPremiumTotal + }); + FlashLoanLogic.executeFlashLoanSimple(_reserves[asset], flashParams); + } + + /// @inheritdoc IPool + function mintToTreasury(address[] calldata assets) external virtual override { + PoolLogic.executeMintToTreasury(_reserves, assets); + } + + /// @inheritdoc IPool + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory) { + return _reserves[asset]; + } + + /// @inheritdoc IPool + function getReserveData( + address asset + ) external view virtual override returns (DataTypes.ReserveDataLegacy memory) { + DataTypes.ReserveData memory reserve = _reserves[asset]; + DataTypes.ReserveDataLegacy memory res; + + res.configuration = reserve.configuration; + res.liquidityIndex = reserve.liquidityIndex; + res.currentLiquidityRate = reserve.currentLiquidityRate; + res.variableBorrowIndex = reserve.variableBorrowIndex; + res.currentVariableBorrowRate = reserve.currentVariableBorrowRate; + res.lastUpdateTimestamp = reserve.lastUpdateTimestamp; + res.id = reserve.id; + res.aTokenAddress = reserve.aTokenAddress; + res.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + res.interestRateStrategyAddress = reserve.interestRateStrategyAddress; + res.accruedToTreasury = reserve.accruedToTreasury; + res.unbacked = reserve.unbacked; + res.isolationModeTotalDebt = reserve.isolationModeTotalDebt; + // This is a temporary workaround for integrations that are broken by Aave 3.2 + // While the new pool data provider is backward compatible, some integrations hard-code an old implementation + // To allow them to not have any infrastructural blocker, a mock must be configured in the Aave Pool Addresses Provider, returning zero on all required view methods, instead of reverting + res.stableDebtTokenAddress = ADDRESSES_PROVIDER.getAddress(bytes32('MOCK_STABLE_DEBT')); + return res; + } + + /// @inheritdoc IPool + function getVirtualUnderlyingBalance( + address asset + ) external view virtual override returns (uint128) { + return _reserves[asset].virtualUnderlyingBalance; + } + + /// @inheritdoc IPool + function getUserAccountData( + address user + ) + external + view + virtual + override + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ) + { + return + PoolLogic.executeGetUserAccountData( + _reserves, + _reservesList, + _eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: _usersConfig[user], + reservesCount: _reservesCount, + user: user, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[user] + }) + ); + } + + /// @inheritdoc IPool + function getConfiguration( + address asset + ) external view virtual override returns (DataTypes.ReserveConfigurationMap memory) { + return _reserves[asset].configuration; + } + + /// @inheritdoc IPool + function getUserConfiguration( + address user + ) external view virtual override returns (DataTypes.UserConfigurationMap memory) { + return _usersConfig[user]; + } + + /// @inheritdoc IPool + function getReserveNormalizedIncome( + address asset + ) external view virtual override returns (uint256) { + return _reserves[asset].getNormalizedIncome(); + } + + /// @inheritdoc IPool + function getReserveNormalizedVariableDebt( + address asset + ) external view virtual override returns (uint256) { + return _reserves[asset].getNormalizedDebt(); + } + + /// @inheritdoc IPool + function getReservesList() external view virtual override returns (address[] memory) { + uint256 reservesListCount = _reservesCount; + uint256 droppedReservesCount = 0; + address[] memory reservesList = new address[](reservesListCount); + + for (uint256 i = 0; i < reservesListCount; i++) { + if (_reservesList[i] != address(0)) { + reservesList[i - droppedReservesCount] = _reservesList[i]; + } else { + droppedReservesCount++; + } + } + + // Reduces the length of the reserves array by `droppedReservesCount` + assembly { + mstore(reservesList, sub(reservesListCount, droppedReservesCount)) + } + return reservesList; + } + + /// @inheritdoc IPool + function getReservesCount() external view virtual override returns (uint256) { + return _reservesCount; + } + + /// @inheritdoc IPool + function getReserveAddressById(uint16 id) external view returns (address) { + return _reservesList[id]; + } + + /// @inheritdoc IPool + function BRIDGE_PROTOCOL_FEE() public view virtual override returns (uint256) { + return _bridgeProtocolFee; + } + + /// @inheritdoc IPool + function FLASHLOAN_PREMIUM_TOTAL() public view virtual override returns (uint128) { + return _flashLoanPremiumTotal; + } + + /// @inheritdoc IPool + function FLASHLOAN_PREMIUM_TO_PROTOCOL() public view virtual override returns (uint128) { + return _flashLoanPremiumToProtocol; + } + + /// @inheritdoc IPool + function MAX_NUMBER_RESERVES() public view virtual override returns (uint16) { + return ReserveConfiguration.MAX_RESERVES_COUNT; + } + + /// @inheritdoc IPool + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external virtual override { + require(msg.sender == _reserves[asset].aTokenAddress, Errors.CALLER_NOT_ATOKEN); + SupplyLogic.executeFinalizeTransfer( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig, + DataTypes.FinalizeTransferParams({ + asset: asset, + from: from, + to: to, + amount: amount, + balanceFromBefore: balanceFromBefore, + balanceToBefore: balanceToBefore, + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + fromEModeCategory: _usersEModeCategory[from] + }) + ); + } + + /// @inheritdoc IPool + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external virtual override onlyPoolConfigurator { + if ( + PoolLogic.executeInitReserve( + _reserves, + _reservesList, + DataTypes.InitReserveParams({ + asset: asset, + aTokenAddress: aTokenAddress, + variableDebtAddress: variableDebtAddress, + interestRateStrategyAddress: interestRateStrategyAddress, + reservesCount: _reservesCount, + maxNumberReserves: MAX_NUMBER_RESERVES() + }) + ) + ) { + _reservesCount++; + } + } + + /// @inheritdoc IPool + function dropReserve(address asset) external virtual override onlyPoolConfigurator { + PoolLogic.executeDropReserve(_reserves, _reservesList, asset); + } + + /// @inheritdoc IPool + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external virtual override onlyPoolConfigurator { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + + _reserves[asset].interestRateStrategyAddress = rateStrategyAddress; + } + + /// @inheritdoc IPool + function syncIndexesState(address asset) external virtual override onlyPoolConfigurator { + DataTypes.ReserveData storage reserve = _reserves[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + } + + /// @inheritdoc IPool + function syncRatesState(address asset) external virtual override onlyPoolConfigurator { + DataTypes.ReserveData storage reserve = _reserves[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + ReserveLogic.updateInterestRatesAndVirtualBalance(reserve, reserveCache, asset, 0, 0); + } + + /// @inheritdoc IPool + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external virtual override onlyPoolConfigurator { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + _reserves[asset].configuration = configuration; + } + + /// @inheritdoc IPool + function updateBridgeProtocolFee( + uint256 protocolFee + ) external virtual override onlyPoolConfigurator { + _bridgeProtocolFee = protocolFee; + } + + /// @inheritdoc IPool + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external virtual override onlyPoolConfigurator { + _flashLoanPremiumTotal = flashLoanPremiumTotal; + _flashLoanPremiumToProtocol = flashLoanPremiumToProtocol; + } + + /// @inheritdoc IPool + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory category + ) external virtual override onlyPoolConfigurator { + // category 0 is reserved for volatile heterogeneous assets and it's always disabled + require(id != 0, Errors.EMODE_CATEGORY_RESERVED); + _eModeCategories[id].ltv = category.ltv; + _eModeCategories[id].liquidationThreshold = category.liquidationThreshold; + _eModeCategories[id].liquidationBonus = category.liquidationBonus; + _eModeCategories[id].label = category.label; + } + + /// @inheritdoc IPool + function configureEModeCategoryCollateralBitmap( + uint8 id, + uint128 collateralBitmap + ) external virtual override onlyPoolConfigurator { + // category 0 is reserved for volatile heterogeneous assets and it's always disabled + require(id != 0, Errors.EMODE_CATEGORY_RESERVED); + _eModeCategories[id].collateralBitmap = collateralBitmap; + } + + /// @inheritdoc IPool + function configureEModeCategoryBorrowableBitmap( + uint8 id, + uint128 borrowableBitmap + ) external virtual override onlyPoolConfigurator { + // category 0 is reserved for volatile heterogeneous assets and it's always disabled + require(id != 0, Errors.EMODE_CATEGORY_RESERVED); + _eModeCategories[id].borrowableBitmap = borrowableBitmap; + } + + /// @inheritdoc IPool + function getEModeCategoryData( + uint8 id + ) external view virtual override returns (DataTypes.EModeCategoryLegacy memory) { + DataTypes.EModeCategory memory category = _eModeCategories[id]; + return + DataTypes.EModeCategoryLegacy({ + ltv: category.ltv, + liquidationThreshold: category.liquidationThreshold, + liquidationBonus: category.liquidationBonus, + priceSource: address(0), + label: category.label + }); + } + + /// @inheritdoc IPool + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory) { + return + DataTypes.CollateralConfig({ + ltv: _eModeCategories[id].ltv, + liquidationThreshold: _eModeCategories[id].liquidationThreshold, + liquidationBonus: _eModeCategories[id].liquidationBonus + }); + } + + /// @inheritdoc IPool + function getEModeCategoryLabel(uint8 id) external view returns (string memory) { + return _eModeCategories[id].label; + } + + /// @inheritdoc IPool + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128) { + return _eModeCategories[id].collateralBitmap; + } + + /// @inheritdoc IPool + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128) { + return _eModeCategories[id].borrowableBitmap; + } + + /// @inheritdoc IPool + function setUserEMode(uint8 categoryId) external virtual override { + EModeLogic.executeSetUserEMode( + _reserves, + _reservesList, + _eModeCategories, + _usersEModeCategory, + _usersConfig[msg.sender], + DataTypes.ExecuteSetUserEModeParams({ + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + categoryId: categoryId + }) + ); + } + + /// @inheritdoc IPool + function getUserEMode(address user) external view virtual override returns (uint256) { + return _usersEModeCategory[user]; + } + + /// @inheritdoc IPool + function resetIsolationModeTotalDebt( + address asset + ) external virtual override onlyPoolConfigurator { + PoolLogic.executeResetIsolationModeTotalDebt(_reserves, asset); + } + + /// @inheritdoc IPool + function getLiquidationGracePeriod(address asset) external virtual override returns (uint40) { + return _reserves[asset].liquidationGracePeriodUntil; + } + + /// @inheritdoc IPool + function setLiquidationGracePeriod( + address asset, + uint40 until + ) external virtual override onlyPoolConfigurator { + require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + PoolLogic.executeSetLiquidationGracePeriod(_reserves, asset, until); + } + + /// @inheritdoc IPool + function rescueTokens( + address token, + address to, + uint256 amount + ) external virtual override onlyPoolAdmin { + PoolLogic.executeRescueTokens(token, to, amount); + } + + /// @inheritdoc IPool + /// @dev Deprecated: maintained for compatibility purposes + function deposit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external virtual override { + SupplyLogic.executeSupply( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteSupplyParams({ + asset: asset, + amount: amount, + onBehalfOf: onBehalfOf, + referralCode: referralCode + }) + ); + } + + /// @inheritdoc IPool + function getFlashLoanLogic() external pure returns (address) { + return address(FlashLoanLogic); + } + + /// @inheritdoc IPool + function getBorrowLogic() external pure returns (address) { + return address(BorrowLogic); + } + + /// @inheritdoc IPool + function getBridgeLogic() external pure returns (address) { + return address(BridgeLogic); + } + + /// @inheritdoc IPool + function getEModeLogic() external pure returns (address) { + return address(EModeLogic); + } + + /// @inheritdoc IPool + function getLiquidationLogic() external pure returns (address) { + return address(LiquidationLogic); + } + + /// @inheritdoc IPool + function getPoolLogic() external pure returns (address) { + return address(PoolLogic); + } + + /// @inheritdoc IPool + function getSupplyLogic() external pure returns (address) { + return address(SupplyLogic); + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/PoolInstance.sol + +contract PoolInstance is Pool { + uint256 public constant POOL_REVISION = 6; + + constructor(IPoolAddressesProvider provider) Pool(provider) {} + + /** + * @notice Initializes the Pool. + * @dev Function is invoked by the proxy contract when the Pool contract is added to the + * PoolAddressesProvider of the market. + * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations + * @param provider The address of the PoolAddressesProvider + */ + function initialize(IPoolAddressesProvider provider) external virtual override initializer { + require(provider == ADDRESSES_PROVIDER, Errors.INVALID_ADDRESSES_PROVIDER); + } + + function getRevision() internal pure virtual override returns (uint256) { + return POOL_REVISION; + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/L2Pool.sol + +/** + * @title L2Pool + * @author Aave + * @notice Calldata optimized extension of the Pool contract allowing users to pass compact calldata representation + * to reduce transaction costs on rollups. + */ +abstract contract L2Pool is Pool, IL2Pool { + /// @inheritdoc IL2Pool + function supply(bytes32 args) external override { + (address asset, uint256 amount, uint16 referralCode) = CalldataLogic.decodeSupplyParams( + _reservesList, + args + ); + + supply(asset, amount, msg.sender, referralCode); + } + + /// @inheritdoc IL2Pool + function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s) external override { + (address asset, uint256 amount, uint16 referralCode, uint256 deadline, uint8 v) = CalldataLogic + .decodeSupplyWithPermitParams(_reservesList, args); + + supplyWithPermit(asset, amount, msg.sender, referralCode, deadline, v, r, s); + } + + /// @inheritdoc IL2Pool + function withdraw(bytes32 args) external override returns (uint256) { + (address asset, uint256 amount) = CalldataLogic.decodeWithdrawParams(_reservesList, args); + + return withdraw(asset, amount, msg.sender); + } + + /// @inheritdoc IL2Pool + function borrow(bytes32 args) external override { + (address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode) = CalldataLogic + .decodeBorrowParams(_reservesList, args); + + borrow(asset, amount, interestRateMode, referralCode, msg.sender); + } + + /// @inheritdoc IL2Pool + function repay(bytes32 args) external override returns (uint256) { + (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( + _reservesList, + args + ); + + return repay(asset, amount, interestRateMode, msg.sender); + } + + /// @inheritdoc IL2Pool + function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) external override returns (uint256) { + ( + address asset, + uint256 amount, + uint256 interestRateMode, + uint256 deadline, + uint8 v + ) = CalldataLogic.decodeRepayWithPermitParams(_reservesList, args); + + return repayWithPermit(asset, amount, interestRateMode, msg.sender, deadline, v, r, s); + } + + /// @inheritdoc IL2Pool + function repayWithATokens(bytes32 args) external override returns (uint256) { + (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( + _reservesList, + args + ); + + return repayWithATokens(asset, amount, interestRateMode); + } + + /// @inheritdoc IL2Pool + function setUserUseReserveAsCollateral(bytes32 args) external override { + (address asset, bool useAsCollateral) = CalldataLogic.decodeSetUserUseReserveAsCollateralParams( + _reservesList, + args + ); + setUserUseReserveAsCollateral(asset, useAsCollateral); + } + + /// @inheritdoc IL2Pool + function liquidationCall(bytes32 args1, bytes32 args2) external override { + ( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) = CalldataLogic.decodeLiquidationCallParams(_reservesList, args1, args2); + liquidationCall(collateralAsset, debtAsset, user, debtToCover, receiveAToken); + } +} + +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/L2PoolInstance.sol + +contract L2PoolInstance is L2Pool, PoolInstance { + constructor(IPoolAddressesProvider provider) PoolInstance(provider) {} +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/L2PoolInstance.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/L2PoolInstance.sol new file mode 100644 index 00000000..f323d4bd --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/L2PoolInstance.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {L2Pool} from '../protocol/pool/L2Pool.sol'; +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {PoolInstance} from './PoolInstance.sol'; + +contract L2PoolInstance is L2Pool, PoolInstance { + constructor(IPoolAddressesProvider provider) PoolInstance(provider) {} +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/PoolInstance.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/PoolInstance.sol new file mode 100644 index 00000000..02eafdd1 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/PoolInstance.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {Pool} from '../protocol/pool/Pool.sol'; +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {Errors} from '../protocol/libraries/helpers/Errors.sol'; + +contract PoolInstance is Pool { + uint256 public constant POOL_REVISION = 6; + + constructor(IPoolAddressesProvider provider) Pool(provider) {} + + /** + * @notice Initializes the Pool. + * @dev Function is invoked by the proxy contract when the Pool contract is added to the + * PoolAddressesProvider of the market. + * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations + * @param provider The address of the PoolAddressesProvider + */ + function initialize(IPoolAddressesProvider provider) external virtual override initializer { + require(provider == ADDRESSES_PROVIDER, Errors.INVALID_ADDRESSES_PROVIDER); + } + + function getRevision() internal pure virtual override returns (uint256) { + return POOL_REVISION; + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IERC20WithPermit.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IERC20WithPermit.sol new file mode 100644 index 00000000..0fceb8c5 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IERC20WithPermit.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; + +/** + * @title IERC20WithPermit + * @author Aave + * @notice Interface for the permit function (EIP-2612) + */ +interface IERC20WithPermit is IERC20 { + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IL2Pool.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IL2Pool.sol new file mode 100644 index 00000000..56dee912 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IL2Pool.sol @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IL2Pool + * @author Aave + * @notice Defines the basic extension interface for an L2 Aave Pool. + */ +interface IL2Pool { + /** + * @notice Calldata efficient wrapper of the supply function on behalf of the caller + * @param args Arguments for the supply function packed in one bytes32 + * 96 bits 16 bits 128 bits 16 bits + * | 0-padding | referralCode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + */ + function supply(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the supplyWithPermit function on behalf of the caller + * @param args Arguments for the supply function packed in one bytes32 + * 56 bits 8 bits 32 bits 16 bits 128 bits 16 bits + * | 0-padding | permitV | shortenedDeadline | referralCode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @param r The R parameter of ERC712 permit sig + * @param s The S parameter of ERC712 permit sig + */ + function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s) external; + + /** + * @notice Calldata efficient wrapper of the withdraw function, withdrawing to the caller + * @param args Arguments for the withdraw function packed in one bytes32 + * 112 bits 128 bits 16 bits + * | 0-padding | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @return The final amount withdrawn + */ + function withdraw(bytes32 args) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the borrow function, borrowing on behalf of the caller + * @param args Arguments for the borrow function packed in one bytes32 + * 88 bits 16 bits 8 bits 128 bits 16 bits + * | 0-padding | referralCode | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + */ + function borrow(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the repay function, repaying on behalf of the caller + * @param args Arguments for the repay function packed in one bytes32 + * 104 bits 8 bits 128 bits 16 bits + * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @return The final amount repaid + */ + function repay(bytes32 args) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the repayWithPermit function, repaying on behalf of the caller + * @param args Arguments for the repayWithPermit function packed in one bytes32 + * 64 bits 8 bits 32 bits 8 bits 128 bits 16 bits + * | 0-padding | permitV | shortenedDeadline | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @param r The R parameter of ERC712 permit sig + * @param s The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the repayWithATokens function + * @param args Arguments for the repayWithATokens function packed in one bytes32 + * 104 bits 8 bits 128 bits 16 bits + * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | + * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to + * type(uint256).max + * @dev assetId is the index of the asset in the reservesList. + * @return The final amount repaid + */ + function repayWithATokens(bytes32 args) external returns (uint256); + + /** + * @notice Calldata efficient wrapper of the setUserUseReserveAsCollateral function + * @param args Arguments for the setUserUseReserveAsCollateral function packed in one bytes32 + * 239 bits 1 bit 16 bits + * | 0-padding | useAsCollateral | assetId | + * @dev assetId is the index of the asset in the reservesList. + */ + function setUserUseReserveAsCollateral(bytes32 args) external; + + /** + * @notice Calldata efficient wrapper of the liquidationCall function + * @param args1 part of the arguments for the liquidationCall function packed in one bytes32 + * 64 bits 160 bits 16 bits 16 bits + * | 0-padding | user address | debtAssetId | collateralAssetId | + * @param args2 part of the arguments for the liquidationCall function packed in one bytes32 + * 127 bits 1 bit 128 bits + * | 0-padding | receiveAToken | shortenedDebtToCover | + * @dev the shortenedDebtToCover is cast to 256 bits at decode time, + * if type(uint128).max the value will be expanded to type(uint256).max + */ + function liquidationCall(bytes32 args1, bytes32 args2) external; +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPool.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..e7ba8f7a --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol new file mode 100644 index 00000000..1070227a --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol new file mode 100644 index 00000000..a3a55684 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; + +/** + * @title IFlashLoanReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + */ +interface IFlashLoanReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed assets + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param assets The addresses of the flash-borrowed assets + * @param amounts The amounts of the flash-borrowed assets + * @param premiums The fee of each flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata premiums, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol new file mode 100644 index 00000000..bff21ae4 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; + +/** + * @title IFlashLoanSimpleReceiver + * @author Aave + * @notice Defines the basic interface of a flashloan-receiver contract. + * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract + */ +interface IFlashLoanSimpleReceiver { + /** + * @notice Executes an operation after receiving the flash-borrowed asset + * @dev Ensure that the contract can return the debt + premium, e.g., has + * enough funds to repay and has approved the Pool to pull the total amount + * @param asset The address of the flash-borrowed asset + * @param amount The amount of the flash-borrowed asset + * @param premium The fee of the flash-borrowed asset + * @param initiator The address of the flashloan initiator + * @param params The byte-encoded params passed when initiating the flashloan + * @return True if the execution of the operation succeeds, false otherwise + */ + function executeOperation( + address asset, + uint256 amount, + uint256 premium, + address initiator, + bytes calldata params + ) external returns (bool); + + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + function POOL() external view returns (IPool); +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BorrowLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BorrowLogic.sol new file mode 100644 index 00000000..c4ed26ed --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BorrowLogic.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {IsolationModeLogic} from './IsolationModeLogic.sol'; + +/** + * @title BorrowLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to borrowing + */ +library BorrowLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the + * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the + * isolated debt. + * @dev Emits the `Borrow()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the borrow function + */ + function executeBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteBorrowParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ( + bool isolationModeActive, + address isolationModeCollateralAddress, + uint256 isolationModeDebtCeiling + ) = userConfig.getIsolationModeState(reservesData, reservesList); + + ValidationLogic.validateBorrow( + reservesData, + reservesList, + eModeCategories, + DataTypes.ValidateBorrowParams({ + reserveCache: reserveCache, + userConfig: userConfig, + asset: params.asset, + userAddress: params.onBehalfOf, + amount: params.amount, + interestRateMode: params.interestRateMode, + reservesCount: params.reservesCount, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory, + priceOracleSentinel: params.priceOracleSentinel, + isolationModeActive: isolationModeActive, + isolationModeCollateralAddress: isolationModeCollateralAddress, + isolationModeDebtCeiling: isolationModeDebtCeiling + }) + ); + + bool isFirstBorrowing = false; + + (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); + + if (isFirstBorrowing) { + userConfig.setBorrowing(reserve.id, true); + } + + if (isolationModeActive) { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt += (params.amount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + 0, + params.releaseUnderlying ? params.amount : 0 + ); + + if (params.releaseUnderlying) { + IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); + } + + emit Borrow( + params.asset, + params.user, + params.onBehalfOf, + params.amount, + DataTypes.InterestRateMode.VARIABLE, + reserve.currentVariableBorrowRate, + params.referralCode + ); + } + + /** + * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the + * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also + * reduces the isolated debt. + * @dev Emits the `Repay()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the repay function + * @return The actual amount being repaid + */ + function executeRepay( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteRepayParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + + uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( + params.onBehalfOf + ); + + ValidationLogic.validateRepay( + reserveCache, + params.amount, + params.interestRateMode, + params.onBehalfOf, + variableDebt + ); + + uint256 paybackAmount = variableDebt; + + // Allows a user to repay with aTokens without leaving dust from interest. + if (params.useATokens && params.amount == type(uint256).max) { + params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); + } + + if (params.amount < paybackAmount) { + paybackAmount = params.amount; + } + + reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) + .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); + + reserve.updateInterestRatesAndVirtualBalance( + reserveCache, + params.asset, + params.useATokens ? 0 : paybackAmount, + 0 + ); + + if (variableDebt - paybackAmount == 0) { + userConfig.setBorrowing(reserve.id, false); + } + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + reserveCache, + paybackAmount + ); + + if (params.useATokens) { + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + reserveCache.aTokenAddress, + paybackAmount, + reserveCache.nextLiquidityIndex + ); + // in case of aToken repayment the msg.sender must always repay on behalf of itself + if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + } else { + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); + IAToken(reserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.onBehalfOf, + paybackAmount + ); + } + + emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); + + return paybackAmount; + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BridgeLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BridgeLogic.sol new file mode 100644 index 00000000..3b4d469b --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BridgeLogic.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +library BridgeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. + * @dev Essentially a supply without transferring the underlying. + * @dev Emits the `MintUnbacked` event + * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param asset The address of the underlying asset to mint aTokens of + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function executeMintUnbacked( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, reserve, amount, onBehalfOf); + + uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); + uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); + + uint256 unbacked = reserve.unbacked += amount.toUint128(); + + require( + unbacked <= unbackedMintCap * (10 ** reserveDecimals), + Errors.UNBACKED_MINT_CAP_EXCEEDED + ); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, 0, 0); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + onBehalfOf, + amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration, + reserveCache.aTokenAddress + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); + } + } + + emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); + } + + /** + * @notice Back the current unbacked with `amount` and pay `fee`. + * @dev It is not possible to back more than the existing unbacked amount of the reserve + * @dev Emits the `BackUnbacked` event + * @param reserve The reserve to back unbacked for + * @param asset The address of the underlying asset to repay + * @param amount The amount to back + * @param fee The amount paid in fees + * @param protocolFeeBps The fraction of fees in basis points paid to the protocol + * @return The backed amount + */ + function executeBackUnbacked( + DataTypes.ReserveData storage reserve, + address asset, + uint256 amount, + uint256 fee, + uint256 protocolFeeBps + ) external returns (uint256) { + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; + + uint256 feeToProtocol = fee.percentMul(protocolFeeBps); + uint256 feeToLP = fee - feeToProtocol; + uint256 added = backingAmount + fee; + + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply() + + uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), + feeToLP + ); + + reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + + reserve.unbacked -= backingAmount.toUint128(); + reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, added, 0); + + IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); + + emit BackUnbacked(asset, msg.sender, backingAmount, fee); + + return backingAmount; + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/CalldataLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/CalldataLogic.sol new file mode 100644 index 00000000..742cbcbf --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/CalldataLogic.sol @@ -0,0 +1,233 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title CalldataLogic library + * @author Aave + * @notice Library to decode calldata, used to optimize calldata size in L2Pool for transaction cost reduction + */ +library CalldataLogic { + /** + * @notice Decodes compressed supply params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed supply params + * @return The address of the underlying reserve + * @return The amount to supply + * @return The referralCode + */ + function decodeSupplyParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint16) { + uint16 assetId; + uint256 amount; + uint16 referralCode; + + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + referralCode := and(shr(144, args), 0xFFFF) + } + return (reservesList[assetId], amount, referralCode); + } + + /** + * @notice Decodes compressed supply params to standard params along with permit params + * @param reservesList The addresses of all the active reserves + * @param args The packed supply with permit params + * @return The address of the underlying reserve + * @return The amount to supply + * @return The referralCode + * @return The deadline of the permit + * @return The V value of the permit signature + */ + function decodeSupplyWithPermitParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint16, uint256, uint8) { + uint256 deadline; + uint8 permitV; + + assembly { + deadline := and(shr(160, args), 0xFFFFFFFF) + permitV := and(shr(192, args), 0xFF) + } + (address asset, uint256 amount, uint16 referralCode) = decodeSupplyParams(reservesList, args); + + return (asset, amount, referralCode, deadline, permitV); + } + + /** + * @notice Decodes compressed withdraw params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed withdraw params + * @return The address of the underlying reserve + * @return The amount to withdraw + */ + function decodeWithdrawParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256) { + uint16 assetId; + uint256 amount; + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + } + if (amount == type(uint128).max) { + amount = type(uint256).max; + } + return (reservesList[assetId], amount); + } + + /** + * @notice Decodes compressed borrow params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed borrow params + * @return The address of the underlying reserve + * @return The amount to borrow + * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) + * @return The referralCode + */ + function decodeBorrowParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint256, uint16) { + uint16 assetId; + uint256 amount; + uint256 interestRateMode; + uint16 referralCode; + + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + interestRateMode := and(shr(144, args), 0xFF) + referralCode := and(shr(152, args), 0xFFFF) + } + + return (reservesList[assetId], amount, interestRateMode, referralCode); + } + + /** + * @notice Decodes compressed repay params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed repay params + * @return The address of the underlying reserve + * @return The amount to repay + * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) + */ + function decodeRepayParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint256) { + uint16 assetId; + uint256 amount; + uint256 interestRateMode; + + assembly { + assetId := and(args, 0xFFFF) + amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + interestRateMode := and(shr(144, args), 0xFF) + } + + if (amount == type(uint128).max) { + amount = type(uint256).max; + } + + return (reservesList[assetId], amount, interestRateMode); + } + + /** + * @notice Decodes compressed repay params to standard params along with permit params + * @param reservesList The addresses of all the active reserves + * @param args The packed repay with permit params + * @return The address of the underlying reserve + * @return The amount to repay + * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) + * @return The deadline of the permit + * @return The V value of the permit signature + */ + function decodeRepayWithPermitParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, uint256, uint256, uint256, uint8) { + uint256 deadline; + uint8 permitV; + + (address asset, uint256 amount, uint256 interestRateMode) = decodeRepayParams( + reservesList, + args + ); + + assembly { + deadline := and(shr(152, args), 0xFFFFFFFF) + permitV := and(shr(184, args), 0xFF) + } + + return (asset, amount, interestRateMode, deadline, permitV); + } + + /** + * @notice Decodes compressed set user use reserve as collateral params to standard params + * @param reservesList The addresses of all the active reserves + * @param args The packed set user use reserve as collateral params + * @return The address of the underlying reserve + * @return True if to set using as collateral, false otherwise + */ + function decodeSetUserUseReserveAsCollateralParams( + mapping(uint256 => address) storage reservesList, + bytes32 args + ) internal view returns (address, bool) { + uint16 assetId; + bool useAsCollateral; + assembly { + assetId := and(args, 0xFFFF) + useAsCollateral := and(shr(16, args), 0x1) + } + return (reservesList[assetId], useAsCollateral); + } + + /** + * @notice Decodes compressed liquidation call params to standard params + * @param reservesList The addresses of all the active reserves + * @param args1 The first half of packed liquidation call params + * @param args2 The second half of the packed liquidation call params + * @return The address of the underlying collateral asset + * @return The address of the underlying debt asset + * @return The address of the user to liquidate + * @return The amount of debt to cover + * @return True if receiving aTokens, false otherwise + */ + function decodeLiquidationCallParams( + mapping(uint256 => address) storage reservesList, + bytes32 args1, + bytes32 args2 + ) internal view returns (address, address, address, uint256, bool) { + uint16 collateralAssetId; + uint16 debtAssetId; + address user; + uint256 debtToCover; + bool receiveAToken; + + assembly { + collateralAssetId := and(args1, 0xFFFF) + debtAssetId := and(shr(16, args1), 0xFFFF) + user := and(shr(32, args1), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + + debtToCover := and(args2, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + receiveAToken := and(shr(128, args2), 0x1) + } + + if (debtToCover == type(uint128).max) { + debtToCover = type(uint256).max; + } + + return ( + reservesList[collateralAssetId], + reservesList[debtAssetId], + user, + debtToCover, + receiveAToken + ); + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..647fc7e7 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol new file mode 100644 index 00000000..31ffb288 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol @@ -0,0 +1,277 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IFlashLoanReceiver} from '../../../misc/flashloan/interfaces/IFlashLoanReceiver.sol'; +import {IFlashLoanSimpleReceiver} from '../../../misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {BorrowLogic} from './BorrowLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title FlashLoanLogic library + * @author Aave + * @notice Implements the logic for the flash loans + */ +library FlashLoanLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + + // See `IPool` for descriptions + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + // Helper struct for internal variables used in the `executeFlashLoan` function + struct FlashLoanLocalVars { + IFlashLoanReceiver receiver; + address currentAsset; + uint256 currentAmount; + uint256[] totalPremiums; + uint256 flashloanPremiumTotal; + uint256 flashloanPremiumToProtocol; + } + + /** + * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction + * as long as the amount taken plus fee is returned or debt is opened. + * @dev For authorized flashborrowers the fee is waived + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the flashloan function + */ + function executeFlashLoan( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.FlashloanParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); + + FlashLoanLocalVars memory vars; + + vars.totalPremiums = new uint256[](params.assets.length); + + vars.receiver = IFlashLoanReceiver(params.receiverAddress); + (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower + ? (0, 0) + : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); + + for (uint256 i = 0; i < params.assets.length; i++) { + vars.currentAmount = params.amounts[i]; + vars.totalPremiums[i] = DataTypes.InterestRateMode(params.interestRateModes[i]) == + DataTypes.InterestRateMode.NONE + ? vars.currentAmount.percentMul(vars.flashloanPremiumTotal) + : 0; + + if (reservesData[params.assets[i]].configuration.getIsVirtualAccActive()) { + reservesData[params.assets[i]].virtualUnderlyingBalance -= vars.currentAmount.toUint128(); + } + + IAToken(reservesData[params.assets[i]].aTokenAddress).transferUnderlyingTo( + params.receiverAddress, + vars.currentAmount + ); + } + + require( + vars.receiver.executeOperation( + params.assets, + params.amounts, + vars.totalPremiums, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + for (uint256 i = 0; i < params.assets.length; i++) { + vars.currentAsset = params.assets[i]; + vars.currentAmount = params.amounts[i]; + + if ( + DataTypes.InterestRateMode(params.interestRateModes[i]) == DataTypes.InterestRateMode.NONE + ) { + _handleFlashLoanRepayment( + reservesData[vars.currentAsset], + DataTypes.FlashLoanRepaymentParams({ + asset: vars.currentAsset, + receiverAddress: params.receiverAddress, + amount: vars.currentAmount, + totalPremium: vars.totalPremiums[i], + flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } else { + // If the user chose to not return the funds, the system checks if there is enough collateral and + // eventually opens a debt position + BorrowLogic.executeBorrow( + reservesData, + reservesList, + eModeCategories, + userConfig, + DataTypes.ExecuteBorrowParams({ + asset: vars.currentAsset, + user: msg.sender, + onBehalfOf: params.onBehalfOf, + amount: vars.currentAmount, + interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[i]), + referralCode: params.referralCode, + releaseUnderlying: false, + reservesCount: IPool(params.pool).getReservesCount(), + oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), + userEModeCategory: IPool(params.pool).getUserEMode(params.onBehalfOf).toUint8(), + priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) + .getPriceOracleSentinel() + }) + ); + // no premium is paid when taking on the flashloan as debt + emit FlashLoan( + params.receiverAddress, + msg.sender, + vars.currentAsset, + vars.currentAmount, + DataTypes.InterestRateMode(params.interestRateModes[i]), + 0, + params.referralCode + ); + } + } + } + + /** + * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one + * transaction as long as the amount taken plus fee is returned. + * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas + * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, + * if the receiver have not approved the pool the transaction will revert. + * @dev Emits the `FlashLoan()` event + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the simple flashloan function + */ + function executeFlashLoanSimple( + DataTypes.ReserveData storage reserve, + DataTypes.FlashloanSimpleParams memory params + ) external { + // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) + // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. + // This is done to protect against reentrance and rate manipulation within the user specified payload. + + ValidationLogic.validateFlashloanSimple(reserve, params.amount); + + IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); + uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); + + if (reserve.configuration.getIsVirtualAccActive()) { + reserve.virtualUnderlyingBalance -= params.amount.toUint128(); + } + + IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); + + require( + receiver.executeOperation( + params.asset, + params.amount, + totalPremium, + msg.sender, + params.params + ), + Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN + ); + + _handleFlashLoanRepayment( + reserve, + DataTypes.FlashLoanRepaymentParams({ + asset: params.asset, + receiverAddress: params.receiverAddress, + amount: params.amount, + totalPremium: totalPremium, + flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, + referralCode: params.referralCode + }) + ); + } + + /** + * @notice Handles repayment of flashloaned assets + premium + * @dev Will pull the amount + premium from the receiver, so must have approved pool + * @param reserve The state of the flashloaned reserve + * @param params The additional parameters needed to execute the repayment function + */ + function _handleFlashLoanRepayment( + DataTypes.ReserveData storage reserve, + DataTypes.FlashLoanRepaymentParams memory params + ) internal { + uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); + uint256 premiumToLP = params.totalPremium - premiumToProtocol; + uint256 amountPlusPremium = params.amount + params.totalPremium; + + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( + IERC20(reserveCache.aTokenAddress).totalSupply() + + uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), + premiumToLP + ); + + reserve.accruedToTreasury += premiumToProtocol + .rayDiv(reserveCache.nextLiquidityIndex) + .toUint128(); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, amountPlusPremium, 0); + + IERC20(params.asset).safeTransferFrom( + params.receiverAddress, + reserveCache.aTokenAddress, + amountPlusPremium + ); + + IAToken(reserveCache.aTokenAddress).handleRepayment( + params.receiverAddress, + params.receiverAddress, + amountPlusPremium + ); + + emit FlashLoan( + params.receiverAddress, + msg.sender, + params.asset, + params.amount, + DataTypes.InterestRateMode.NONE, + params.totalPremium, + params.referralCode + ); + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..cd5b83c6 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol new file mode 100644 index 00000000..473840ea --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/LiquidationLogic.sol new file mode 100644 index 00000000..8f4c35f6 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -0,0 +1,460 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts//IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {PercentageMath} from '../../libraries/math/PercentageMath.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {DataTypes} from '../../libraries/types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {IsolationModeLogic} from './IsolationModeLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; +import {UserConfiguration} from '../../libraries/configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../../libraries/configuration/ReserveConfiguration.sol'; +import {EModeConfiguration} from '../../libraries/configuration/EModeConfiguration.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; + +/** + * @title LiquidationLogic library + * @author Aave + * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations + */ +library LiquidationLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Default percentage of borrower's debt to be repaid in a liquidation. + * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 0.5e4 results in 50.00% + */ + uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; + + /** + * @dev Maximum percentage of borrower's debt to be repaid in a liquidation + * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 1e4 results in 100.00% + */ + uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; + + /** + * @dev This constant represents below which health factor value it is possible to liquidate + * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. + * A value of 0.95e18 results in 0.95 + */ + uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; + + struct LiquidationCallLocalVars { + uint256 userCollateralBalance; + uint256 userTotalDebt; + uint256 actualDebtToLiquidate; + uint256 actualCollateralToLiquidate; + uint256 liquidationBonus; + uint256 healthFactor; + uint256 liquidationProtocolFeeAmount; + IAToken collateralAToken; + DataTypes.ReserveCache debtReserveCache; + } + + /** + * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) + * covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportional amount of the `collateralAsset` plus a bonus to cover market risk + * @dev Emits the `LiquidationCall()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params The additional parameters needed to execute the liquidation function + */ + function executeLiquidationCall( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ExecuteLiquidationCallParams memory params + ) external { + LiquidationCallLocalVars memory vars; + + DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; + DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; + DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; + vars.debtReserveCache = debtReserve.cache(); + debtReserve.updateState(vars.debtReserveCache); + + (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: params.reservesCount, + user: params.user, + oracle: params.priceOracle, + userEModeCategory: params.userEModeCategory + }) + ); + + (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( + vars.debtReserveCache, + params, + vars.healthFactor + ); + + ValidationLogic.validateLiquidationCall( + userConfig, + collateralReserve, + debtReserve, + DataTypes.ValidateLiquidationCallParams({ + debtReserveCache: vars.debtReserveCache, + totalDebt: vars.userTotalDebt, + healthFactor: vars.healthFactor, + priceOracleSentinel: params.priceOracleSentinel + }) + ); + + vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); + if ( + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + collateralReserve.id + ) + ) { + vars.liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; + } else { + vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); + } + + vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); + + ( + vars.actualCollateralToLiquidate, + vars.actualDebtToLiquidate, + vars.liquidationProtocolFeeAmount + ) = _calculateAvailableCollateralToLiquidate( + collateralReserve, + vars.debtReserveCache, + params.collateralAsset, + params.debtAsset, + vars.actualDebtToLiquidate, + vars.userCollateralBalance, + vars.liquidationBonus, + IPriceOracleGetter(params.priceOracle) + ); + + if (vars.userTotalDebt == vars.actualDebtToLiquidate) { + userConfig.setBorrowing(debtReserve.id, false); + } + + // If the collateral being liquidated is equal to the user balance, + // we set the currency as not being used as collateral anymore + if ( + vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == + vars.userCollateralBalance + ) { + userConfig.setUsingAsCollateral(collateralReserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); + } + + _burnDebtTokens(params, vars); + + debtReserve.updateInterestRatesAndVirtualBalance( + vars.debtReserveCache, + params.debtAsset, + vars.actualDebtToLiquidate, + 0 + ); + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + vars.debtReserveCache, + vars.actualDebtToLiquidate + ); + + if (params.receiveAToken) { + _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); + } else { + _burnCollateralATokens(collateralReserve, params, vars); + } + + // Transfer fee to treasury if it is non-zero + if (vars.liquidationProtocolFeeAmount != 0) { + uint256 liquidityIndex = collateralReserve.getNormalizedIncome(); + uint256 scaledDownLiquidationProtocolFee = vars.liquidationProtocolFeeAmount.rayDiv( + liquidityIndex + ); + uint256 scaledDownUserBalance = vars.collateralAToken.scaledBalanceOf(params.user); + // To avoid trying to send more aTokens than available on balance, due to 1 wei imprecision + if (scaledDownLiquidationProtocolFee > scaledDownUserBalance) { + vars.liquidationProtocolFeeAmount = scaledDownUserBalance.rayMul(liquidityIndex); + } + vars.collateralAToken.transferOnLiquidation( + params.user, + vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), + vars.liquidationProtocolFeeAmount + ); + } + + // Transfers the debt asset being repaid to the aToken, where the liquidity is kept + IERC20(params.debtAsset).safeTransferFrom( + msg.sender, + vars.debtReserveCache.aTokenAddress, + vars.actualDebtToLiquidate + ); + + IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.user, + vars.actualDebtToLiquidate + ); + + emit LiquidationCall( + params.collateralAsset, + params.debtAsset, + params.user, + vars.actualDebtToLiquidate, + vars.actualCollateralToLiquidate, + msg.sender, + params.receiveAToken + ); + } + + /** + * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. + * @dev The function also updates the state and the interest rate of the collateral reserve. + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _burnCollateralATokens( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); + collateralReserve.updateState(collateralReserveCache); + collateralReserve.updateInterestRatesAndVirtualBalance( + collateralReserveCache, + params.collateralAsset, + 0, + vars.actualCollateralToLiquidate + ); + + // Burn the equivalent amount of aToken, sending the underlying to the liquidator + vars.collateralAToken.burn( + params.user, + msg.sender, + vars.actualCollateralToLiquidate, + collateralReserveCache.nextLiquidityIndex + ); + } + + /** + * @notice Liquidates the user aTokens by transferring them to the liquidator. + * @dev The function also checks the state of the liquidator and activates the aToken as collateral + * as in standard transfers if the isolation mode constraints are respected. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _liquidateATokens( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); + vars.collateralAToken.transferOnLiquidation( + params.user, + msg.sender, + vars.actualCollateralToLiquidate + ); + + if (liquidatorPreviousATokenBalance == 0) { + DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + liquidatorConfig, + collateralReserve.configuration, + collateralReserve.aTokenAddress + ) + ) { + liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); + } + } + } + + /** + * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. + * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. + * @param params The additional parameters needed to execute the liquidation function + * @param vars the executeLiquidationCall() function local vars + */ + function _burnDebtTokens( + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( + vars.debtReserveCache.variableDebtTokenAddress + ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); + } + + /** + * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor + * and corresponding close factor. + * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR + * @param debtReserveCache The reserve cache data object of the debt reserve + * @param params The additional parameters needed to execute the liquidation function + * @param healthFactor The health factor of the position + * @return The total debt of the user + * @return The actual debt to liquidate as a function of the closeFactor + */ + function _calculateDebt( + DataTypes.ReserveCache memory debtReserveCache, + DataTypes.ExecuteLiquidationCallParams memory params, + uint256 healthFactor + ) internal view returns (uint256, uint256) { + uint256 userVariableDebt = IERC20(debtReserveCache.variableDebtTokenAddress).balanceOf( + params.user + ); + + uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD + ? DEFAULT_LIQUIDATION_CLOSE_FACTOR + : MAX_LIQUIDATION_CLOSE_FACTOR; + + uint256 maxLiquidatableDebt = userVariableDebt.percentMul(closeFactor); + + uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt + ? maxLiquidatableDebt + : params.debtToCover; + + return (userVariableDebt, actualDebtToLiquidate); + } + + struct AvailableCollateralToLiquidateLocalVars { + uint256 collateralPrice; + uint256 debtAssetPrice; + uint256 maxCollateralToLiquidate; + uint256 baseCollateral; + uint256 bonusCollateral; + uint256 debtAssetDecimals; + uint256 collateralDecimals; + uint256 collateralAssetUnit; + uint256 debtAssetUnit; + uint256 collateralAmount; + uint256 debtAmountNeeded; + uint256 liquidationProtocolFeePercentage; + uint256 liquidationProtocolFee; + } + + /** + * @notice Calculates how much of a specific collateral can be liquidated, given + * a certain amount of debt asset. + * @dev This function needs to be called after all the checks to validate the liquidation have been performed, + * otherwise it might fail. + * @param collateralReserve The data of the collateral reserve + * @param debtReserveCache The cached data of the debt reserve + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated + * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation + * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) + * @return The amount to repay with the liquidation + * @return The fee taken from the liquidation bonus amount to be paid to the protocol + */ + function _calculateAvailableCollateralToLiquidate( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveCache memory debtReserveCache, + address collateralAsset, + address debtAsset, + uint256 debtToCover, + uint256 userCollateralBalance, + uint256 liquidationBonus, + IPriceOracleGetter oracle + ) internal view returns (uint256, uint256, uint256) { + AvailableCollateralToLiquidateLocalVars memory vars; + + vars.collateralPrice = oracle.getAssetPrice(collateralAsset); + vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); + + vars.collateralDecimals = collateralReserve.configuration.getDecimals(); + vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); + + unchecked { + vars.collateralAssetUnit = 10 ** vars.collateralDecimals; + vars.debtAssetUnit = 10 ** vars.debtAssetDecimals; + } + + vars.liquidationProtocolFeePercentage = collateralReserve + .configuration + .getLiquidationProtocolFee(); + + // This is the base collateral to liquidate based on the given debt to cover + vars.baseCollateral = + ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / + (vars.collateralPrice * vars.debtAssetUnit); + + vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); + + if (vars.maxCollateralToLiquidate > userCollateralBalance) { + vars.collateralAmount = userCollateralBalance; + vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / + (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); + } else { + vars.collateralAmount = vars.maxCollateralToLiquidate; + vars.debtAmountNeeded = debtToCover; + } + + if (vars.liquidationProtocolFeePercentage != 0) { + vars.bonusCollateral = + vars.collateralAmount - + vars.collateralAmount.percentDiv(liquidationBonus); + + vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( + vars.liquidationProtocolFeePercentage + ); + + return ( + vars.collateralAmount - vars.liquidationProtocolFee, + vars.debtAmountNeeded, + vars.liquidationProtocolFee + ); + } else { + return (vars.collateralAmount, vars.debtAmountNeeded, 0); + } + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/PoolLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/PoolLogic.sol new file mode 100644 index 00000000..1558fe55 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/PoolLogic.sol @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; + +/** + * @title PoolLogic library + * @author Aave + * @notice Implements the logic for Pool specific functions + */ +library PoolLogic { + using GPv2SafeERC20 for IERC20; + using WadRayMath for uint256; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice Initialize an asset reserve and add the reserve to the list of reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param params Additional parameters needed for initiation + * @return true if appended, false if inserted at existing empty spot + */ + function executeInitReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.InitReserveParams memory params + ) external returns (bool) { + require(Address.isContract(params.asset), Errors.NOT_CONTRACT); + reservesData[params.asset].init( + params.aTokenAddress, + params.variableDebtAddress, + params.interestRateStrategyAddress + ); + + bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || + reservesList[0] == params.asset; + require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); + + for (uint16 i = 0; i < params.reservesCount; i++) { + if (reservesList[i] == address(0)) { + reservesData[params.asset].id = i; + reservesList[i] = params.asset; + return false; + } + } + + require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); + reservesData[params.asset].id = params.reservesCount; + reservesList[params.reservesCount] = params.asset; + return true; + } + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function executeRescueTokens(address token, address to, uint256 amount) external { + IERC20(token).safeTransfer(to, amount); + } + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param reservesData The state of all the reserves + * @param assets The list of reserves for which the minting needs to be executed + */ + function executeMintToTreasury( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] calldata assets + ) external { + for (uint256 i = 0; i < assets.length; i++) { + address assetAddress = assets[i]; + + DataTypes.ReserveData storage reserve = reservesData[assetAddress]; + + // this cover both inactive reserves and invalid reserves since the flag will be 0 for both + if (!reserve.configuration.getActive()) { + continue; + } + + uint256 accruedToTreasury = reserve.accruedToTreasury; + + if (accruedToTreasury != 0) { + reserve.accruedToTreasury = 0; + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); + IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); + + emit MintedToTreasury(assetAddress, amountToMint); + } + } + } + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function executeResetIsolationModeTotalDebt( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset + ) external { + require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); + reservesData[asset].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(asset, 0); + } + + /** + * @notice Sets the liquidation grace period of the asset + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + */ + function executeSetLiquidationGracePeriod( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset, + uint40 until + ) external { + reservesData[asset].liquidationGracePeriodUntil = until; + } + + /** + * @notice Drop a reserve + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param asset The address of the underlying asset of the reserve + */ + function executeDropReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + address asset + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + ValidationLogic.validateDropReserve(reservesList, reserve, asset); + reservesList[reservesData[asset].id] = address(0); + delete reservesData[asset]; + } + + /** + * @notice Returns the user account data across all the reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the calculation + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function executeGetUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ) + { + ( + totalCollateralBase, + totalDebtBase, + ltv, + currentLiquidationThreshold, + healthFactor, + + ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); + + availableBorrowsBase = GenericLogic.calculateAvailableBorrows( + totalCollateralBase, + totalDebtBase, + ltv + ); + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..dd5c637d --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/SupplyLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/SupplyLogic.sol new file mode 100644 index 00000000..727886e7 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/SupplyLogic.sol @@ -0,0 +1,300 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; + +/** + * @title SupplyLogic library + * @author Aave + * @notice Implements the base logic for supply/withdraw + */ +library SupplyLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. + * @dev Emits the `Supply()` event. + * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as + * collateral. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the supply function + */ + function executeSupply( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSupplyParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, reserve, params.amount, params.onBehalfOf); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, params.amount, 0); + + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + params.onBehalfOf, + params.amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration, + reserveCache.aTokenAddress + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); + } + } + + emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); + } + + /** + * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset + * previously supplied in the Aave protocol. + * @dev Emits the `Withdraw()` event. + * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the withdraw function + * @return The actual amount withdrawn + */ + function executeWithdraw( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteWithdrawParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + require(params.to != reserveCache.aTokenAddress, Errors.WITHDRAW_TO_ATOKEN); + + reserve.updateState(reserveCache); + + uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( + reserveCache.nextLiquidityIndex + ); + + uint256 amountToWithdraw = params.amount; + + if (params.amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + + ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, amountToWithdraw); + + bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); + + if (isCollateral && amountToWithdraw == userBalance) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + params.to, + amountToWithdraw, + reserveCache.nextLiquidityIndex + ); + + if (isCollateral && userConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + params.asset, + msg.sender, + params.reservesCount, + params.oracle, + params.userEModeCategory + ); + } + + emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); + + return amountToWithdraw; + } + + /** + * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid + * collateralization constraints violation. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as + * collateral. + * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param params The additional parameters needed to execute the finalizeTransfer function + */ + function executeFinalizeTransfer( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.FinalizeTransferParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + + ValidationLogic.validateTransfer(reserve); + + uint256 reserveId = reserve.id; + uint256 scaledAmount = params.amount.rayDiv(reserve.getNormalizedIncome()); + + if (params.from != params.to && scaledAmount != 0) { + DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; + + if (fromConfig.isUsingAsCollateral(reserveId)) { + if (fromConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + usersConfig[params.from], + params.asset, + params.from, + params.reservesCount, + params.oracle, + params.fromEModeCategory + ); + } + if (params.balanceFromBefore == params.amount) { + fromConfig.setUsingAsCollateral(reserveId, false); + emit ReserveUsedAsCollateralDisabled(params.asset, params.from); + } + } + + if (params.balanceToBefore == 0) { + DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + toConfig, + reserve.configuration, + reserve.aTokenAddress + ) + ) { + toConfig.setUsingAsCollateral(reserveId, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.to); + } + } + } + } + + /** + * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as + * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor + * checks to ensure collateralization. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. + * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The users configuration mapping that track the supplied/borrowed assets + * @param asset The address of the asset being configured as collateral + * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise + * @param reservesCount The number of initialized reserves + * @param priceOracle The address of the price oracle + * @param userEModeCategory The eMode category chosen by the user + */ + function executeUseReserveAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + bool useAsCollateral, + uint256 reservesCount, + address priceOracle, + uint8 userEModeCategory + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); + + ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); + + if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; + + if (useAsCollateral) { + require( + ValidationLogic.validateUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration + ), + Errors.USER_IN_ISOLATION_MODE_OR_LTV_ZERO + ); + + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, msg.sender); + } else { + userConfig.setUsingAsCollateral(reserve.id, false); + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + asset, + msg.sender, + reservesCount, + priceOracle, + userEModeCategory + ); + + emit ReserveUsedAsCollateralDisabled(asset, msg.sender); + } + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..e08a30e8 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,642 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..9adca939 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/L2Pool.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/L2Pool.sol new file mode 100644 index 00000000..d8925717 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/L2Pool.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {Pool} from './Pool.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {IL2Pool} from '../../interfaces/IL2Pool.sol'; +import {CalldataLogic} from '../libraries/logic/CalldataLogic.sol'; + +/** + * @title L2Pool + * @author Aave + * @notice Calldata optimized extension of the Pool contract allowing users to pass compact calldata representation + * to reduce transaction costs on rollups. + */ +abstract contract L2Pool is Pool, IL2Pool { + /// @inheritdoc IL2Pool + function supply(bytes32 args) external override { + (address asset, uint256 amount, uint16 referralCode) = CalldataLogic.decodeSupplyParams( + _reservesList, + args + ); + + supply(asset, amount, msg.sender, referralCode); + } + + /// @inheritdoc IL2Pool + function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s) external override { + (address asset, uint256 amount, uint16 referralCode, uint256 deadline, uint8 v) = CalldataLogic + .decodeSupplyWithPermitParams(_reservesList, args); + + supplyWithPermit(asset, amount, msg.sender, referralCode, deadline, v, r, s); + } + + /// @inheritdoc IL2Pool + function withdraw(bytes32 args) external override returns (uint256) { + (address asset, uint256 amount) = CalldataLogic.decodeWithdrawParams(_reservesList, args); + + return withdraw(asset, amount, msg.sender); + } + + /// @inheritdoc IL2Pool + function borrow(bytes32 args) external override { + (address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode) = CalldataLogic + .decodeBorrowParams(_reservesList, args); + + borrow(asset, amount, interestRateMode, referralCode, msg.sender); + } + + /// @inheritdoc IL2Pool + function repay(bytes32 args) external override returns (uint256) { + (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( + _reservesList, + args + ); + + return repay(asset, amount, interestRateMode, msg.sender); + } + + /// @inheritdoc IL2Pool + function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) external override returns (uint256) { + ( + address asset, + uint256 amount, + uint256 interestRateMode, + uint256 deadline, + uint8 v + ) = CalldataLogic.decodeRepayWithPermitParams(_reservesList, args); + + return repayWithPermit(asset, amount, interestRateMode, msg.sender, deadline, v, r, s); + } + + /// @inheritdoc IL2Pool + function repayWithATokens(bytes32 args) external override returns (uint256) { + (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( + _reservesList, + args + ); + + return repayWithATokens(asset, amount, interestRateMode); + } + + /// @inheritdoc IL2Pool + function setUserUseReserveAsCollateral(bytes32 args) external override { + (address asset, bool useAsCollateral) = CalldataLogic.decodeSetUserUseReserveAsCollateralParams( + _reservesList, + args + ); + setUserUseReserveAsCollateral(asset, useAsCollateral); + } + + /// @inheritdoc IL2Pool + function liquidationCall(bytes32 args1, bytes32 args2) external override { + ( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) = CalldataLogic.decodeLiquidationCallParams(_reservesList, args1, args2); + liquidationCall(collateralAsset, debtAsset, user, debtToCover, receiveAToken); + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/Pool.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/Pool.sol new file mode 100644 index 00000000..72445e47 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/Pool.sol @@ -0,0 +1,871 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {VersionedInitializable} from '../../misc/aave-upgradeability/VersionedInitializable.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; +import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; +import {PoolLogic} from '../libraries/logic/PoolLogic.sol'; +import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; +import {EModeLogic} from '../libraries/logic/EModeLogic.sol'; +import {SupplyLogic} from '../libraries/logic/SupplyLogic.sol'; +import {FlashLoanLogic} from '../libraries/logic/FlashLoanLogic.sol'; +import {BorrowLogic} from '../libraries/logic/BorrowLogic.sol'; +import {LiquidationLogic} from '../libraries/logic/LiquidationLogic.sol'; +import {DataTypes} from '../libraries/types/DataTypes.sol'; +import {BridgeLogic} from '../libraries/logic/BridgeLogic.sol'; +import {IERC20WithPermit} from '../../interfaces/IERC20WithPermit.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../interfaces/IPool.sol'; +import {IACLManager} from '../../interfaces/IACLManager.sol'; +import {PoolStorage} from './PoolStorage.sol'; + +/** + * @title Pool contract + * @author Aave + * @notice Main point of interaction with an Aave protocol's market + * - Users can: + * # Supply + * # Withdraw + * # Borrow + * # Repay + * # Enable/disable their supplied assets as collateral + * # Liquidate positions + * # Execute Flash Loans + * @dev To be covered by a proxy contract, owned by the PoolAddressesProvider of the specific market + * @dev All admin functions are callable by the PoolConfigurator contract defined also in the + * PoolAddressesProvider + */ +abstract contract Pool is VersionedInitializable, PoolStorage, IPool { + using ReserveLogic for DataTypes.ReserveData; + + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @dev Only pool configurator can call functions marked by this modifier. + */ + modifier onlyPoolConfigurator() { + _onlyPoolConfigurator(); + _; + } + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + _onlyPoolAdmin(); + _; + } + + /** + * @dev Only bridge can call functions marked by this modifier. + */ + modifier onlyBridge() { + _onlyBridge(); + _; + } + + function _onlyPoolConfigurator() internal view virtual { + require( + ADDRESSES_PROVIDER.getPoolConfigurator() == msg.sender, + Errors.CALLER_NOT_POOL_CONFIGURATOR + ); + } + + function _onlyPoolAdmin() internal view virtual { + require( + IACLManager(ADDRESSES_PROVIDER.getACLManager()).isPoolAdmin(msg.sender), + Errors.CALLER_NOT_POOL_ADMIN + ); + } + + function _onlyBridge() internal view virtual { + require( + IACLManager(ADDRESSES_PROVIDER.getACLManager()).isBridge(msg.sender), + Errors.CALLER_NOT_BRIDGE + ); + } + + /** + * @dev Constructor. + * @param provider The address of the PoolAddressesProvider contract + */ + constructor(IPoolAddressesProvider provider) { + ADDRESSES_PROVIDER = provider; + } + + /** + * @notice Initializes the Pool. + * @dev Function is invoked by the proxy contract when the Pool contract is added to the + * PoolAddressesProvider of the market. + * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations + * @param provider The address of the PoolAddressesProvider + */ + function initialize(IPoolAddressesProvider provider) external virtual; + + /// @inheritdoc IPool + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external virtual override onlyBridge { + BridgeLogic.executeMintUnbacked( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + asset, + amount, + onBehalfOf, + referralCode + ); + } + + /// @inheritdoc IPool + function backUnbacked( + address asset, + uint256 amount, + uint256 fee + ) external virtual override onlyBridge returns (uint256) { + return + BridgeLogic.executeBackUnbacked(_reserves[asset], asset, amount, fee, _bridgeProtocolFee); + } + + /// @inheritdoc IPool + function supply( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) public virtual override { + SupplyLogic.executeSupply( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteSupplyParams({ + asset: asset, + amount: amount, + onBehalfOf: onBehalfOf, + referralCode: referralCode + }) + ); + } + + /// @inheritdoc IPool + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) public virtual override { + try + IERC20WithPermit(asset).permit( + msg.sender, + address(this), + amount, + deadline, + permitV, + permitR, + permitS + ) + {} catch {} + SupplyLogic.executeSupply( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteSupplyParams({ + asset: asset, + amount: amount, + onBehalfOf: onBehalfOf, + referralCode: referralCode + }) + ); + } + + /// @inheritdoc IPool + function withdraw( + address asset, + uint256 amount, + address to + ) public virtual override returns (uint256) { + return + SupplyLogic.executeWithdraw( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[msg.sender], + DataTypes.ExecuteWithdrawParams({ + asset: asset, + amount: amount, + to: to, + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[msg.sender] + }) + ); + } + + /// @inheritdoc IPool + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) public virtual override { + BorrowLogic.executeBorrow( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[onBehalfOf], + DataTypes.ExecuteBorrowParams({ + asset: asset, + user: msg.sender, + onBehalfOf: onBehalfOf, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + referralCode: referralCode, + releaseUnderlying: true, + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[onBehalfOf], + priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() + }) + ); + } + + /// @inheritdoc IPool + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) public virtual override returns (uint256) { + return + BorrowLogic.executeRepay( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteRepayParams({ + asset: asset, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + onBehalfOf: onBehalfOf, + useATokens: false + }) + ); + } + + /// @inheritdoc IPool + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) public virtual override returns (uint256) { + try + IERC20WithPermit(asset).permit( + msg.sender, + address(this), + amount, + deadline, + permitV, + permitR, + permitS + ) + {} catch {} + + { + DataTypes.ExecuteRepayParams memory params = DataTypes.ExecuteRepayParams({ + asset: asset, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + onBehalfOf: onBehalfOf, + useATokens: false + }); + return BorrowLogic.executeRepay(_reserves, _reservesList, _usersConfig[onBehalfOf], params); + } + } + + /// @inheritdoc IPool + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) public virtual override returns (uint256) { + return + BorrowLogic.executeRepay( + _reserves, + _reservesList, + _usersConfig[msg.sender], + DataTypes.ExecuteRepayParams({ + asset: asset, + amount: amount, + interestRateMode: DataTypes.InterestRateMode(interestRateMode), + onBehalfOf: msg.sender, + useATokens: true + }) + ); + } + + /// @inheritdoc IPool + function setUserUseReserveAsCollateral( + address asset, + bool useAsCollateral + ) public virtual override { + SupplyLogic.executeUseReserveAsCollateral( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[msg.sender], + asset, + useAsCollateral, + _reservesCount, + ADDRESSES_PROVIDER.getPriceOracle(), + _usersEModeCategory[msg.sender] + ); + } + + /// @inheritdoc IPool + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) public virtual override { + LiquidationLogic.executeLiquidationCall( + _reserves, + _reservesList, + _usersConfig, + _eModeCategories, + DataTypes.ExecuteLiquidationCallParams({ + reservesCount: _reservesCount, + debtToCover: debtToCover, + collateralAsset: collateralAsset, + debtAsset: debtAsset, + user: user, + receiveAToken: receiveAToken, + priceOracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[user], + priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() + }) + ); + } + + /// @inheritdoc IPool + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) public virtual override { + DataTypes.FlashloanParams memory flashParams = DataTypes.FlashloanParams({ + receiverAddress: receiverAddress, + assets: assets, + amounts: amounts, + interestRateModes: interestRateModes, + onBehalfOf: onBehalfOf, + params: params, + referralCode: referralCode, + flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, + flashLoanPremiumTotal: _flashLoanPremiumTotal, + reservesCount: _reservesCount, + addressesProvider: address(ADDRESSES_PROVIDER), + pool: address(this), + userEModeCategory: _usersEModeCategory[onBehalfOf], + isAuthorizedFlashBorrower: IACLManager(ADDRESSES_PROVIDER.getACLManager()).isFlashBorrower( + msg.sender + ) + }); + + FlashLoanLogic.executeFlashLoan( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[onBehalfOf], + flashParams + ); + } + + /// @inheritdoc IPool + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) public virtual override { + DataTypes.FlashloanSimpleParams memory flashParams = DataTypes.FlashloanSimpleParams({ + receiverAddress: receiverAddress, + asset: asset, + amount: amount, + params: params, + referralCode: referralCode, + flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, + flashLoanPremiumTotal: _flashLoanPremiumTotal + }); + FlashLoanLogic.executeFlashLoanSimple(_reserves[asset], flashParams); + } + + /// @inheritdoc IPool + function mintToTreasury(address[] calldata assets) external virtual override { + PoolLogic.executeMintToTreasury(_reserves, assets); + } + + /// @inheritdoc IPool + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory) { + return _reserves[asset]; + } + + /// @inheritdoc IPool + function getReserveData( + address asset + ) external view virtual override returns (DataTypes.ReserveDataLegacy memory) { + DataTypes.ReserveData memory reserve = _reserves[asset]; + DataTypes.ReserveDataLegacy memory res; + + res.configuration = reserve.configuration; + res.liquidityIndex = reserve.liquidityIndex; + res.currentLiquidityRate = reserve.currentLiquidityRate; + res.variableBorrowIndex = reserve.variableBorrowIndex; + res.currentVariableBorrowRate = reserve.currentVariableBorrowRate; + res.lastUpdateTimestamp = reserve.lastUpdateTimestamp; + res.id = reserve.id; + res.aTokenAddress = reserve.aTokenAddress; + res.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + res.interestRateStrategyAddress = reserve.interestRateStrategyAddress; + res.accruedToTreasury = reserve.accruedToTreasury; + res.unbacked = reserve.unbacked; + res.isolationModeTotalDebt = reserve.isolationModeTotalDebt; + // This is a temporary workaround for integrations that are broken by Aave 3.2 + // While the new pool data provider is backward compatible, some integrations hard-code an old implementation + // To allow them to not have any infrastructural blocker, a mock must be configured in the Aave Pool Addresses Provider, returning zero on all required view methods, instead of reverting + res.stableDebtTokenAddress = ADDRESSES_PROVIDER.getAddress(bytes32('MOCK_STABLE_DEBT')); + return res; + } + + /// @inheritdoc IPool + function getVirtualUnderlyingBalance( + address asset + ) external view virtual override returns (uint128) { + return _reserves[asset].virtualUnderlyingBalance; + } + + /// @inheritdoc IPool + function getUserAccountData( + address user + ) + external + view + virtual + override + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ) + { + return + PoolLogic.executeGetUserAccountData( + _reserves, + _reservesList, + _eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: _usersConfig[user], + reservesCount: _reservesCount, + user: user, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[user] + }) + ); + } + + /// @inheritdoc IPool + function getConfiguration( + address asset + ) external view virtual override returns (DataTypes.ReserveConfigurationMap memory) { + return _reserves[asset].configuration; + } + + /// @inheritdoc IPool + function getUserConfiguration( + address user + ) external view virtual override returns (DataTypes.UserConfigurationMap memory) { + return _usersConfig[user]; + } + + /// @inheritdoc IPool + function getReserveNormalizedIncome( + address asset + ) external view virtual override returns (uint256) { + return _reserves[asset].getNormalizedIncome(); + } + + /// @inheritdoc IPool + function getReserveNormalizedVariableDebt( + address asset + ) external view virtual override returns (uint256) { + return _reserves[asset].getNormalizedDebt(); + } + + /// @inheritdoc IPool + function getReservesList() external view virtual override returns (address[] memory) { + uint256 reservesListCount = _reservesCount; + uint256 droppedReservesCount = 0; + address[] memory reservesList = new address[](reservesListCount); + + for (uint256 i = 0; i < reservesListCount; i++) { + if (_reservesList[i] != address(0)) { + reservesList[i - droppedReservesCount] = _reservesList[i]; + } else { + droppedReservesCount++; + } + } + + // Reduces the length of the reserves array by `droppedReservesCount` + assembly { + mstore(reservesList, sub(reservesListCount, droppedReservesCount)) + } + return reservesList; + } + + /// @inheritdoc IPool + function getReservesCount() external view virtual override returns (uint256) { + return _reservesCount; + } + + /// @inheritdoc IPool + function getReserveAddressById(uint16 id) external view returns (address) { + return _reservesList[id]; + } + + /// @inheritdoc IPool + function BRIDGE_PROTOCOL_FEE() public view virtual override returns (uint256) { + return _bridgeProtocolFee; + } + + /// @inheritdoc IPool + function FLASHLOAN_PREMIUM_TOTAL() public view virtual override returns (uint128) { + return _flashLoanPremiumTotal; + } + + /// @inheritdoc IPool + function FLASHLOAN_PREMIUM_TO_PROTOCOL() public view virtual override returns (uint128) { + return _flashLoanPremiumToProtocol; + } + + /// @inheritdoc IPool + function MAX_NUMBER_RESERVES() public view virtual override returns (uint16) { + return ReserveConfiguration.MAX_RESERVES_COUNT; + } + + /// @inheritdoc IPool + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external virtual override { + require(msg.sender == _reserves[asset].aTokenAddress, Errors.CALLER_NOT_ATOKEN); + SupplyLogic.executeFinalizeTransfer( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig, + DataTypes.FinalizeTransferParams({ + asset: asset, + from: from, + to: to, + amount: amount, + balanceFromBefore: balanceFromBefore, + balanceToBefore: balanceToBefore, + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + fromEModeCategory: _usersEModeCategory[from] + }) + ); + } + + /// @inheritdoc IPool + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external virtual override onlyPoolConfigurator { + if ( + PoolLogic.executeInitReserve( + _reserves, + _reservesList, + DataTypes.InitReserveParams({ + asset: asset, + aTokenAddress: aTokenAddress, + variableDebtAddress: variableDebtAddress, + interestRateStrategyAddress: interestRateStrategyAddress, + reservesCount: _reservesCount, + maxNumberReserves: MAX_NUMBER_RESERVES() + }) + ) + ) { + _reservesCount++; + } + } + + /// @inheritdoc IPool + function dropReserve(address asset) external virtual override onlyPoolConfigurator { + PoolLogic.executeDropReserve(_reserves, _reservesList, asset); + } + + /// @inheritdoc IPool + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external virtual override onlyPoolConfigurator { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + + _reserves[asset].interestRateStrategyAddress = rateStrategyAddress; + } + + /// @inheritdoc IPool + function syncIndexesState(address asset) external virtual override onlyPoolConfigurator { + DataTypes.ReserveData storage reserve = _reserves[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + } + + /// @inheritdoc IPool + function syncRatesState(address asset) external virtual override onlyPoolConfigurator { + DataTypes.ReserveData storage reserve = _reserves[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + ReserveLogic.updateInterestRatesAndVirtualBalance(reserve, reserveCache, asset, 0, 0); + } + + /// @inheritdoc IPool + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external virtual override onlyPoolConfigurator { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + _reserves[asset].configuration = configuration; + } + + /// @inheritdoc IPool + function updateBridgeProtocolFee( + uint256 protocolFee + ) external virtual override onlyPoolConfigurator { + _bridgeProtocolFee = protocolFee; + } + + /// @inheritdoc IPool + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external virtual override onlyPoolConfigurator { + _flashLoanPremiumTotal = flashLoanPremiumTotal; + _flashLoanPremiumToProtocol = flashLoanPremiumToProtocol; + } + + /// @inheritdoc IPool + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory category + ) external virtual override onlyPoolConfigurator { + // category 0 is reserved for volatile heterogeneous assets and it's always disabled + require(id != 0, Errors.EMODE_CATEGORY_RESERVED); + _eModeCategories[id].ltv = category.ltv; + _eModeCategories[id].liquidationThreshold = category.liquidationThreshold; + _eModeCategories[id].liquidationBonus = category.liquidationBonus; + _eModeCategories[id].label = category.label; + } + + /// @inheritdoc IPool + function configureEModeCategoryCollateralBitmap( + uint8 id, + uint128 collateralBitmap + ) external virtual override onlyPoolConfigurator { + // category 0 is reserved for volatile heterogeneous assets and it's always disabled + require(id != 0, Errors.EMODE_CATEGORY_RESERVED); + _eModeCategories[id].collateralBitmap = collateralBitmap; + } + + /// @inheritdoc IPool + function configureEModeCategoryBorrowableBitmap( + uint8 id, + uint128 borrowableBitmap + ) external virtual override onlyPoolConfigurator { + // category 0 is reserved for volatile heterogeneous assets and it's always disabled + require(id != 0, Errors.EMODE_CATEGORY_RESERVED); + _eModeCategories[id].borrowableBitmap = borrowableBitmap; + } + + /// @inheritdoc IPool + function getEModeCategoryData( + uint8 id + ) external view virtual override returns (DataTypes.EModeCategoryLegacy memory) { + DataTypes.EModeCategory memory category = _eModeCategories[id]; + return + DataTypes.EModeCategoryLegacy({ + ltv: category.ltv, + liquidationThreshold: category.liquidationThreshold, + liquidationBonus: category.liquidationBonus, + priceSource: address(0), + label: category.label + }); + } + + /// @inheritdoc IPool + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory) { + return + DataTypes.CollateralConfig({ + ltv: _eModeCategories[id].ltv, + liquidationThreshold: _eModeCategories[id].liquidationThreshold, + liquidationBonus: _eModeCategories[id].liquidationBonus + }); + } + + /// @inheritdoc IPool + function getEModeCategoryLabel(uint8 id) external view returns (string memory) { + return _eModeCategories[id].label; + } + + /// @inheritdoc IPool + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128) { + return _eModeCategories[id].collateralBitmap; + } + + /// @inheritdoc IPool + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128) { + return _eModeCategories[id].borrowableBitmap; + } + + /// @inheritdoc IPool + function setUserEMode(uint8 categoryId) external virtual override { + EModeLogic.executeSetUserEMode( + _reserves, + _reservesList, + _eModeCategories, + _usersEModeCategory, + _usersConfig[msg.sender], + DataTypes.ExecuteSetUserEModeParams({ + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + categoryId: categoryId + }) + ); + } + + /// @inheritdoc IPool + function getUserEMode(address user) external view virtual override returns (uint256) { + return _usersEModeCategory[user]; + } + + /// @inheritdoc IPool + function resetIsolationModeTotalDebt( + address asset + ) external virtual override onlyPoolConfigurator { + PoolLogic.executeResetIsolationModeTotalDebt(_reserves, asset); + } + + /// @inheritdoc IPool + function getLiquidationGracePeriod(address asset) external virtual override returns (uint40) { + return _reserves[asset].liquidationGracePeriodUntil; + } + + /// @inheritdoc IPool + function setLiquidationGracePeriod( + address asset, + uint40 until + ) external virtual override onlyPoolConfigurator { + require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + PoolLogic.executeSetLiquidationGracePeriod(_reserves, asset, until); + } + + /// @inheritdoc IPool + function rescueTokens( + address token, + address to, + uint256 amount + ) external virtual override onlyPoolAdmin { + PoolLogic.executeRescueTokens(token, to, amount); + } + + /// @inheritdoc IPool + /// @dev Deprecated: maintained for compatibility purposes + function deposit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external virtual override { + SupplyLogic.executeSupply( + _reserves, + _reservesList, + _usersConfig[onBehalfOf], + DataTypes.ExecuteSupplyParams({ + asset: asset, + amount: amount, + onBehalfOf: onBehalfOf, + referralCode: referralCode + }) + ); + } + + /// @inheritdoc IPool + function getFlashLoanLogic() external pure returns (address) { + return address(FlashLoanLogic); + } + + /// @inheritdoc IPool + function getBorrowLogic() external pure returns (address) { + return address(BorrowLogic); + } + + /// @inheritdoc IPool + function getBridgeLogic() external pure returns (address) { + return address(BridgeLogic); + } + + /// @inheritdoc IPool + function getEModeLogic() external pure returns (address) { + return address(EModeLogic); + } + + /// @inheritdoc IPool + function getLiquidationLogic() external pure returns (address) { + return address(LiquidationLogic); + } + + /// @inheritdoc IPool + function getPoolLogic() external pure returns (address) { + return address(PoolLogic); + } + + /// @inheritdoc IPool + function getSupplyLogic() external pure returns (address) { + return address(SupplyLogic); + } +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/PoolStorage.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/PoolStorage.sol new file mode 100644 index 00000000..719461e4 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/PoolStorage.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {UserConfiguration} from '../libraries/configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; +import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; +import {DataTypes} from '../libraries/types/DataTypes.sol'; + +/** + * @title PoolStorage + * @author Aave + * @notice Contract used as storage of the Pool contract. + * @dev It defines the storage layout of the Pool contract. + */ +contract PoolStorage { + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + // Map of reserves and their data (underlyingAssetOfReserve => reserveData) + mapping(address => DataTypes.ReserveData) internal _reserves; + + // Map of users address and their configuration data (userAddress => userConfiguration) + mapping(address => DataTypes.UserConfigurationMap) internal _usersConfig; + + // List of reserves as a map (reserveId => reserve). + // It is structured as a mapping for gas savings reasons, using the reserve id as index + mapping(uint256 => address) internal _reservesList; + + // List of eMode categories as a map (eModeCategoryId => eModeCategory). + // It is structured as a mapping for gas savings reasons, using the eModeCategoryId as index + mapping(uint8 => DataTypes.EModeCategory) internal _eModeCategories; + + // Map of users address and their eMode category (userAddress => eModeCategoryId) + mapping(address => uint8) internal _usersEModeCategory; + + // Fee of the protocol bridge, expressed in bps + uint256 internal _bridgeProtocolFee; + + // Total FlashLoan Premium, expressed in bps + uint128 internal _flashLoanPremiumTotal; + + // FlashLoan premium paid to protocol treasury, expressed in bps + uint128 internal _flashLoanPremiumToProtocol; + + // DEPRECATED on v3.2.0 + uint64 internal __DEPRECATED_maxStableRateBorrowSizePercent; + + // Maximum number of active reserves there have been in the protocol. It is the upper bound of the reserves list + uint16 internal _reservesCount; +} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC.sol b/downloads/LINEA/LIQUIDATION_LOGIC.sol new file mode 100644 index 00000000..00aebcf4 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC.sol @@ -0,0 +1,6038 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} + +// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol + +/** + * @title LiquidationLogic library + * @author Aave + * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations + */ +library LiquidationLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Default percentage of borrower's debt to be repaid in a liquidation. + * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 0.5e4 results in 50.00% + */ + uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; + + /** + * @dev Maximum percentage of borrower's debt to be repaid in a liquidation + * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 1e4 results in 100.00% + */ + uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; + + /** + * @dev This constant represents below which health factor value it is possible to liquidate + * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. + * A value of 0.95e18 results in 0.95 + */ + uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; + + struct LiquidationCallLocalVars { + uint256 userCollateralBalance; + uint256 userTotalDebt; + uint256 actualDebtToLiquidate; + uint256 actualCollateralToLiquidate; + uint256 liquidationBonus; + uint256 healthFactor; + uint256 liquidationProtocolFeeAmount; + IAToken collateralAToken; + DataTypes.ReserveCache debtReserveCache; + } + + /** + * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) + * covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportional amount of the `collateralAsset` plus a bonus to cover market risk + * @dev Emits the `LiquidationCall()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params The additional parameters needed to execute the liquidation function + */ + function executeLiquidationCall( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ExecuteLiquidationCallParams memory params + ) external { + LiquidationCallLocalVars memory vars; + + DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; + DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; + DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; + vars.debtReserveCache = debtReserve.cache(); + debtReserve.updateState(vars.debtReserveCache); + + (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: params.reservesCount, + user: params.user, + oracle: params.priceOracle, + userEModeCategory: params.userEModeCategory + }) + ); + + (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( + vars.debtReserveCache, + params, + vars.healthFactor + ); + + ValidationLogic.validateLiquidationCall( + userConfig, + collateralReserve, + debtReserve, + DataTypes.ValidateLiquidationCallParams({ + debtReserveCache: vars.debtReserveCache, + totalDebt: vars.userTotalDebt, + healthFactor: vars.healthFactor, + priceOracleSentinel: params.priceOracleSentinel + }) + ); + + vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); + if ( + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + collateralReserve.id + ) + ) { + vars.liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; + } else { + vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); + } + + vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); + + ( + vars.actualCollateralToLiquidate, + vars.actualDebtToLiquidate, + vars.liquidationProtocolFeeAmount + ) = _calculateAvailableCollateralToLiquidate( + collateralReserve, + vars.debtReserveCache, + params.collateralAsset, + params.debtAsset, + vars.actualDebtToLiquidate, + vars.userCollateralBalance, + vars.liquidationBonus, + IPriceOracleGetter(params.priceOracle) + ); + + if (vars.userTotalDebt == vars.actualDebtToLiquidate) { + userConfig.setBorrowing(debtReserve.id, false); + } + + // If the collateral being liquidated is equal to the user balance, + // we set the currency as not being used as collateral anymore + if ( + vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == + vars.userCollateralBalance + ) { + userConfig.setUsingAsCollateral(collateralReserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); + } + + _burnDebtTokens(params, vars); + + debtReserve.updateInterestRatesAndVirtualBalance( + vars.debtReserveCache, + params.debtAsset, + vars.actualDebtToLiquidate, + 0 + ); + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + vars.debtReserveCache, + vars.actualDebtToLiquidate + ); + + if (params.receiveAToken) { + _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); + } else { + _burnCollateralATokens(collateralReserve, params, vars); + } + + // Transfer fee to treasury if it is non-zero + if (vars.liquidationProtocolFeeAmount != 0) { + uint256 liquidityIndex = collateralReserve.getNormalizedIncome(); + uint256 scaledDownLiquidationProtocolFee = vars.liquidationProtocolFeeAmount.rayDiv( + liquidityIndex + ); + uint256 scaledDownUserBalance = vars.collateralAToken.scaledBalanceOf(params.user); + // To avoid trying to send more aTokens than available on balance, due to 1 wei imprecision + if (scaledDownLiquidationProtocolFee > scaledDownUserBalance) { + vars.liquidationProtocolFeeAmount = scaledDownUserBalance.rayMul(liquidityIndex); + } + vars.collateralAToken.transferOnLiquidation( + params.user, + vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), + vars.liquidationProtocolFeeAmount + ); + } + + // Transfers the debt asset being repaid to the aToken, where the liquidity is kept + IERC20(params.debtAsset).safeTransferFrom( + msg.sender, + vars.debtReserveCache.aTokenAddress, + vars.actualDebtToLiquidate + ); + + IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.user, + vars.actualDebtToLiquidate + ); + + emit LiquidationCall( + params.collateralAsset, + params.debtAsset, + params.user, + vars.actualDebtToLiquidate, + vars.actualCollateralToLiquidate, + msg.sender, + params.receiveAToken + ); + } + + /** + * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. + * @dev The function also updates the state and the interest rate of the collateral reserve. + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _burnCollateralATokens( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); + collateralReserve.updateState(collateralReserveCache); + collateralReserve.updateInterestRatesAndVirtualBalance( + collateralReserveCache, + params.collateralAsset, + 0, + vars.actualCollateralToLiquidate + ); + + // Burn the equivalent amount of aToken, sending the underlying to the liquidator + vars.collateralAToken.burn( + params.user, + msg.sender, + vars.actualCollateralToLiquidate, + collateralReserveCache.nextLiquidityIndex + ); + } + + /** + * @notice Liquidates the user aTokens by transferring them to the liquidator. + * @dev The function also checks the state of the liquidator and activates the aToken as collateral + * as in standard transfers if the isolation mode constraints are respected. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _liquidateATokens( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); + vars.collateralAToken.transferOnLiquidation( + params.user, + msg.sender, + vars.actualCollateralToLiquidate + ); + + if (liquidatorPreviousATokenBalance == 0) { + DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + liquidatorConfig, + collateralReserve.configuration, + collateralReserve.aTokenAddress + ) + ) { + liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); + } + } + } + + /** + * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. + * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. + * @param params The additional parameters needed to execute the liquidation function + * @param vars the executeLiquidationCall() function local vars + */ + function _burnDebtTokens( + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( + vars.debtReserveCache.variableDebtTokenAddress + ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); + } + + /** + * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor + * and corresponding close factor. + * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR + * @param debtReserveCache The reserve cache data object of the debt reserve + * @param params The additional parameters needed to execute the liquidation function + * @param healthFactor The health factor of the position + * @return The total debt of the user + * @return The actual debt to liquidate as a function of the closeFactor + */ + function _calculateDebt( + DataTypes.ReserveCache memory debtReserveCache, + DataTypes.ExecuteLiquidationCallParams memory params, + uint256 healthFactor + ) internal view returns (uint256, uint256) { + uint256 userVariableDebt = IERC20(debtReserveCache.variableDebtTokenAddress).balanceOf( + params.user + ); + + uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD + ? DEFAULT_LIQUIDATION_CLOSE_FACTOR + : MAX_LIQUIDATION_CLOSE_FACTOR; + + uint256 maxLiquidatableDebt = userVariableDebt.percentMul(closeFactor); + + uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt + ? maxLiquidatableDebt + : params.debtToCover; + + return (userVariableDebt, actualDebtToLiquidate); + } + + struct AvailableCollateralToLiquidateLocalVars { + uint256 collateralPrice; + uint256 debtAssetPrice; + uint256 maxCollateralToLiquidate; + uint256 baseCollateral; + uint256 bonusCollateral; + uint256 debtAssetDecimals; + uint256 collateralDecimals; + uint256 collateralAssetUnit; + uint256 debtAssetUnit; + uint256 collateralAmount; + uint256 debtAmountNeeded; + uint256 liquidationProtocolFeePercentage; + uint256 liquidationProtocolFee; + } + + /** + * @notice Calculates how much of a specific collateral can be liquidated, given + * a certain amount of debt asset. + * @dev This function needs to be called after all the checks to validate the liquidation have been performed, + * otherwise it might fail. + * @param collateralReserve The data of the collateral reserve + * @param debtReserveCache The cached data of the debt reserve + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated + * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation + * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) + * @return The amount to repay with the liquidation + * @return The fee taken from the liquidation bonus amount to be paid to the protocol + */ + function _calculateAvailableCollateralToLiquidate( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveCache memory debtReserveCache, + address collateralAsset, + address debtAsset, + uint256 debtToCover, + uint256 userCollateralBalance, + uint256 liquidationBonus, + IPriceOracleGetter oracle + ) internal view returns (uint256, uint256, uint256) { + AvailableCollateralToLiquidateLocalVars memory vars; + + vars.collateralPrice = oracle.getAssetPrice(collateralAsset); + vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); + + vars.collateralDecimals = collateralReserve.configuration.getDecimals(); + vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); + + unchecked { + vars.collateralAssetUnit = 10 ** vars.collateralDecimals; + vars.debtAssetUnit = 10 ** vars.debtAssetDecimals; + } + + vars.liquidationProtocolFeePercentage = collateralReserve + .configuration + .getLiquidationProtocolFee(); + + // This is the base collateral to liquidate based on the given debt to cover + vars.baseCollateral = + ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / + (vars.collateralPrice * vars.debtAssetUnit); + + vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); + + if (vars.maxCollateralToLiquidate > userCollateralBalance) { + vars.collateralAmount = userCollateralBalance; + vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / + (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); + } else { + vars.collateralAmount = vars.maxCollateralToLiquidate; + vars.debtAmountNeeded = debtToCover; + } + + if (vars.liquidationProtocolFeePercentage != 0) { + vars.bonusCollateral = + vars.collateralAmount - + vars.collateralAmount.percentDiv(liquidationBonus); + + vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( + vars.liquidationProtocolFeePercentage + ); + + return ( + vars.collateralAmount - vars.liquidationProtocolFee, + vars.debtAmountNeeded, + vars.liquidationProtocolFee + ); + } else { + return (vars.collateralAmount, vars.debtAmountNeeded, 0); + } + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..e7ba8f7a --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..647fc7e7 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..cd5b83c6 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol new file mode 100644 index 00000000..473840ea --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title IsolationModeLogic library + * @author Aave + * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode + */ +library IsolationModeLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using SafeCast for uint256; + + // See `IPool` for descriptions + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping + * @param reserveCache The cached data of the reserve + * @param repayAmount The amount being repaid + */ + function updateIsolatedDebtIfIsolated( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveCache memory reserveCache, + uint256 repayAmount + ) internal { + (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig + .getIsolationModeState(reservesData, reservesList); + + if (isolationModeActive) { + uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt; + + uint128 isolatedDebtRepaid = (repayAmount / + 10 ** + (reserveCache.reserveConfiguration.getDecimals() - + ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); + + // since the debt ceiling does not take into account the interest accrued, it might happen that amount + // repaid > debt in isolation mode + if (isolationModeTotalDebt <= isolatedDebtRepaid) { + reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); + } else { + uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] + .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; + emit IsolationModeTotalDebtUpdated( + isolationModeCollateralAddress, + nextIsolationModeTotalDebt + ); + } + } + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol new file mode 100644 index 00000000..8f4c35f6 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -0,0 +1,460 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts//IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {PercentageMath} from '../../libraries/math/PercentageMath.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {DataTypes} from '../../libraries/types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {IsolationModeLogic} from './IsolationModeLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; +import {UserConfiguration} from '../../libraries/configuration/UserConfiguration.sol'; +import {ReserveConfiguration} from '../../libraries/configuration/ReserveConfiguration.sol'; +import {EModeConfiguration} from '../../libraries/configuration/EModeConfiguration.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; + +/** + * @title LiquidationLogic library + * @author Aave + * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations + */ +library LiquidationLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using GPv2SafeERC20 for IERC20; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Default percentage of borrower's debt to be repaid in a liquidation. + * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 0.5e4 results in 50.00% + */ + uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; + + /** + * @dev Maximum percentage of borrower's debt to be repaid in a liquidation + * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` + * Expressed in bps, a value of 1e4 results in 100.00% + */ + uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; + + /** + * @dev This constant represents below which health factor value it is possible to liquidate + * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. + * A value of 0.95e18 results in 0.95 + */ + uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; + + struct LiquidationCallLocalVars { + uint256 userCollateralBalance; + uint256 userTotalDebt; + uint256 actualDebtToLiquidate; + uint256 actualCollateralToLiquidate; + uint256 liquidationBonus; + uint256 healthFactor; + uint256 liquidationProtocolFeeAmount; + IAToken collateralAToken; + DataTypes.ReserveCache debtReserveCache; + } + + /** + * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) + * covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportional amount of the `collateralAsset` plus a bonus to cover market risk + * @dev Emits the `LiquidationCall()` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params The additional parameters needed to execute the liquidation function + */ + function executeLiquidationCall( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ExecuteLiquidationCallParams memory params + ) external { + LiquidationCallLocalVars memory vars; + + DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; + DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; + DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; + vars.debtReserveCache = debtReserve.cache(); + debtReserve.updateState(vars.debtReserveCache); + + (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: params.reservesCount, + user: params.user, + oracle: params.priceOracle, + userEModeCategory: params.userEModeCategory + }) + ); + + (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( + vars.debtReserveCache, + params, + vars.healthFactor + ); + + ValidationLogic.validateLiquidationCall( + userConfig, + collateralReserve, + debtReserve, + DataTypes.ValidateLiquidationCallParams({ + debtReserveCache: vars.debtReserveCache, + totalDebt: vars.userTotalDebt, + healthFactor: vars.healthFactor, + priceOracleSentinel: params.priceOracleSentinel + }) + ); + + vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); + if ( + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + collateralReserve.id + ) + ) { + vars.liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; + } else { + vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); + } + + vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); + + ( + vars.actualCollateralToLiquidate, + vars.actualDebtToLiquidate, + vars.liquidationProtocolFeeAmount + ) = _calculateAvailableCollateralToLiquidate( + collateralReserve, + vars.debtReserveCache, + params.collateralAsset, + params.debtAsset, + vars.actualDebtToLiquidate, + vars.userCollateralBalance, + vars.liquidationBonus, + IPriceOracleGetter(params.priceOracle) + ); + + if (vars.userTotalDebt == vars.actualDebtToLiquidate) { + userConfig.setBorrowing(debtReserve.id, false); + } + + // If the collateral being liquidated is equal to the user balance, + // we set the currency as not being used as collateral anymore + if ( + vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == + vars.userCollateralBalance + ) { + userConfig.setUsingAsCollateral(collateralReserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); + } + + _burnDebtTokens(params, vars); + + debtReserve.updateInterestRatesAndVirtualBalance( + vars.debtReserveCache, + params.debtAsset, + vars.actualDebtToLiquidate, + 0 + ); + + IsolationModeLogic.updateIsolatedDebtIfIsolated( + reservesData, + reservesList, + userConfig, + vars.debtReserveCache, + vars.actualDebtToLiquidate + ); + + if (params.receiveAToken) { + _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); + } else { + _burnCollateralATokens(collateralReserve, params, vars); + } + + // Transfer fee to treasury if it is non-zero + if (vars.liquidationProtocolFeeAmount != 0) { + uint256 liquidityIndex = collateralReserve.getNormalizedIncome(); + uint256 scaledDownLiquidationProtocolFee = vars.liquidationProtocolFeeAmount.rayDiv( + liquidityIndex + ); + uint256 scaledDownUserBalance = vars.collateralAToken.scaledBalanceOf(params.user); + // To avoid trying to send more aTokens than available on balance, due to 1 wei imprecision + if (scaledDownLiquidationProtocolFee > scaledDownUserBalance) { + vars.liquidationProtocolFeeAmount = scaledDownUserBalance.rayMul(liquidityIndex); + } + vars.collateralAToken.transferOnLiquidation( + params.user, + vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), + vars.liquidationProtocolFeeAmount + ); + } + + // Transfers the debt asset being repaid to the aToken, where the liquidity is kept + IERC20(params.debtAsset).safeTransferFrom( + msg.sender, + vars.debtReserveCache.aTokenAddress, + vars.actualDebtToLiquidate + ); + + IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( + msg.sender, + params.user, + vars.actualDebtToLiquidate + ); + + emit LiquidationCall( + params.collateralAsset, + params.debtAsset, + params.user, + vars.actualDebtToLiquidate, + vars.actualCollateralToLiquidate, + msg.sender, + params.receiveAToken + ); + } + + /** + * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. + * @dev The function also updates the state and the interest rate of the collateral reserve. + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _burnCollateralATokens( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); + collateralReserve.updateState(collateralReserveCache); + collateralReserve.updateInterestRatesAndVirtualBalance( + collateralReserveCache, + params.collateralAsset, + 0, + vars.actualCollateralToLiquidate + ); + + // Burn the equivalent amount of aToken, sending the underlying to the liquidator + vars.collateralAToken.burn( + params.user, + msg.sender, + vars.actualCollateralToLiquidate, + collateralReserveCache.nextLiquidityIndex + ); + } + + /** + * @notice Liquidates the user aTokens by transferring them to the liquidator. + * @dev The function also checks the state of the liquidator and activates the aToken as collateral + * as in standard transfers if the isolation mode constraints are respected. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param collateralReserve The data of the collateral reserve + * @param params The additional parameters needed to execute the liquidation function + * @param vars The executeLiquidationCall() function local vars + */ + function _liquidateATokens( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); + vars.collateralAToken.transferOnLiquidation( + params.user, + msg.sender, + vars.actualCollateralToLiquidate + ); + + if (liquidatorPreviousATokenBalance == 0) { + DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + liquidatorConfig, + collateralReserve.configuration, + collateralReserve.aTokenAddress + ) + ) { + liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); + } + } + } + + /** + * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. + * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. + * @param params The additional parameters needed to execute the liquidation function + * @param vars the executeLiquidationCall() function local vars + */ + function _burnDebtTokens( + DataTypes.ExecuteLiquidationCallParams memory params, + LiquidationCallLocalVars memory vars + ) internal { + vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( + vars.debtReserveCache.variableDebtTokenAddress + ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); + } + + /** + * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor + * and corresponding close factor. + * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR + * @param debtReserveCache The reserve cache data object of the debt reserve + * @param params The additional parameters needed to execute the liquidation function + * @param healthFactor The health factor of the position + * @return The total debt of the user + * @return The actual debt to liquidate as a function of the closeFactor + */ + function _calculateDebt( + DataTypes.ReserveCache memory debtReserveCache, + DataTypes.ExecuteLiquidationCallParams memory params, + uint256 healthFactor + ) internal view returns (uint256, uint256) { + uint256 userVariableDebt = IERC20(debtReserveCache.variableDebtTokenAddress).balanceOf( + params.user + ); + + uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD + ? DEFAULT_LIQUIDATION_CLOSE_FACTOR + : MAX_LIQUIDATION_CLOSE_FACTOR; + + uint256 maxLiquidatableDebt = userVariableDebt.percentMul(closeFactor); + + uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt + ? maxLiquidatableDebt + : params.debtToCover; + + return (userVariableDebt, actualDebtToLiquidate); + } + + struct AvailableCollateralToLiquidateLocalVars { + uint256 collateralPrice; + uint256 debtAssetPrice; + uint256 maxCollateralToLiquidate; + uint256 baseCollateral; + uint256 bonusCollateral; + uint256 debtAssetDecimals; + uint256 collateralDecimals; + uint256 collateralAssetUnit; + uint256 debtAssetUnit; + uint256 collateralAmount; + uint256 debtAmountNeeded; + uint256 liquidationProtocolFeePercentage; + uint256 liquidationProtocolFee; + } + + /** + * @notice Calculates how much of a specific collateral can be liquidated, given + * a certain amount of debt asset. + * @dev This function needs to be called after all the checks to validate the liquidation have been performed, + * otherwise it might fail. + * @param collateralReserve The data of the collateral reserve + * @param debtReserveCache The cached data of the debt reserve + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated + * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation + * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) + * @return The amount to repay with the liquidation + * @return The fee taken from the liquidation bonus amount to be paid to the protocol + */ + function _calculateAvailableCollateralToLiquidate( + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveCache memory debtReserveCache, + address collateralAsset, + address debtAsset, + uint256 debtToCover, + uint256 userCollateralBalance, + uint256 liquidationBonus, + IPriceOracleGetter oracle + ) internal view returns (uint256, uint256, uint256) { + AvailableCollateralToLiquidateLocalVars memory vars; + + vars.collateralPrice = oracle.getAssetPrice(collateralAsset); + vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); + + vars.collateralDecimals = collateralReserve.configuration.getDecimals(); + vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); + + unchecked { + vars.collateralAssetUnit = 10 ** vars.collateralDecimals; + vars.debtAssetUnit = 10 ** vars.debtAssetDecimals; + } + + vars.liquidationProtocolFeePercentage = collateralReserve + .configuration + .getLiquidationProtocolFee(); + + // This is the base collateral to liquidate based on the given debt to cover + vars.baseCollateral = + ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / + (vars.collateralPrice * vars.debtAssetUnit); + + vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); + + if (vars.maxCollateralToLiquidate > userCollateralBalance) { + vars.collateralAmount = userCollateralBalance; + vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / + (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); + } else { + vars.collateralAmount = vars.maxCollateralToLiquidate; + vars.debtAmountNeeded = debtToCover; + } + + if (vars.liquidationProtocolFeePercentage != 0) { + vars.bonusCollateral = + vars.collateralAmount - + vars.collateralAmount.percentDiv(liquidationBonus); + + vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( + vars.liquidationProtocolFeePercentage + ); + + return ( + vars.collateralAmount - vars.liquidationProtocolFee, + vars.debtAmountNeeded, + vars.liquidationProtocolFee + ); + } else { + return (vars.collateralAmount, vars.debtAmountNeeded, 0); + } + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..dd5c637d --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..e08a30e8 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,642 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..9adca939 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/LINEA/ORACLE.sol b/downloads/LINEA/ORACLE.sol new file mode 100644 index 00000000..9828b589 --- /dev/null +++ b/downloads/LINEA/ORACLE.sol @@ -0,0 +1,762 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/ORACLE/AaveOracle/src/contracts/dependencies/chainlink/AggregatorInterface.sol + +// Chainlink Contracts v0.8 + +interface AggregatorInterface { + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt); + + event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); +} + +// downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/LINEA/ORACLE/AaveOracle/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IAaveOracle.sol + +/** + * @title IAaveOracle + * @author Aave + * @notice Defines the basic interface for the Aave Oracle + */ +interface IAaveOracle is IPriceOracleGetter { + /** + * @dev Emitted after the base currency is set + * @param baseCurrency The base currency of used for price quotes + * @param baseCurrencyUnit The unit of the base currency + */ + event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); + + /** + * @dev Emitted after the price source of an asset is updated + * @param asset The address of the asset + * @param source The price source of the asset + */ + event AssetSourceUpdated(address indexed asset, address indexed source); + + /** + * @dev Emitted after the address of fallback oracle is updated + * @param fallbackOracle The address of the fallback oracle + */ + event FallbackOracleUpdated(address indexed fallbackOracle); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Sets or replaces price sources of assets + * @param assets The addresses of the assets + * @param sources The addresses of the price sources + */ + function setAssetSources(address[] calldata assets, address[] calldata sources) external; + + /** + * @notice Sets the fallback oracle + * @param fallbackOracle The address of the fallback oracle + */ + function setFallbackOracle(address fallbackOracle) external; + + /** + * @notice Returns a list of prices from a list of assets addresses + * @param assets The list of assets addresses + * @return The prices of the given assets + */ + function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); + + /** + * @notice Returns the address of the source for an asset address + * @param asset The address of the asset + * @return The address of the source + */ + function getSourceOfAsset(address asset) external view returns (address); + + /** + * @notice Returns the address of the fallback oracle + * @return The address of the fallback oracle + */ + function getFallbackOracle() external view returns (address); +} + +// downloads/LINEA/ORACLE/AaveOracle/src/contracts/misc/AaveOracle.sol + +/** + * @title AaveOracle + * @author Aave + * @notice Contract to get asset prices, manage price sources and update the fallback oracle + * - Use of Chainlink Aggregators as first source of price + * - If the returned price by a Chainlink aggregator is <= 0, the call is forwarded to a fallback oracle + * - Owned by the Aave governance + */ +contract AaveOracle is IAaveOracle { + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + // Map of asset price sources (asset => priceSource) + mapping(address => AggregatorInterface) private assetsSources; + + IPriceOracleGetter private _fallbackOracle; + address public immutable override BASE_CURRENCY; + uint256 public immutable override BASE_CURRENCY_UNIT; + + /** + * @dev Only asset listing or pool admin can call functions marked by this modifier. + */ + modifier onlyAssetListingOrPoolAdmins() { + _onlyAssetListingOrPoolAdmins(); + _; + } + + /** + * @notice Constructor + * @param provider The address of the new PoolAddressesProvider + * @param assets The addresses of the assets + * @param sources The address of the source of each asset + * @param fallbackOracle The address of the fallback oracle to use if the data of an + * aggregator is not consistent + * @param baseCurrency The base currency used for the price quotes. If USD is used, base currency is 0x0 + * @param baseCurrencyUnit The unit of the base currency + */ + constructor( + IPoolAddressesProvider provider, + address[] memory assets, + address[] memory sources, + address fallbackOracle, + address baseCurrency, + uint256 baseCurrencyUnit + ) { + ADDRESSES_PROVIDER = provider; + _setFallbackOracle(fallbackOracle); + _setAssetsSources(assets, sources); + BASE_CURRENCY = baseCurrency; + BASE_CURRENCY_UNIT = baseCurrencyUnit; + emit BaseCurrencySet(baseCurrency, baseCurrencyUnit); + } + + /// @inheritdoc IAaveOracle + function setAssetSources( + address[] calldata assets, + address[] calldata sources + ) external override onlyAssetListingOrPoolAdmins { + _setAssetsSources(assets, sources); + } + + /// @inheritdoc IAaveOracle + function setFallbackOracle( + address fallbackOracle + ) external override onlyAssetListingOrPoolAdmins { + _setFallbackOracle(fallbackOracle); + } + + /** + * @notice Internal function to set the sources for each asset + * @param assets The addresses of the assets + * @param sources The address of the source of each asset + */ + function _setAssetsSources(address[] memory assets, address[] memory sources) internal { + require(assets.length == sources.length, Errors.INCONSISTENT_PARAMS_LENGTH); + for (uint256 i = 0; i < assets.length; i++) { + assetsSources[assets[i]] = AggregatorInterface(sources[i]); + emit AssetSourceUpdated(assets[i], sources[i]); + } + } + + /** + * @notice Internal function to set the fallback oracle + * @param fallbackOracle The address of the fallback oracle + */ + function _setFallbackOracle(address fallbackOracle) internal { + _fallbackOracle = IPriceOracleGetter(fallbackOracle); + emit FallbackOracleUpdated(fallbackOracle); + } + + /// @inheritdoc IPriceOracleGetter + function getAssetPrice(address asset) public view override returns (uint256) { + AggregatorInterface source = assetsSources[asset]; + + if (asset == BASE_CURRENCY) { + return BASE_CURRENCY_UNIT; + } else if (address(source) == address(0)) { + return _fallbackOracle.getAssetPrice(asset); + } else { + int256 price = source.latestAnswer(); + if (price > 0) { + return uint256(price); + } else { + return _fallbackOracle.getAssetPrice(asset); + } + } + } + + /// @inheritdoc IAaveOracle + function getAssetsPrices( + address[] calldata assets + ) external view override returns (uint256[] memory) { + uint256[] memory prices = new uint256[](assets.length); + for (uint256 i = 0; i < assets.length; i++) { + prices[i] = getAssetPrice(assets[i]); + } + return prices; + } + + /// @inheritdoc IAaveOracle + function getSourceOfAsset(address asset) external view override returns (address) { + return address(assetsSources[asset]); + } + + /// @inheritdoc IAaveOracle + function getFallbackOracle() external view returns (address) { + return address(_fallbackOracle); + } + + function _onlyAssetListingOrPoolAdmins() internal view { + IACLManager aclManager = IACLManager(ADDRESSES_PROVIDER.getACLManager()); + require( + aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), + Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN + ); + } +} diff --git a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/dependencies/chainlink/AggregatorInterface.sol b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/dependencies/chainlink/AggregatorInterface.sol new file mode 100644 index 00000000..496151aa --- /dev/null +++ b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/dependencies/chainlink/AggregatorInterface.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +// Chainlink Contracts v0.8 +pragma solidity ^0.8.0; + +interface AggregatorInterface { + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt); + + event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); +} diff --git a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IAaveOracle.sol b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IAaveOracle.sol new file mode 100644 index 00000000..265d2560 --- /dev/null +++ b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IAaveOracle.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPriceOracleGetter} from './IPriceOracleGetter.sol'; +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IAaveOracle + * @author Aave + * @notice Defines the basic interface for the Aave Oracle + */ +interface IAaveOracle is IPriceOracleGetter { + /** + * @dev Emitted after the base currency is set + * @param baseCurrency The base currency of used for price quotes + * @param baseCurrencyUnit The unit of the base currency + */ + event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); + + /** + * @dev Emitted after the price source of an asset is updated + * @param asset The address of the asset + * @param source The price source of the asset + */ + event AssetSourceUpdated(address indexed asset, address indexed source); + + /** + * @dev Emitted after the address of fallback oracle is updated + * @param fallbackOracle The address of the fallback oracle + */ + event FallbackOracleUpdated(address indexed fallbackOracle); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Sets or replaces price sources of assets + * @param assets The addresses of the assets + * @param sources The addresses of the price sources + */ + function setAssetSources(address[] calldata assets, address[] calldata sources) external; + + /** + * @notice Sets the fallback oracle + * @param fallbackOracle The address of the fallback oracle + */ + function setFallbackOracle(address fallbackOracle) external; + + /** + * @notice Returns a list of prices from a list of assets addresses + * @param assets The list of assets addresses + * @return The prices of the given assets + */ + function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); + + /** + * @notice Returns the address of the source for an asset address + * @param asset The address of the asset + * @return The address of the source + */ + function getSourceOfAsset(address asset) external view returns (address); + + /** + * @notice Returns the address of the fallback oracle + * @return The address of the fallback oracle + */ + function getFallbackOracle() external view returns (address); +} diff --git a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/misc/AaveOracle.sol b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/misc/AaveOracle.sol new file mode 100644 index 00000000..04364e0f --- /dev/null +++ b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/misc/AaveOracle.sol @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {AggregatorInterface} from '../dependencies/chainlink/AggregatorInterface.sol'; +import {Errors} from '../protocol/libraries/helpers/Errors.sol'; +import {IACLManager} from '../interfaces/IACLManager.sol'; +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {IPriceOracleGetter} from '../interfaces/IPriceOracleGetter.sol'; +import {IAaveOracle} from '../interfaces/IAaveOracle.sol'; + +/** + * @title AaveOracle + * @author Aave + * @notice Contract to get asset prices, manage price sources and update the fallback oracle + * - Use of Chainlink Aggregators as first source of price + * - If the returned price by a Chainlink aggregator is <= 0, the call is forwarded to a fallback oracle + * - Owned by the Aave governance + */ +contract AaveOracle is IAaveOracle { + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + // Map of asset price sources (asset => priceSource) + mapping(address => AggregatorInterface) private assetsSources; + + IPriceOracleGetter private _fallbackOracle; + address public immutable override BASE_CURRENCY; + uint256 public immutable override BASE_CURRENCY_UNIT; + + /** + * @dev Only asset listing or pool admin can call functions marked by this modifier. + */ + modifier onlyAssetListingOrPoolAdmins() { + _onlyAssetListingOrPoolAdmins(); + _; + } + + /** + * @notice Constructor + * @param provider The address of the new PoolAddressesProvider + * @param assets The addresses of the assets + * @param sources The address of the source of each asset + * @param fallbackOracle The address of the fallback oracle to use if the data of an + * aggregator is not consistent + * @param baseCurrency The base currency used for the price quotes. If USD is used, base currency is 0x0 + * @param baseCurrencyUnit The unit of the base currency + */ + constructor( + IPoolAddressesProvider provider, + address[] memory assets, + address[] memory sources, + address fallbackOracle, + address baseCurrency, + uint256 baseCurrencyUnit + ) { + ADDRESSES_PROVIDER = provider; + _setFallbackOracle(fallbackOracle); + _setAssetsSources(assets, sources); + BASE_CURRENCY = baseCurrency; + BASE_CURRENCY_UNIT = baseCurrencyUnit; + emit BaseCurrencySet(baseCurrency, baseCurrencyUnit); + } + + /// @inheritdoc IAaveOracle + function setAssetSources( + address[] calldata assets, + address[] calldata sources + ) external override onlyAssetListingOrPoolAdmins { + _setAssetsSources(assets, sources); + } + + /// @inheritdoc IAaveOracle + function setFallbackOracle( + address fallbackOracle + ) external override onlyAssetListingOrPoolAdmins { + _setFallbackOracle(fallbackOracle); + } + + /** + * @notice Internal function to set the sources for each asset + * @param assets The addresses of the assets + * @param sources The address of the source of each asset + */ + function _setAssetsSources(address[] memory assets, address[] memory sources) internal { + require(assets.length == sources.length, Errors.INCONSISTENT_PARAMS_LENGTH); + for (uint256 i = 0; i < assets.length; i++) { + assetsSources[assets[i]] = AggregatorInterface(sources[i]); + emit AssetSourceUpdated(assets[i], sources[i]); + } + } + + /** + * @notice Internal function to set the fallback oracle + * @param fallbackOracle The address of the fallback oracle + */ + function _setFallbackOracle(address fallbackOracle) internal { + _fallbackOracle = IPriceOracleGetter(fallbackOracle); + emit FallbackOracleUpdated(fallbackOracle); + } + + /// @inheritdoc IPriceOracleGetter + function getAssetPrice(address asset) public view override returns (uint256) { + AggregatorInterface source = assetsSources[asset]; + + if (asset == BASE_CURRENCY) { + return BASE_CURRENCY_UNIT; + } else if (address(source) == address(0)) { + return _fallbackOracle.getAssetPrice(asset); + } else { + int256 price = source.latestAnswer(); + if (price > 0) { + return uint256(price); + } else { + return _fallbackOracle.getAssetPrice(asset); + } + } + } + + /// @inheritdoc IAaveOracle + function getAssetsPrices( + address[] calldata assets + ) external view override returns (uint256[] memory) { + uint256[] memory prices = new uint256[](assets.length); + for (uint256 i = 0; i < assets.length; i++) { + prices[i] = getAssetPrice(assets[i]); + } + return prices; + } + + /// @inheritdoc IAaveOracle + function getSourceOfAsset(address asset) external view override returns (address) { + return address(assetsSources[asset]); + } + + /// @inheritdoc IAaveOracle + function getFallbackOracle() external view returns (address) { + return address(_fallbackOracle); + } + + function _onlyAssetListingOrPoolAdmins() internal view { + IACLManager aclManager = IACLManager(ADDRESSES_PROVIDER.getACLManager()); + require( + aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), + Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN + ); + } +} diff --git a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER.sol new file mode 100644 index 00000000..7a145972 --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER.sol @@ -0,0 +1,1022 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol + +/** + * @title Proxy + * @dev Implements delegation of calls to other contracts, with proper + * forwarding of return values and bubbling of failures. + * It defines a fallback function that delegates all calls to the address + * returned by the abstract _implementation() internal function. + */ +abstract contract Proxy { + /** + * @dev Fallback function. + * Will run if no other function in the contract matches the call data. + * Implemented entirely in `_fallback`. + */ + fallback() external payable { + _fallback(); + } + + /** + * @dev Fallback function that will run if call data is empty. + * IMPORTANT. receive() on implementation contracts will be unreachable + */ + receive() external payable { + _fallback(); + } + + /** + * @return The Address of the implementation. + */ + function _implementation() internal view virtual returns (address); + + /** + * @dev Delegates execution to an implementation contract. + * This is a low level function that doesn't return to its internal call site. + * It will return to the external caller whatever the implementation returns. + * @param implementation Address to delegate. + */ + function _delegate(address implementation) internal { + //solium-disable-next-line + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + /** + * @dev Function that is run as the first thing in the fallback function. + * Can be redefined in derived contracts to add functionality. + * Redefinitions must call super._willFallback(). + */ + function _willFallback() internal virtual {} + + /** + * @dev fallback implementation. + * Extracted to enable manual triggering. + */ + function _fallback() internal { + _willFallback(); + _delegate(_implementation()); + } +} + +// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} + +// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol + +/** + * @title BaseUpgradeabilityProxy + * @dev This contract implements a proxy that allows to change the + * implementation address to which it will delegate. + * Such a change is called an implementation upgrade. + */ +contract BaseUpgradeabilityProxy is Proxy { + /** + * @dev Emitted when the implementation is upgraded. + * @param implementation Address of the new implementation. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Storage slot with the address of the current implementation. + * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is + * validated in the constructor. + */ + bytes32 internal constant IMPLEMENTATION_SLOT = + 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + /** + * @dev Returns the current implementation. + * @return impl Address of the current implementation + */ + function _implementation() internal view override returns (address impl) { + bytes32 slot = IMPLEMENTATION_SLOT; + //solium-disable-next-line + assembly { + impl := sload(slot) + } + } + + /** + * @dev Upgrades the proxy to a new implementation. + * @param newImplementation Address of the new implementation. + */ + function _upgradeTo(address newImplementation) internal { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + } + + /** + * @dev Sets the implementation address of the proxy. + * @param newImplementation Address of the new implementation. + */ + function _setImplementation(address newImplementation) internal { + require( + Address.isContract(newImplementation), + 'Cannot set a proxy implementation to a non-contract address' + ); + + bytes32 slot = IMPLEMENTATION_SLOT; + + //solium-disable-next-line + assembly { + sstore(slot, newImplementation) + } + } +} + +// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol + +/** + * @title InitializableUpgradeabilityProxy + * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing + * implementation and init data. + */ +contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { + /** + * @dev Contract initializer. + * @param _logic Address of the initial implementation. + * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. + */ + function initialize(address _logic, bytes memory _data) public payable { + require(_implementation() == address(0)); + assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); + _setImplementation(_logic); + if (_data.length > 0) { + (bool success, ) = _logic.delegatecall(_data); + require(success); + } + } +} + +// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol + +/** + * @title BaseImmutableAdminUpgradeabilityProxy + * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern + * @notice This contract combines an upgradeability proxy with an authorization + * mechanism for administrative tasks. + * @dev The admin role is stored in an immutable, which helps saving transactions costs + * All external functions in this contract must be guarded by the + * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity + * feature proposal that would enable this to be done automatically. + */ +contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + address internal immutable _admin; + + /** + * @dev Constructor. + * @param admin_ The address of the admin + */ + constructor(address admin_) { + _admin = admin_; + } + + modifier ifAdmin() { + if (msg.sender == _admin) { + _; + } else { + _fallback(); + } + } + + /** + * @notice Return the admin address + * @return The address of the proxy admin. + */ + function admin() external ifAdmin returns (address) { + return _admin; + } + + /** + * @notice Return the implementation address + * @return The address of the implementation. + */ + function implementation() external ifAdmin returns (address) { + return _implementation(); + } + + /** + * @notice Upgrade the backing implementation of the proxy. + * @dev Only the admin can call this function. + * @param newImplementation The address of the new implementation. + */ + function upgradeTo(address newImplementation) external ifAdmin { + _upgradeTo(newImplementation); + } + + /** + * @notice Upgrade the backing implementation of the proxy and call a function + * on the new implementation. + * @dev This is useful to initialize the proxied contract. + * @param newImplementation The address of the new implementation. + * @param data Data to send as msg.data in the low level call. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + */ + function upgradeToAndCall( + address newImplementation, + bytes calldata data + ) external payable ifAdmin { + _upgradeTo(newImplementation); + (bool success, ) = newImplementation.delegatecall(data); + require(success); + } + + /** + * @notice Only fall back when the sender is not the admin. + */ + function _willFallback() internal virtual override { + require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); + super._willFallback(); + } +} + +// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol + +/** + * @title InitializableAdminUpgradeabilityProxy + * @author Aave + * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function + */ +contract InitializableImmutableAdminUpgradeabilityProxy is + BaseImmutableAdminUpgradeabilityProxy, + InitializableUpgradeabilityProxy +{ + /** + * @dev Constructor. + * @param admin The address of the admin + */ + constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { + // Intentionally left blank + } + + /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy + function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { + BaseImmutableAdminUpgradeabilityProxy._willFallback(); + } +} + +// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/protocol/configuration/PoolAddressesProvider.sol + +/** + * @title PoolAddressesProvider + * @author Aave + * @notice Main registry of addresses part of or connected to the protocol, including permissioned roles + * @dev Acts as factory of proxies and admin of those, so with right to change its implementations + * @dev Owned by the Aave Governance + */ +contract PoolAddressesProvider is Ownable, IPoolAddressesProvider { + // Identifier of the Aave Market + string private _marketId; + + // Map of registered addresses (identifier => registeredAddress) + mapping(bytes32 => address) private _addresses; + + // Main identifiers + bytes32 private constant POOL = 'POOL'; + bytes32 private constant POOL_CONFIGURATOR = 'POOL_CONFIGURATOR'; + bytes32 private constant PRICE_ORACLE = 'PRICE_ORACLE'; + bytes32 private constant ACL_MANAGER = 'ACL_MANAGER'; + bytes32 private constant ACL_ADMIN = 'ACL_ADMIN'; + bytes32 private constant PRICE_ORACLE_SENTINEL = 'PRICE_ORACLE_SENTINEL'; + bytes32 private constant DATA_PROVIDER = 'DATA_PROVIDER'; + + /** + * @dev Constructor. + * @param marketId The identifier of the market. + * @param owner The owner address of this contract. + */ + constructor(string memory marketId, address owner) { + _setMarketId(marketId); + transferOwnership(owner); + } + + /// @inheritdoc IPoolAddressesProvider + function getMarketId() external view override returns (string memory) { + return _marketId; + } + + /// @inheritdoc IPoolAddressesProvider + function setMarketId(string memory newMarketId) external override onlyOwner { + _setMarketId(newMarketId); + } + + /// @inheritdoc IPoolAddressesProvider + function getAddress(bytes32 id) public view override returns (address) { + return _addresses[id]; + } + + /// @inheritdoc IPoolAddressesProvider + function setAddress(bytes32 id, address newAddress) external override onlyOwner { + address oldAddress = _addresses[id]; + _addresses[id] = newAddress; + emit AddressSet(id, oldAddress, newAddress); + } + + /// @inheritdoc IPoolAddressesProvider + function setAddressAsProxy( + bytes32 id, + address newImplementationAddress + ) external override onlyOwner { + address proxyAddress = _addresses[id]; + address oldImplementationAddress = _getProxyImplementation(id); + _updateImpl(id, newImplementationAddress); + emit AddressSetAsProxy(id, proxyAddress, oldImplementationAddress, newImplementationAddress); + } + + /// @inheritdoc IPoolAddressesProvider + function getPool() external view override returns (address) { + return getAddress(POOL); + } + + /// @inheritdoc IPoolAddressesProvider + function setPoolImpl(address newPoolImpl) external override onlyOwner { + address oldPoolImpl = _getProxyImplementation(POOL); + _updateImpl(POOL, newPoolImpl); + emit PoolUpdated(oldPoolImpl, newPoolImpl); + } + + /// @inheritdoc IPoolAddressesProvider + function getPoolConfigurator() external view override returns (address) { + return getAddress(POOL_CONFIGURATOR); + } + + /// @inheritdoc IPoolAddressesProvider + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external override onlyOwner { + address oldPoolConfiguratorImpl = _getProxyImplementation(POOL_CONFIGURATOR); + _updateImpl(POOL_CONFIGURATOR, newPoolConfiguratorImpl); + emit PoolConfiguratorUpdated(oldPoolConfiguratorImpl, newPoolConfiguratorImpl); + } + + /// @inheritdoc IPoolAddressesProvider + function getPriceOracle() external view override returns (address) { + return getAddress(PRICE_ORACLE); + } + + /// @inheritdoc IPoolAddressesProvider + function setPriceOracle(address newPriceOracle) external override onlyOwner { + address oldPriceOracle = _addresses[PRICE_ORACLE]; + _addresses[PRICE_ORACLE] = newPriceOracle; + emit PriceOracleUpdated(oldPriceOracle, newPriceOracle); + } + + /// @inheritdoc IPoolAddressesProvider + function getACLManager() external view override returns (address) { + return getAddress(ACL_MANAGER); + } + + /// @inheritdoc IPoolAddressesProvider + function setACLManager(address newAclManager) external override onlyOwner { + address oldAclManager = _addresses[ACL_MANAGER]; + _addresses[ACL_MANAGER] = newAclManager; + emit ACLManagerUpdated(oldAclManager, newAclManager); + } + + /// @inheritdoc IPoolAddressesProvider + function getACLAdmin() external view override returns (address) { + return getAddress(ACL_ADMIN); + } + + /// @inheritdoc IPoolAddressesProvider + function setACLAdmin(address newAclAdmin) external override onlyOwner { + address oldAclAdmin = _addresses[ACL_ADMIN]; + _addresses[ACL_ADMIN] = newAclAdmin; + emit ACLAdminUpdated(oldAclAdmin, newAclAdmin); + } + + /// @inheritdoc IPoolAddressesProvider + function getPriceOracleSentinel() external view override returns (address) { + return getAddress(PRICE_ORACLE_SENTINEL); + } + + /// @inheritdoc IPoolAddressesProvider + function setPriceOracleSentinel(address newPriceOracleSentinel) external override onlyOwner { + address oldPriceOracleSentinel = _addresses[PRICE_ORACLE_SENTINEL]; + _addresses[PRICE_ORACLE_SENTINEL] = newPriceOracleSentinel; + emit PriceOracleSentinelUpdated(oldPriceOracleSentinel, newPriceOracleSentinel); + } + + /// @inheritdoc IPoolAddressesProvider + function getPoolDataProvider() external view override returns (address) { + return getAddress(DATA_PROVIDER); + } + + /// @inheritdoc IPoolAddressesProvider + function setPoolDataProvider(address newDataProvider) external override onlyOwner { + address oldDataProvider = _addresses[DATA_PROVIDER]; + _addresses[DATA_PROVIDER] = newDataProvider; + emit PoolDataProviderUpdated(oldDataProvider, newDataProvider); + } + + /** + * @notice Internal function to update the implementation of a specific proxied component of the protocol. + * @dev If there is no proxy registered with the given identifier, it creates the proxy setting `newAddress` + * as implementation and calls the initialize() function on the proxy + * @dev If there is already a proxy registered, it just updates the implementation to `newAddress` and + * calls the initialize() function via upgradeToAndCall() in the proxy + * @param id The id of the proxy to be updated + * @param newAddress The address of the new implementation + */ + function _updateImpl(bytes32 id, address newAddress) internal { + address proxyAddress = _addresses[id]; + InitializableImmutableAdminUpgradeabilityProxy proxy; + bytes memory params = abi.encodeWithSignature('initialize(address)', address(this)); + + if (proxyAddress == address(0)) { + proxy = new InitializableImmutableAdminUpgradeabilityProxy(address(this)); + _addresses[id] = proxyAddress = address(proxy); + proxy.initialize(newAddress, params); + emit ProxyCreated(id, proxyAddress, newAddress); + } else { + proxy = InitializableImmutableAdminUpgradeabilityProxy(payable(proxyAddress)); + proxy.upgradeToAndCall(newAddress, params); + } + } + + /** + * @notice Updates the identifier of the Aave market. + * @param newMarketId The new id of the market + */ + function _setMarketId(string memory newMarketId) internal { + string memory oldMarketId = _marketId; + _marketId = newMarketId; + emit MarketIdSet(oldMarketId, newMarketId); + } + + /** + * @notice Returns the the implementation contract of the proxy contract by its identifier. + * @dev It returns ZERO if there is no registered address with the given id + * @dev It reverts if the registered address with the given id is not `InitializableImmutableAdminUpgradeabilityProxy` + * @param id The id + * @return The address of the implementation contract + */ + function _getProxyImplementation(bytes32 id) internal returns (address) { + address proxyAddress = _addresses[id]; + if (proxyAddress == address(0)) { + return address(0); + } else { + address payable payableProxyAddress = payable(proxyAddress); + return InitializableImmutableAdminUpgradeabilityProxy(payableProxyAddress).implementation(); + } + } +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol new file mode 100644 index 00000000..7917b722 --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +import './Context.sol'; + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol new file mode 100644 index 00000000..aec817cb --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import './Proxy.sol'; +import '../contracts/Address.sol'; + +/** + * @title BaseUpgradeabilityProxy + * @dev This contract implements a proxy that allows to change the + * implementation address to which it will delegate. + * Such a change is called an implementation upgrade. + */ +contract BaseUpgradeabilityProxy is Proxy { + /** + * @dev Emitted when the implementation is upgraded. + * @param implementation Address of the new implementation. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Storage slot with the address of the current implementation. + * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is + * validated in the constructor. + */ + bytes32 internal constant IMPLEMENTATION_SLOT = + 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + /** + * @dev Returns the current implementation. + * @return impl Address of the current implementation + */ + function _implementation() internal view override returns (address impl) { + bytes32 slot = IMPLEMENTATION_SLOT; + //solium-disable-next-line + assembly { + impl := sload(slot) + } + } + + /** + * @dev Upgrades the proxy to a new implementation. + * @param newImplementation Address of the new implementation. + */ + function _upgradeTo(address newImplementation) internal { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + } + + /** + * @dev Sets the implementation address of the proxy. + * @param newImplementation Address of the new implementation. + */ + function _setImplementation(address newImplementation) internal { + require( + Address.isContract(newImplementation), + 'Cannot set a proxy implementation to a non-contract address' + ); + + bytes32 slot = IMPLEMENTATION_SLOT; + + //solium-disable-next-line + assembly { + sstore(slot, newImplementation) + } + } +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol new file mode 100644 index 00000000..4b43fa6a --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import './BaseUpgradeabilityProxy.sol'; + +/** + * @title InitializableUpgradeabilityProxy + * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing + * implementation and init data. + */ +contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { + /** + * @dev Contract initializer. + * @param _logic Address of the initial implementation. + * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. + */ + function initialize(address _logic, bytes memory _data) public payable { + require(_implementation() == address(0)); + assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); + _setImplementation(_logic); + if (_data.length > 0) { + (bool success, ) = _logic.delegatecall(_data); + require(success); + } + } +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol new file mode 100644 index 00000000..53589441 --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title Proxy + * @dev Implements delegation of calls to other contracts, with proper + * forwarding of return values and bubbling of failures. + * It defines a fallback function that delegates all calls to the address + * returned by the abstract _implementation() internal function. + */ +abstract contract Proxy { + /** + * @dev Fallback function. + * Will run if no other function in the contract matches the call data. + * Implemented entirely in `_fallback`. + */ + fallback() external payable { + _fallback(); + } + + /** + * @dev Fallback function that will run if call data is empty. + * IMPORTANT. receive() on implementation contracts will be unreachable + */ + receive() external payable { + _fallback(); + } + + /** + * @return The Address of the implementation. + */ + function _implementation() internal view virtual returns (address); + + /** + * @dev Delegates execution to an implementation contract. + * This is a low level function that doesn't return to its internal call site. + * It will return to the external caller whatever the implementation returns. + * @param implementation Address to delegate. + */ + function _delegate(address implementation) internal { + //solium-disable-next-line + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + /** + * @dev Function that is run as the first thing in the fallback function. + * Can be redefined in derived contracts to add functionality. + * Redefinitions must call super._willFallback(). + */ + function _willFallback() internal virtual {} + + /** + * @dev fallback implementation. + * Extracted to enable manual triggering. + */ + function _fallback() internal { + _willFallback(); + _delegate(_implementation()); + } +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..252b4a4b --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {BaseUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol'; + +/** + * @title BaseImmutableAdminUpgradeabilityProxy + * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern + * @notice This contract combines an upgradeability proxy with an authorization + * mechanism for administrative tasks. + * @dev The admin role is stored in an immutable, which helps saving transactions costs + * All external functions in this contract must be guarded by the + * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity + * feature proposal that would enable this to be done automatically. + */ +contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + address internal immutable _admin; + + /** + * @dev Constructor. + * @param admin_ The address of the admin + */ + constructor(address admin_) { + _admin = admin_; + } + + modifier ifAdmin() { + if (msg.sender == _admin) { + _; + } else { + _fallback(); + } + } + + /** + * @notice Return the admin address + * @return The address of the proxy admin. + */ + function admin() external ifAdmin returns (address) { + return _admin; + } + + /** + * @notice Return the implementation address + * @return The address of the implementation. + */ + function implementation() external ifAdmin returns (address) { + return _implementation(); + } + + /** + * @notice Upgrade the backing implementation of the proxy. + * @dev Only the admin can call this function. + * @param newImplementation The address of the new implementation. + */ + function upgradeTo(address newImplementation) external ifAdmin { + _upgradeTo(newImplementation); + } + + /** + * @notice Upgrade the backing implementation of the proxy and call a function + * on the new implementation. + * @dev This is useful to initialize the proxied contract. + * @param newImplementation The address of the new implementation. + * @param data Data to send as msg.data in the low level call. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + */ + function upgradeToAndCall( + address newImplementation, + bytes calldata data + ) external payable ifAdmin { + _upgradeTo(newImplementation); + (bool success, ) = newImplementation.delegatecall(data); + require(success); + } + + /** + * @notice Only fall back when the sender is not the admin. + */ + function _willFallback() internal virtual override { + require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); + super._willFallback(); + } +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..6913a19d --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {InitializableUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol'; +import {Proxy} from '../../dependencies/openzeppelin/upgradeability/Proxy.sol'; +import {BaseImmutableAdminUpgradeabilityProxy} from './BaseImmutableAdminUpgradeabilityProxy.sol'; + +/** + * @title InitializableAdminUpgradeabilityProxy + * @author Aave + * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function + */ +contract InitializableImmutableAdminUpgradeabilityProxy is + BaseImmutableAdminUpgradeabilityProxy, + InitializableUpgradeabilityProxy +{ + /** + * @dev Constructor. + * @param admin The address of the admin + */ + constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { + // Intentionally left blank + } + + /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy + function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { + BaseImmutableAdminUpgradeabilityProxy._willFallback(); + } +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/protocol/configuration/PoolAddressesProvider.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/protocol/configuration/PoolAddressesProvider.sol new file mode 100644 index 00000000..009f4e5c --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/protocol/configuration/PoolAddressesProvider.sol @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {Ownable} from '../../dependencies/openzeppelin/contracts/Ownable.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {InitializableImmutableAdminUpgradeabilityProxy} from '../../misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; + +/** + * @title PoolAddressesProvider + * @author Aave + * @notice Main registry of addresses part of or connected to the protocol, including permissioned roles + * @dev Acts as factory of proxies and admin of those, so with right to change its implementations + * @dev Owned by the Aave Governance + */ +contract PoolAddressesProvider is Ownable, IPoolAddressesProvider { + // Identifier of the Aave Market + string private _marketId; + + // Map of registered addresses (identifier => registeredAddress) + mapping(bytes32 => address) private _addresses; + + // Main identifiers + bytes32 private constant POOL = 'POOL'; + bytes32 private constant POOL_CONFIGURATOR = 'POOL_CONFIGURATOR'; + bytes32 private constant PRICE_ORACLE = 'PRICE_ORACLE'; + bytes32 private constant ACL_MANAGER = 'ACL_MANAGER'; + bytes32 private constant ACL_ADMIN = 'ACL_ADMIN'; + bytes32 private constant PRICE_ORACLE_SENTINEL = 'PRICE_ORACLE_SENTINEL'; + bytes32 private constant DATA_PROVIDER = 'DATA_PROVIDER'; + + /** + * @dev Constructor. + * @param marketId The identifier of the market. + * @param owner The owner address of this contract. + */ + constructor(string memory marketId, address owner) { + _setMarketId(marketId); + transferOwnership(owner); + } + + /// @inheritdoc IPoolAddressesProvider + function getMarketId() external view override returns (string memory) { + return _marketId; + } + + /// @inheritdoc IPoolAddressesProvider + function setMarketId(string memory newMarketId) external override onlyOwner { + _setMarketId(newMarketId); + } + + /// @inheritdoc IPoolAddressesProvider + function getAddress(bytes32 id) public view override returns (address) { + return _addresses[id]; + } + + /// @inheritdoc IPoolAddressesProvider + function setAddress(bytes32 id, address newAddress) external override onlyOwner { + address oldAddress = _addresses[id]; + _addresses[id] = newAddress; + emit AddressSet(id, oldAddress, newAddress); + } + + /// @inheritdoc IPoolAddressesProvider + function setAddressAsProxy( + bytes32 id, + address newImplementationAddress + ) external override onlyOwner { + address proxyAddress = _addresses[id]; + address oldImplementationAddress = _getProxyImplementation(id); + _updateImpl(id, newImplementationAddress); + emit AddressSetAsProxy(id, proxyAddress, oldImplementationAddress, newImplementationAddress); + } + + /// @inheritdoc IPoolAddressesProvider + function getPool() external view override returns (address) { + return getAddress(POOL); + } + + /// @inheritdoc IPoolAddressesProvider + function setPoolImpl(address newPoolImpl) external override onlyOwner { + address oldPoolImpl = _getProxyImplementation(POOL); + _updateImpl(POOL, newPoolImpl); + emit PoolUpdated(oldPoolImpl, newPoolImpl); + } + + /// @inheritdoc IPoolAddressesProvider + function getPoolConfigurator() external view override returns (address) { + return getAddress(POOL_CONFIGURATOR); + } + + /// @inheritdoc IPoolAddressesProvider + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external override onlyOwner { + address oldPoolConfiguratorImpl = _getProxyImplementation(POOL_CONFIGURATOR); + _updateImpl(POOL_CONFIGURATOR, newPoolConfiguratorImpl); + emit PoolConfiguratorUpdated(oldPoolConfiguratorImpl, newPoolConfiguratorImpl); + } + + /// @inheritdoc IPoolAddressesProvider + function getPriceOracle() external view override returns (address) { + return getAddress(PRICE_ORACLE); + } + + /// @inheritdoc IPoolAddressesProvider + function setPriceOracle(address newPriceOracle) external override onlyOwner { + address oldPriceOracle = _addresses[PRICE_ORACLE]; + _addresses[PRICE_ORACLE] = newPriceOracle; + emit PriceOracleUpdated(oldPriceOracle, newPriceOracle); + } + + /// @inheritdoc IPoolAddressesProvider + function getACLManager() external view override returns (address) { + return getAddress(ACL_MANAGER); + } + + /// @inheritdoc IPoolAddressesProvider + function setACLManager(address newAclManager) external override onlyOwner { + address oldAclManager = _addresses[ACL_MANAGER]; + _addresses[ACL_MANAGER] = newAclManager; + emit ACLManagerUpdated(oldAclManager, newAclManager); + } + + /// @inheritdoc IPoolAddressesProvider + function getACLAdmin() external view override returns (address) { + return getAddress(ACL_ADMIN); + } + + /// @inheritdoc IPoolAddressesProvider + function setACLAdmin(address newAclAdmin) external override onlyOwner { + address oldAclAdmin = _addresses[ACL_ADMIN]; + _addresses[ACL_ADMIN] = newAclAdmin; + emit ACLAdminUpdated(oldAclAdmin, newAclAdmin); + } + + /// @inheritdoc IPoolAddressesProvider + function getPriceOracleSentinel() external view override returns (address) { + return getAddress(PRICE_ORACLE_SENTINEL); + } + + /// @inheritdoc IPoolAddressesProvider + function setPriceOracleSentinel(address newPriceOracleSentinel) external override onlyOwner { + address oldPriceOracleSentinel = _addresses[PRICE_ORACLE_SENTINEL]; + _addresses[PRICE_ORACLE_SENTINEL] = newPriceOracleSentinel; + emit PriceOracleSentinelUpdated(oldPriceOracleSentinel, newPriceOracleSentinel); + } + + /// @inheritdoc IPoolAddressesProvider + function getPoolDataProvider() external view override returns (address) { + return getAddress(DATA_PROVIDER); + } + + /// @inheritdoc IPoolAddressesProvider + function setPoolDataProvider(address newDataProvider) external override onlyOwner { + address oldDataProvider = _addresses[DATA_PROVIDER]; + _addresses[DATA_PROVIDER] = newDataProvider; + emit PoolDataProviderUpdated(oldDataProvider, newDataProvider); + } + + /** + * @notice Internal function to update the implementation of a specific proxied component of the protocol. + * @dev If there is no proxy registered with the given identifier, it creates the proxy setting `newAddress` + * as implementation and calls the initialize() function on the proxy + * @dev If there is already a proxy registered, it just updates the implementation to `newAddress` and + * calls the initialize() function via upgradeToAndCall() in the proxy + * @param id The id of the proxy to be updated + * @param newAddress The address of the new implementation + */ + function _updateImpl(bytes32 id, address newAddress) internal { + address proxyAddress = _addresses[id]; + InitializableImmutableAdminUpgradeabilityProxy proxy; + bytes memory params = abi.encodeWithSignature('initialize(address)', address(this)); + + if (proxyAddress == address(0)) { + proxy = new InitializableImmutableAdminUpgradeabilityProxy(address(this)); + _addresses[id] = proxyAddress = address(proxy); + proxy.initialize(newAddress, params); + emit ProxyCreated(id, proxyAddress, newAddress); + } else { + proxy = InitializableImmutableAdminUpgradeabilityProxy(payable(proxyAddress)); + proxy.upgradeToAndCall(newAddress, params); + } + } + + /** + * @notice Updates the identifier of the Aave market. + * @param newMarketId The new id of the market + */ + function _setMarketId(string memory newMarketId) internal { + string memory oldMarketId = _marketId; + _marketId = newMarketId; + emit MarketIdSet(oldMarketId, newMarketId); + } + + /** + * @notice Returns the the implementation contract of the proxy contract by its identifier. + * @dev It returns ZERO if there is no registered address with the given id + * @dev It reverts if the registered address with the given id is not `InitializableImmutableAdminUpgradeabilityProxy` + * @param id The id + * @return The address of the implementation contract + */ + function _getProxyImplementation(bytes32 id) internal returns (address) { + address proxyAddress = _addresses[id]; + if (proxyAddress == address(0)) { + return address(0); + } else { + address payable payableProxyAddress = payable(proxyAddress); + return InitializableImmutableAdminUpgradeabilityProxy(payableProxyAddress).implementation(); + } + } +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY.sol new file mode 100644 index 00000000..8ab717ff --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY.sol @@ -0,0 +1,352 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/interfaces/IPoolAddressesProviderRegistry.sol + +/** + * @title IPoolAddressesProviderRegistry + * @author Aave + * @notice Defines the basic interface for an Aave Pool Addresses Provider Registry. + */ +interface IPoolAddressesProviderRegistry { + /** + * @dev Emitted when a new AddressesProvider is registered. + * @param addressesProvider The address of the registered PoolAddressesProvider + * @param id The id of the registered PoolAddressesProvider + */ + event AddressesProviderRegistered(address indexed addressesProvider, uint256 indexed id); + + /** + * @dev Emitted when an AddressesProvider is unregistered. + * @param addressesProvider The address of the unregistered PoolAddressesProvider + * @param id The id of the unregistered PoolAddressesProvider + */ + event AddressesProviderUnregistered(address indexed addressesProvider, uint256 indexed id); + + /** + * @notice Returns the list of registered addresses providers + * @return The list of addresses providers + */ + function getAddressesProvidersList() external view returns (address[] memory); + + /** + * @notice Returns the id of a registered PoolAddressesProvider + * @param addressesProvider The address of the PoolAddressesProvider + * @return The id of the PoolAddressesProvider or 0 if is not registered + */ + function getAddressesProviderIdByAddress( + address addressesProvider + ) external view returns (uint256); + + /** + * @notice Returns the address of a registered PoolAddressesProvider + * @param id The id of the market + * @return The address of the PoolAddressesProvider with the given id or zero address if it is not registered + */ + function getAddressesProviderAddressById(uint256 id) external view returns (address); + + /** + * @notice Registers an addresses provider + * @dev The PoolAddressesProvider must not already be registered in the registry + * @dev The id must not be used by an already registered PoolAddressesProvider + * @param provider The address of the new PoolAddressesProvider + * @param id The id for the new PoolAddressesProvider, referring to the market it belongs to + */ + function registerAddressesProvider(address provider, uint256 id) external; + + /** + * @notice Removes an addresses provider from the list of registered addresses providers + * @param provider The PoolAddressesProvider address + */ + function unregisterAddressesProvider(address provider) external; +} + +// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} + +// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol + +/** + * @title PoolAddressesProviderRegistry + * @author Aave + * @notice Main registry of PoolAddressesProvider of Aave markets. + * @dev Used for indexing purposes of Aave protocol's markets. The id assigned to a PoolAddressesProvider refers to the + * market it is connected with, for example with `1` for the Aave main market and `2` for the next created. + */ +contract PoolAddressesProviderRegistry is Ownable, IPoolAddressesProviderRegistry { + // Map of address provider ids (addressesProvider => id) + mapping(address => uint256) private _addressesProviderToId; + // Map of id to address provider (id => addressesProvider) + mapping(uint256 => address) private _idToAddressesProvider; + // List of addresses providers + address[] private _addressesProvidersList; + // Map of address provider list indexes (addressesProvider => indexInList) + mapping(address => uint256) private _addressesProvidersIndexes; + + /** + * @dev Constructor. + * @param owner The owner address of this contract. + */ + constructor(address owner) { + transferOwnership(owner); + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function getAddressesProvidersList() external view override returns (address[] memory) { + return _addressesProvidersList; + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function registerAddressesProvider(address provider, uint256 id) external override onlyOwner { + require(id != 0, Errors.INVALID_ADDRESSES_PROVIDER_ID); + require(_idToAddressesProvider[id] == address(0), Errors.INVALID_ADDRESSES_PROVIDER_ID); + require(_addressesProviderToId[provider] == 0, Errors.ADDRESSES_PROVIDER_ALREADY_ADDED); + + _addressesProviderToId[provider] = id; + _idToAddressesProvider[id] = provider; + + _addToAddressesProvidersList(provider); + emit AddressesProviderRegistered(provider, id); + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function unregisterAddressesProvider(address provider) external override onlyOwner { + require(_addressesProviderToId[provider] != 0, Errors.ADDRESSES_PROVIDER_NOT_REGISTERED); + uint256 oldId = _addressesProviderToId[provider]; + _idToAddressesProvider[oldId] = address(0); + _addressesProviderToId[provider] = 0; + + _removeFromAddressesProvidersList(provider); + + emit AddressesProviderUnregistered(provider, oldId); + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function getAddressesProviderIdByAddress( + address addressesProvider + ) external view override returns (uint256) { + return _addressesProviderToId[addressesProvider]; + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function getAddressesProviderAddressById(uint256 id) external view override returns (address) { + return _idToAddressesProvider[id]; + } + + /** + * @notice Adds the addresses provider address to the list. + * @param provider The address of the PoolAddressesProvider + */ + function _addToAddressesProvidersList(address provider) internal { + _addressesProvidersIndexes[provider] = _addressesProvidersList.length; + _addressesProvidersList.push(provider); + } + + /** + * @notice Removes the addresses provider address from the list. + * @param provider The address of the PoolAddressesProvider + */ + function _removeFromAddressesProvidersList(address provider) internal { + uint256 index = _addressesProvidersIndexes[provider]; + + _addressesProvidersIndexes[provider] = 0; + + // Swap the index of the last addresses provider in the list with the index of the provider to remove + uint256 lastIndex = _addressesProvidersList.length - 1; + if (index < lastIndex) { + address lastProvider = _addressesProvidersList[lastIndex]; + _addressesProvidersList[index] = lastProvider; + _addressesProvidersIndexes[lastProvider] = index; + } + _addressesProvidersList.pop(); + } +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol new file mode 100644 index 00000000..7917b722 --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +import './Context.sol'; + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/interfaces/IPoolAddressesProviderRegistry.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/interfaces/IPoolAddressesProviderRegistry.sol new file mode 100644 index 00000000..ee64231a --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/interfaces/IPoolAddressesProviderRegistry.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProviderRegistry + * @author Aave + * @notice Defines the basic interface for an Aave Pool Addresses Provider Registry. + */ +interface IPoolAddressesProviderRegistry { + /** + * @dev Emitted when a new AddressesProvider is registered. + * @param addressesProvider The address of the registered PoolAddressesProvider + * @param id The id of the registered PoolAddressesProvider + */ + event AddressesProviderRegistered(address indexed addressesProvider, uint256 indexed id); + + /** + * @dev Emitted when an AddressesProvider is unregistered. + * @param addressesProvider The address of the unregistered PoolAddressesProvider + * @param id The id of the unregistered PoolAddressesProvider + */ + event AddressesProviderUnregistered(address indexed addressesProvider, uint256 indexed id); + + /** + * @notice Returns the list of registered addresses providers + * @return The list of addresses providers + */ + function getAddressesProvidersList() external view returns (address[] memory); + + /** + * @notice Returns the id of a registered PoolAddressesProvider + * @param addressesProvider The address of the PoolAddressesProvider + * @return The id of the PoolAddressesProvider or 0 if is not registered + */ + function getAddressesProviderIdByAddress( + address addressesProvider + ) external view returns (uint256); + + /** + * @notice Returns the address of a registered PoolAddressesProvider + * @param id The id of the market + * @return The address of the PoolAddressesProvider with the given id or zero address if it is not registered + */ + function getAddressesProviderAddressById(uint256 id) external view returns (address); + + /** + * @notice Registers an addresses provider + * @dev The PoolAddressesProvider must not already be registered in the registry + * @dev The id must not be used by an already registered PoolAddressesProvider + * @param provider The address of the new PoolAddressesProvider + * @param id The id for the new PoolAddressesProvider, referring to the market it belongs to + */ + function registerAddressesProvider(address provider, uint256 id) external; + + /** + * @notice Removes an addresses provider from the list of registered addresses providers + * @param provider The PoolAddressesProvider address + */ + function unregisterAddressesProvider(address provider) external; +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol new file mode 100644 index 00000000..7368df00 --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {Ownable} from '../../dependencies/openzeppelin/contracts/Ownable.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; +import {IPoolAddressesProviderRegistry} from '../../interfaces/IPoolAddressesProviderRegistry.sol'; + +/** + * @title PoolAddressesProviderRegistry + * @author Aave + * @notice Main registry of PoolAddressesProvider of Aave markets. + * @dev Used for indexing purposes of Aave protocol's markets. The id assigned to a PoolAddressesProvider refers to the + * market it is connected with, for example with `1` for the Aave main market and `2` for the next created. + */ +contract PoolAddressesProviderRegistry is Ownable, IPoolAddressesProviderRegistry { + // Map of address provider ids (addressesProvider => id) + mapping(address => uint256) private _addressesProviderToId; + // Map of id to address provider (id => addressesProvider) + mapping(uint256 => address) private _idToAddressesProvider; + // List of addresses providers + address[] private _addressesProvidersList; + // Map of address provider list indexes (addressesProvider => indexInList) + mapping(address => uint256) private _addressesProvidersIndexes; + + /** + * @dev Constructor. + * @param owner The owner address of this contract. + */ + constructor(address owner) { + transferOwnership(owner); + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function getAddressesProvidersList() external view override returns (address[] memory) { + return _addressesProvidersList; + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function registerAddressesProvider(address provider, uint256 id) external override onlyOwner { + require(id != 0, Errors.INVALID_ADDRESSES_PROVIDER_ID); + require(_idToAddressesProvider[id] == address(0), Errors.INVALID_ADDRESSES_PROVIDER_ID); + require(_addressesProviderToId[provider] == 0, Errors.ADDRESSES_PROVIDER_ALREADY_ADDED); + + _addressesProviderToId[provider] = id; + _idToAddressesProvider[id] = provider; + + _addToAddressesProvidersList(provider); + emit AddressesProviderRegistered(provider, id); + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function unregisterAddressesProvider(address provider) external override onlyOwner { + require(_addressesProviderToId[provider] != 0, Errors.ADDRESSES_PROVIDER_NOT_REGISTERED); + uint256 oldId = _addressesProviderToId[provider]; + _idToAddressesProvider[oldId] = address(0); + _addressesProviderToId[provider] = 0; + + _removeFromAddressesProvidersList(provider); + + emit AddressesProviderUnregistered(provider, oldId); + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function getAddressesProviderIdByAddress( + address addressesProvider + ) external view override returns (uint256) { + return _addressesProviderToId[addressesProvider]; + } + + /// @inheritdoc IPoolAddressesProviderRegistry + function getAddressesProviderAddressById(uint256 id) external view override returns (address) { + return _idToAddressesProvider[id]; + } + + /** + * @notice Adds the addresses provider address to the list. + * @param provider The address of the PoolAddressesProvider + */ + function _addToAddressesProvidersList(address provider) internal { + _addressesProvidersIndexes[provider] = _addressesProvidersList.length; + _addressesProvidersList.push(provider); + } + + /** + * @notice Removes the addresses provider address from the list. + * @param provider The address of the PoolAddressesProvider + */ + function _removeFromAddressesProvidersList(address provider) internal { + uint256 index = _addressesProvidersIndexes[provider]; + + _addressesProvidersIndexes[provider] = 0; + + // Swap the index of the last addresses provider in the list with the index of the provider to remove + uint256 lastIndex = _addressesProvidersList.length - 1; + if (index < lastIndex) { + address lastProvider = _addressesProvidersList[lastIndex]; + _addressesProvidersList[index] = lastProvider; + _addressesProvidersIndexes[lastProvider] = index; + } + _addressesProvidersList.pop(); + } +} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL.sol new file mode 100644 index 00000000..e6effd03 --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL.sol @@ -0,0 +1,4995 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol + +/** + * @title Proxy + * @dev Implements delegation of calls to other contracts, with proper + * forwarding of return values and bubbling of failures. + * It defines a fallback function that delegates all calls to the address + * returned by the abstract _implementation() internal function. + */ +abstract contract Proxy { + /** + * @dev Fallback function. + * Will run if no other function in the contract matches the call data. + * Implemented entirely in `_fallback`. + */ + fallback() external payable { + _fallback(); + } + + /** + * @dev Fallback function that will run if call data is empty. + * IMPORTANT. receive() on implementation contracts will be unreachable + */ + receive() external payable { + _fallback(); + } + + /** + * @return The Address of the implementation. + */ + function _implementation() internal view virtual returns (address); + + /** + * @dev Delegates execution to an implementation contract. + * This is a low level function that doesn't return to its internal call site. + * It will return to the external caller whatever the implementation returns. + * @param implementation Address to delegate. + */ + function _delegate(address implementation) internal { + //solium-disable-next-line + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + /** + * @dev Function that is run as the first thing in the fallback function. + * Can be redefined in derived contracts to add functionality. + * Redefinitions must call super._willFallback(). + */ + function _willFallback() internal virtual {} + + /** + * @dev fallback implementation. + * Extracted to enable manual triggering. + */ + function _fallback() internal { + _willFallback(); + _delegate(_implementation()); + } +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol + +library ConfiguratorInputTypes { + struct InitReserveInput { + address aTokenImpl; + address variableDebtTokenImpl; + bool useVirtualBalance; + address interestRateStrategyAddress; + address underlyingAsset; + address treasury; + address incentivesController; + string aTokenName; + string aTokenSymbol; + string variableDebtTokenName; + string variableDebtTokenSymbol; + bytes params; + bytes interestRateData; + } + + struct UpdateATokenInput { + address asset; + address treasury; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } + + struct UpdateDebtTokenInput { + address asset; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolDataProvider.sol + +/** + * @title IPoolDataProvider + * @author Aave + * @notice Defines the basic interface of a PoolDataProvider + */ +interface IPoolDataProvider { + struct TokenData { + string symbol; + address tokenAddress; + } + + /** + * @notice Returns the address for the PoolAddressesProvider contract. + * @return The address for the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the list of the existing reserves in the pool. + * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. + * @return The list of reserves, pairs of symbols and addresses + */ + function getAllReservesTokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the list of the existing ATokens in the pool. + * @return The list of ATokens, pairs of symbols and addresses + */ + function getAllATokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the configuration data of the reserve + * @dev Not returning borrow and supply caps for compatibility, nor pause flag + * @param asset The address of the underlying asset of the reserve + * @return decimals The number of decimals of the reserve + * @return ltv The ltv of the reserve + * @return liquidationThreshold The liquidationThreshold of the reserve + * @return liquidationBonus The liquidationBonus of the reserve + * @return reserveFactor The reserveFactor of the reserve + * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise + * @return borrowingEnabled True if borrowing is enabled, false otherwise + * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise + * @return isActive True if it is active, false otherwise + * @return isFrozen True if it is frozen, false otherwise + */ + function getReserveConfigurationData( + address asset + ) + external + view + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ); + + /** + * @notice Returns the caps parameters of the reserve + * @param asset The address of the underlying asset of the reserve + * @return borrowCap The borrow cap of the reserve + * @return supplyCap The supply cap of the reserve + */ + function getReserveCaps( + address asset + ) external view returns (uint256 borrowCap, uint256 supplyCap); + + /** + * @notice Returns if the pool is paused + * @param asset The address of the underlying asset of the reserve + * @return isPaused True if the pool is paused, false otherwise + */ + function getPaused(address asset) external view returns (bool isPaused); + + /** + * @notice Returns the siloed borrowing flag + * @param asset The address of the underlying asset of the reserve + * @return True if the asset is siloed for borrowing + */ + function getSiloedBorrowing(address asset) external view returns (bool); + + /** + * @notice Returns the protocol fee on the liquidation bonus + * @param asset The address of the underlying asset of the reserve + * @return The protocol fee on liquidation + */ + function getLiquidationProtocolFee(address asset) external view returns (uint256); + + /** + * @notice Returns the unbacked mint cap of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The unbacked mint cap of the reserve + */ + function getUnbackedMintCap(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The debt ceiling of the reserve + */ + function getDebtCeiling(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling decimals + * @return The debt ceiling decimals + */ + function getDebtCeilingDecimals() external pure returns (uint256); + + /** + * @notice Returns the reserve data + * @param asset The address of the underlying asset of the reserve + * @return unbacked The amount of unbacked tokens + * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted + * @return totalAToken The total supply of the aToken + * @return totalStableDebt The total stable debt of the reserve + * @return totalVariableDebt The total variable debt of the reserve + * @return liquidityRate The liquidity rate of the reserve + * @return variableBorrowRate The variable borrow rate of the reserve + * @return stableBorrowRate The stable borrow rate of the reserve + * @return averageStableBorrowRate The average stable borrow rate of the reserve + * @return liquidityIndex The liquidity index of the reserve + * @return variableBorrowIndex The variable borrow index of the reserve + * @return lastUpdateTimestamp The timestamp of the last update of the reserve + */ + function getReserveData( + address asset + ) + external + view + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ); + + /** + * @notice Returns the total supply of aTokens for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total supply of the aToken + */ + function getATokenTotalSupply(address asset) external view returns (uint256); + + /** + * @notice Returns the total debt for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total debt for asset + */ + function getTotalDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the user data in a reserve + * @param asset The address of the underlying asset of the reserve + * @param user The address of the user + * @return currentATokenBalance The current AToken balance of the user + * @return currentStableDebt The current stable debt of the user + * @return currentVariableDebt The current variable debt of the user + * @return principalStableDebt The principal stable debt of the user + * @return scaledVariableDebt The scaled variable debt of the user + * @return stableBorrowRate The stable borrow rate of the user + * @return liquidityRate The liquidity rate of the reserve + * @return stableRateLastUpdated The timestamp of the last update of the user stable rate + * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false + * otherwise + */ + function getUserReserveData( + address asset, + address user + ) + external + view + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ); + + /** + * @notice Returns the token addresses of the reserve + * @param asset The address of the underlying asset of the reserve + * @return aTokenAddress The AToken address of the reserve + * @return stableDebtTokenAddress DEPRECATED in v3.2.0 + * @return variableDebtTokenAddress The VariableDebtToken address of the reserve + */ + function getReserveTokensAddresses( + address asset + ) + external + view + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ); + + /** + * @notice Returns the address of the Interest Rate strategy + * @param asset The address of the underlying asset of the reserve + * @return irStrategyAddress The address of the Interest Rate strategy + */ + function getInterestRateStrategyAddress( + address asset + ) external view returns (address irStrategyAddress); + + /** + * @notice Returns whether the reserve has FlashLoans enabled or disabled + * @param asset The address of the underlying asset of the reserve + * @return True if FlashLoans are enabled, false otherwise + */ + function getFlashLoanEnabled(address asset) external view returns (bool); + + /** + * @notice Returns whether virtual accounting is enabled/not for a reserve + * @param asset The address of the underlying asset of the reserve + * @return True if active, false otherwise + */ + function getIsVirtualAccActive(address asset) external view returns (bool); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint256); +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol + +/** + * @title BaseUpgradeabilityProxy + * @dev This contract implements a proxy that allows to change the + * implementation address to which it will delegate. + * Such a change is called an implementation upgrade. + */ +contract BaseUpgradeabilityProxy is Proxy { + /** + * @dev Emitted when the implementation is upgraded. + * @param implementation Address of the new implementation. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Storage slot with the address of the current implementation. + * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is + * validated in the constructor. + */ + bytes32 internal constant IMPLEMENTATION_SLOT = + 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + /** + * @dev Returns the current implementation. + * @return impl Address of the current implementation + */ + function _implementation() internal view override returns (address impl) { + bytes32 slot = IMPLEMENTATION_SLOT; + //solium-disable-next-line + assembly { + impl := sload(slot) + } + } + + /** + * @dev Upgrades the proxy to a new implementation. + * @param newImplementation Address of the new implementation. + */ + function _upgradeTo(address newImplementation) internal { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + } + + /** + * @dev Sets the implementation address of the proxy. + * @param newImplementation Address of the new implementation. + */ + function _setImplementation(address newImplementation) internal { + require( + Address.isContract(newImplementation), + 'Cannot set a proxy implementation to a non-contract address' + ); + + bytes32 slot = IMPLEMENTATION_SLOT; + + //solium-disable-next-line + assembly { + sstore(slot, newImplementation) + } + } +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol + +/** + * @title InitializableUpgradeabilityProxy + * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing + * implementation and init data. + */ +contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { + /** + * @dev Contract initializer. + * @param _logic Address of the initial implementation. + * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. + */ + function initialize(address _logic, bytes memory _data) public payable { + require(_implementation() == address(0)); + assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); + _setImplementation(_logic); + if (_data.length > 0) { + (bool success, ) = _logic.delegatecall(_data); + require(success); + } + } +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol + +/** + * @title IDefaultInterestRateStrategyV2 + * @author BGD Labs + * @notice Interface of the default interest rate strategy used by the Aave protocol + */ +interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { + /** + * @notice Holds the interest rate data for a given reserve + * + * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This + * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. + * + * @param optimalUsageRatio The optimal usage ratio, in bps + * @param baseVariableBorrowRate The base variable borrow rate, in bps + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps + */ + struct InterestRateData { + uint16 optimalUsageRatio; + uint32 baseVariableBorrowRate; + uint32 variableRateSlope1; + uint32 variableRateSlope2; + } + + /** + * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, + * used in in-memory calculations. + * + * @param optimalUsageRatio The optimal usage ratio + * @param baseVariableBorrowRate The base variable borrow rate + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio + */ + struct InterestRateDataRay { + uint256 optimalUsageRatio; + uint256 baseVariableBorrowRate; + uint256 variableRateSlope1; + uint256 variableRateSlope2; + } + + /** + * @notice emitted when new interest rate data is set in a reserve + * + * @param reserve address of the reserve that has new interest rate data set + * @param optimalUsageRatio The optimal usage ratio, in bps + * @param baseVariableBorrowRate The base variable borrow rate, in bps + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps + */ + event RateDataUpdate( + address indexed reserve, + uint256 optimalUsageRatio, + uint256 baseVariableBorrowRate, + uint256 variableRateSlope1, + uint256 variableRateSlope2 + ); + + /** + * @notice Returns the address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the maximum value achievable for variable borrow rate, in bps + * @return The maximum rate + */ + function MAX_BORROW_RATE() external view returns (uint256); + + /** + * @notice Returns the minimum optimal point, in bps + * @return The optimal point + */ + function MIN_OPTIMAL_POINT() external view returns (uint256); + + /** + * @notice Returns the maximum optimal point, in bps + * @return The optimal point + */ + function MAX_OPTIMAL_POINT() external view returns (uint256); + + /** + * notice Returns the full InterestRateData object for the given reserve, in ray + * + * @param reserve The reserve to get the data of + * + * @return The InterestRateDataRay object for the given reserve + */ + function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); + + /** + * notice Returns the full InterestRateDataRay object for the given reserve, in bps + * + * @param reserve The reserve to get the data of + * + * @return The InterestRateData object for the given reserve + */ + function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); + + /** + * @notice Returns the optimal usage rate for the given reserve in ray + * + * @param reserve The reserve to get the optimal usage rate of + * + * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate + */ + function getOptimalUsageRatio(address reserve) external view returns (uint256); + + /** + * @notice Returns the variable rate slope below optimal usage ratio in ray + * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO + * + * @param reserve The reserve to get the variable rate slope 1 of + * + * @return The variable rate slope + */ + function getVariableRateSlope1(address reserve) external view returns (uint256); + + /** + * @notice Returns the variable rate slope above optimal usage ratio in ray + * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO + * + * @param reserve The reserve to get the variable rate slope 2 of + * + * @return The variable rate slope + */ + function getVariableRateSlope2(address reserve) external view returns (uint256); + + /** + * @notice Returns the base variable borrow rate, in ray + * + * @param reserve The reserve to get the base variable borrow rate of + * + * @return The base variable borrow rate + */ + function getBaseVariableBorrowRate(address reserve) external view returns (uint256); + + /** + * @notice Returns the maximum variable borrow rate, in ray + * + * @param reserve The reserve to get the maximum variable borrow rate of + * + * @return The maximum variable borrow rate + */ + function getMaxVariableBorrowRate(address reserve) external view returns (uint256); + + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The reserve interest rate data to apply to the given reserve + * Being specific to this custom implementation, with custom struct type, + * overloading the function on the generic interface + */ + function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol + +/** + * @title BaseImmutableAdminUpgradeabilityProxy + * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern + * @notice This contract combines an upgradeability proxy with an authorization + * mechanism for administrative tasks. + * @dev The admin role is stored in an immutable, which helps saving transactions costs + * All external functions in this contract must be guarded by the + * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity + * feature proposal that would enable this to be done automatically. + */ +contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + address internal immutable _admin; + + /** + * @dev Constructor. + * @param admin_ The address of the admin + */ + constructor(address admin_) { + _admin = admin_; + } + + modifier ifAdmin() { + if (msg.sender == _admin) { + _; + } else { + _fallback(); + } + } + + /** + * @notice Return the admin address + * @return The address of the proxy admin. + */ + function admin() external ifAdmin returns (address) { + return _admin; + } + + /** + * @notice Return the implementation address + * @return The address of the implementation. + */ + function implementation() external ifAdmin returns (address) { + return _implementation(); + } + + /** + * @notice Upgrade the backing implementation of the proxy. + * @dev Only the admin can call this function. + * @param newImplementation The address of the new implementation. + */ + function upgradeTo(address newImplementation) external ifAdmin { + _upgradeTo(newImplementation); + } + + /** + * @notice Upgrade the backing implementation of the proxy and call a function + * on the new implementation. + * @dev This is useful to initialize the proxied contract. + * @param newImplementation The address of the new implementation. + * @param data Data to send as msg.data in the low level call. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + */ + function upgradeToAndCall( + address newImplementation, + bytes calldata data + ) external payable ifAdmin { + _upgradeTo(newImplementation); + (bool success, ) = newImplementation.delegatecall(data); + require(success); + } + + /** + * @notice Only fall back when the sender is not the admin. + */ + function _willFallback() internal virtual override { + require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); + super._willFallback(); + } +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolConfigurator.sol + +/** + * @title IPoolConfigurator + * @author Aave + * @notice Defines the basic interface for a Pool configurator. + */ +interface IPoolConfigurator { + /** + * @dev Emitted when a reserve is initialized. + * @param asset The address of the underlying asset of the reserve + * @param aToken The address of the associated aToken contract + * @param stableDebtToken, DEPRECATED in v3.2.0 + * @param variableDebtToken The address of the associated variable rate debt token + * @param interestRateStrategyAddress The address of the interest rate strategy for the reserve + */ + event ReserveInitialized( + address indexed asset, + address indexed aToken, + address stableDebtToken, + address variableDebtToken, + address interestRateStrategyAddress + ); + + /** + * @dev Emitted when borrowing is enabled or disabled on a reserve. + * @param asset The address of the underlying asset of the reserve + * @param enabled True if borrowing is enabled, false otherwise + */ + event ReserveBorrowing(address indexed asset, bool enabled); + + /** + * @dev Emitted when flashloans are enabled or disabled on a reserve. + * @param asset The address of the underlying asset of the reserve + * @param enabled True if flashloans are enabled, false otherwise + */ + event ReserveFlashLoaning(address indexed asset, bool enabled); + + /** + * @dev Emitted when the ltv is set for the frozen asset. + * @param asset The address of the underlying asset of the reserve + * @param ltv The loan to value of the asset when used as collateral + */ + event PendingLtvChanged(address indexed asset, uint256 ltv); + + /** + * @dev Emitted when the collateralization risk parameters for the specified asset are updated. + * @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 + */ + event CollateralConfigurationChanged( + address indexed asset, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus + ); + + /** + * @dev Emitted when a reserve is activated or deactivated + * @param asset The address of the underlying asset of the reserve + * @param active True if reserve is active, false otherwise + */ + event ReserveActive(address indexed asset, bool active); + + /** + * @dev Emitted when a reserve is frozen or unfrozen + * @param asset The address of the underlying asset of the reserve + * @param frozen True if reserve is frozen, false otherwise + */ + event ReserveFrozen(address indexed asset, bool frozen); + + /** + * @dev Emitted when a reserve is paused or unpaused + * @param asset The address of the underlying asset of the reserve + * @param paused True if reserve is paused, false otherwise + */ + event ReservePaused(address indexed asset, bool paused); + + /** + * @dev Emitted when a reserve is dropped. + * @param asset The address of the underlying asset of the reserve + */ + event ReserveDropped(address indexed asset); + + /** + * @dev Emitted when a reserve factor is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldReserveFactor The old reserve factor, expressed in bps + * @param newReserveFactor The new reserve factor, expressed in bps + */ + event ReserveFactorChanged( + address indexed asset, + uint256 oldReserveFactor, + uint256 newReserveFactor + ); + + /** + * @dev Emitted when the borrow cap of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldBorrowCap The old borrow cap + * @param newBorrowCap The new borrow cap + */ + event BorrowCapChanged(address indexed asset, uint256 oldBorrowCap, uint256 newBorrowCap); + + /** + * @dev Emitted when the supply cap of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldSupplyCap The old supply cap + * @param newSupplyCap The new supply cap + */ + event SupplyCapChanged(address indexed asset, uint256 oldSupplyCap, uint256 newSupplyCap); + + /** + * @dev Emitted when the liquidation protocol fee of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldFee The old liquidation protocol fee, expressed in bps + * @param newFee The new liquidation protocol fee, expressed in bps + */ + event LiquidationProtocolFeeChanged(address indexed asset, uint256 oldFee, uint256 newFee); + + /** + * @dev Emitted when the liquidation grace period is updated. + * @param asset The address of the underlying asset of the reserve + * @param gracePeriodUntil Timestamp until when liquidations will not be allowed post-unpause + */ + event LiquidationGracePeriodChanged(address indexed asset, uint40 gracePeriodUntil); + + /** + * @dev Emitted when the liquidation grace period is disabled. + * @param asset The address of the underlying asset of the reserve + */ + event LiquidationGracePeriodDisabled(address indexed asset); + + /** + * @dev Emitted when the unbacked mint cap of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldUnbackedMintCap The old unbacked mint cap + * @param newUnbackedMintCap The new unbacked mint cap + */ + event UnbackedMintCapChanged( + address indexed asset, + uint256 oldUnbackedMintCap, + uint256 newUnbackedMintCap + ); + + /** + * @dev Emitted when an collateral configuration of an asset in an eMode is changed. + * @param asset The address of the underlying asset of the reserve + * @param categoryId The eMode category + * @param collateral True if the asset is enabled as collateral in the eMode, false otherwise. + */ + event AssetCollateralInEModeChanged(address indexed asset, uint8 categoryId, bool collateral); + + /** + * @dev Emitted when the borrowable configuration of an asset in an eMode changed. + * @param asset The address of the underlying asset of the reserve + * @param categoryId The eMode category + * @param borrowable True if the asset is enabled as borrowable in the eMode, false otherwise. + */ + event AssetBorrowableInEModeChanged(address indexed asset, uint8 categoryId, bool borrowable); + + /** + * @dev Emitted when a new eMode category is added or an existing category is altered. + * @param categoryId The new eMode category id + * @param ltv The ltv for the asset category in eMode + * @param liquidationThreshold The liquidationThreshold for the asset category in eMode + * @param liquidationBonus The liquidationBonus for the asset category in eMode + * @param oracle DEPRECATED in v3.2.0 + * @param label A human readable identifier for the category + */ + event EModeCategoryAdded( + uint8 indexed categoryId, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + address oracle, + string label + ); + + /** + * @dev Emitted when a reserve interest strategy contract is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldStrategy The address of the old interest strategy contract + * @param newStrategy The address of the new interest strategy contract + */ + event ReserveInterestRateStrategyChanged( + address indexed asset, + address oldStrategy, + address newStrategy + ); + + /** + * @dev Emitted when the data of a reserve interest strategy contract is updated. + * @param asset The address of the underlying asset of the reserve + * @param data abi encoded data + */ + event ReserveInterestRateDataChanged(address indexed asset, address indexed strategy, bytes data); + + /** + * @dev Emitted when an aToken implementation is upgraded. + * @param asset The address of the underlying asset of the reserve + * @param proxy The aToken proxy address + * @param implementation The new aToken implementation + */ + event ATokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @dev Emitted when the implementation of a variable debt token is upgraded. + * @param asset The address of the underlying asset of the reserve + * @param proxy The variable debt token proxy address + * @param implementation The new aToken implementation + */ + event VariableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @dev Emitted when the debt ceiling of an asset is set. + * @param asset The address of the underlying asset of the reserve + * @param oldDebtCeiling The old debt ceiling + * @param newDebtCeiling The new debt ceiling + */ + event DebtCeilingChanged(address indexed asset, uint256 oldDebtCeiling, uint256 newDebtCeiling); + + /** + * @dev Emitted when the the siloed borrowing state for an asset is changed. + * @param asset The address of the underlying asset of the reserve + * @param oldState The old siloed borrowing state + * @param newState The new siloed borrowing state + */ + event SiloedBorrowingChanged(address indexed asset, bool oldState, bool newState); + + /** + * @dev Emitted when the bridge protocol fee is updated. + * @param oldBridgeProtocolFee The old protocol fee, expressed in bps + * @param newBridgeProtocolFee The new protocol fee, expressed in bps + */ + event BridgeProtocolFeeUpdated(uint256 oldBridgeProtocolFee, uint256 newBridgeProtocolFee); + + /** + * @dev Emitted when the total premium on flashloans is updated. + * @param oldFlashloanPremiumTotal The old premium, expressed in bps + * @param newFlashloanPremiumTotal The new premium, expressed in bps + */ + event FlashloanPremiumTotalUpdated( + uint128 oldFlashloanPremiumTotal, + uint128 newFlashloanPremiumTotal + ); + + /** + * @dev Emitted when the part of the premium that goes to protocol is updated. + * @param oldFlashloanPremiumToProtocol The old premium, expressed in bps + * @param newFlashloanPremiumToProtocol The new premium, expressed in bps + */ + event FlashloanPremiumToProtocolUpdated( + uint128 oldFlashloanPremiumToProtocol, + uint128 newFlashloanPremiumToProtocol + ); + + /** + * @dev Emitted when the reserve is set as borrowable/non borrowable in isolation mode. + * @param asset The address of the underlying asset of the reserve + * @param borrowable True if the reserve is borrowable in isolation, false otherwise + */ + event BorrowableInIsolationChanged(address asset, bool borrowable); + + /** + * @notice Initializes multiple reserves. + * @dev param useVirtualBalance of the input struct should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param input The array of initialization parameters + */ + function initReserves(ConfiguratorInputTypes.InitReserveInput[] calldata input) external; + + /** + * @dev Updates the aToken implementation for the reserve. + * @param input The aToken update parameters + */ + function updateAToken(ConfiguratorInputTypes.UpdateATokenInput calldata input) external; + + /** + * @notice Updates the variable debt token implementation for the asset. + * @param input The variableDebtToken update parameters + */ + function updateVariableDebtToken( + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external; + + /** + * @notice Configures borrowing on a reserve. + * @param asset The address of the underlying asset of the reserve + * @param enabled True if borrowing needs to be enabled, false otherwise + */ + function setReserveBorrowing(address asset, bool enabled) external; + + /** + * @notice Configures the reserve collateralization parameters. + * @dev All the values are expressed in bps. A value of 10000, results in 100.00% + * @dev The `liquidationBonus` is always above 100%. A value of 105% means the liquidator will receive a 5% bonus + * @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 + */ + function configureReserveAsCollateral( + address asset, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus + ) external; + + /** + * @notice Enable or disable flashloans on a reserve + * @param asset The address of the underlying asset of the reserve + * @param enabled True if flashloans need to be enabled, false otherwise + */ + function setReserveFlashLoaning(address asset, bool enabled) external; + + /** + * @notice Activate or deactivate a reserve + * @param asset The address of the underlying asset of the reserve + * @param active True if the reserve needs to be active, false otherwise + */ + function setReserveActive(address asset, bool active) external; + + /** + * @notice Freeze or unfreeze a reserve. A frozen reserve doesn't allow any new supply, borrow + * or rate swap but allows repayments, liquidations, rate rebalances and withdrawals. + * @param asset The address of the underlying asset of the reserve + * @param freeze True if the reserve needs to be frozen, false otherwise + */ + function setReserveFreeze(address asset, bool freeze) external; + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the + * borrowed amount will be accumulated in the isolated collateral's total debt exposure + * @dev Only assets of the same family (e.g. USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations + * @param asset The address of the underlying asset of the reserve + * @param borrowable True if the asset should be borrowable in isolation, false otherwise + */ + function setBorrowableInIsolation(address asset, bool borrowable) external; + + /** + * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, + * swap interest rate, liquidate, atoken transfers). + * @param asset The address of the underlying asset of the reserve + * @param paused True if pausing the reserve, false if unpausing + * @param gracePeriod Count of seconds after unpause during which liquidations will not be available + * - Only applicable whenever unpausing (`paused` as false) + * - Passing 0 means no grace period + * - Capped to maximum MAX_GRACE_PERIOD + */ + function setReservePause(address asset, bool paused, uint40 gracePeriod) external; + + /** + * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, + * swap interest rate, liquidate, atoken transfers). + * @dev Version with no grace period + * @param asset The address of the underlying asset of the reserve + * @param paused True if pausing the reserve, false if unpausing + */ + function setReservePause(address asset, bool paused) external; + + /** + * @notice Disables liquidation grace period for the asset. The liquidation grace period is set in the past + * so that liquidations are allowed for the asset. + * @param asset The address of the underlying asset of the reserve + */ + function disableLiquidationGracePeriod(address asset) external; + + /** + * @notice Updates the reserve factor of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newReserveFactor The new reserve factor of the reserve + */ + function setReserveFactor(address asset, uint256 newReserveFactor) external; + + /** + * @notice Sets the interest rate strategy of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newRateStrategyAddress The address of the new interest strategy contract + * @param rateData bytes-encoded rate data. In this format in order to allow the rate strategy contract + * to de-structure custom data + */ + function setReserveInterestRateStrategyAddress( + address asset, + address newRateStrategyAddress, + bytes calldata rateData + ) external; + + /** + * @notice Sets interest rate data for a reserve + * @param asset The address of the underlying asset of the reserve + * @param rateData bytes-encoded rate data. In this format in order to allow the rate strategy contract + * to de-structure custom data + */ + function setReserveInterestRateData(address asset, bytes calldata rateData) external; + + /** + * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions + * are suspended. + * @param paused True if protocol needs to be paused, false otherwise + * @param gracePeriod Count of seconds after unpause during which liquidations will not be available + * - Only applicable whenever unpausing (`paused` as false) + * - Passing 0 means no grace period + * - Capped to maximum MAX_GRACE_PERIOD + */ + function setPoolPause(bool paused, uint40 gracePeriod) external; + + /** + * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions + * are suspended. + * @dev Version with no grace period + * @param paused True if protocol needs to be paused, false otherwise + */ + function setPoolPause(bool paused) external; + + /** + * @notice Updates the borrow cap of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newBorrowCap The new borrow cap of the reserve + */ + function setBorrowCap(address asset, uint256 newBorrowCap) external; + + /** + * @notice Updates the supply cap of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newSupplyCap The new supply cap of the reserve + */ + function setSupplyCap(address asset, uint256 newSupplyCap) external; + + /** + * @notice Updates the liquidation protocol fee of reserve. + * @param asset The address of the underlying asset of the reserve + * @param newFee The new liquidation protocol fee of the reserve, expressed in bps + */ + function setLiquidationProtocolFee(address asset, uint256 newFee) external; + + /** + * @notice Updates the unbacked mint cap of reserve. + * @param asset The address of the underlying asset of the reserve + * @param newUnbackedMintCap The new unbacked mint cap of the reserve + */ + function setUnbackedMintCap(address asset, uint256 newUnbackedMintCap) external; + + /** + * @notice Enables/disables an asset to be borrowable in a selected eMode. + * - eMode.borrowable always has less priority then reserve.borrowable + * @param asset The address of the underlying asset of the reserve + * @param categoryId The eMode categoryId + * @param borrowable True if the asset should be borrowable in the given eMode category, false otherwise. + */ + function setAssetBorrowableInEMode(address asset, uint8 categoryId, bool borrowable) external; + + /** + * @notice Enables/disables an asset to be collateral in a selected eMode. + * @param asset The address of the underlying asset of the reserve + * @param categoryId The eMode categoryId + * @param collateral True if the asset should be collateral in the given eMode category, false otherwise. + */ + function setAssetCollateralInEMode(address asset, uint8 categoryId, bool collateral) external; + + /** + * @notice Adds a new efficiency mode (eMode) category or alters a existing one. + * @param categoryId The id of the category to be configured + * @param ltv The ltv associated with the category + * @param liquidationThreshold The liquidation threshold associated with the category + * @param liquidationBonus The liquidation bonus associated with the category + * @param label A label identifying the category + */ + function setEModeCategory( + uint8 categoryId, + uint16 ltv, + uint16 liquidationThreshold, + uint16 liquidationBonus, + string calldata label + ) external; + + /** + * @notice Drops a reserve entirely. + * @param asset The address of the reserve to drop + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the bridge fee collected by the protocol reserves. + * @param newBridgeProtocolFee The part of the fee sent to the protocol treasury, expressed in bps + */ + function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external; + + /** + * @notice Updates the total flash loan premium. + * Total flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra balance + * - A part is collected by the protocol reserves + * @dev Expressed in bps + * @dev The premium is calculated on the total amount borrowed + * @param newFlashloanPremiumTotal The total flashloan premium + */ + function updateFlashloanPremiumTotal(uint128 newFlashloanPremiumTotal) external; + + /** + * @notice Updates the flash loan premium collected by protocol reserves + * @dev Expressed in bps + * @dev The premium to protocol is calculated on the total flashloan premium + * @param newFlashloanPremiumToProtocol The part of the flashloan premium sent to the protocol treasury + */ + function updateFlashloanPremiumToProtocol(uint128 newFlashloanPremiumToProtocol) external; + + /** + * @notice Sets the debt ceiling for an asset. + * @param newDebtCeiling The new debt ceiling + */ + function setDebtCeiling(address asset, uint256 newDebtCeiling) external; + + /** + * @notice Sets siloed borrowing for an asset + * @param siloed The new siloed borrowing state + */ + function setSiloedBorrowing(address asset, bool siloed) external; + + /** + * @notice Gets pending ltv value + * @param asset The new siloed borrowing state + */ + function getPendingLtv(address asset) external view returns (uint256); + + /** + * @notice Gets the address of the external ConfiguratorLogic + */ + function getConfiguratorLogic() external view returns (address); + + /** + * @notice Gets the maximum liquidations grace period allowed, in seconds + */ + function MAX_GRACE_PERIOD() external view returns (uint40); +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol + +/** + * @title InitializableAdminUpgradeabilityProxy + * @author Aave + * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function + */ +contract InitializableImmutableAdminUpgradeabilityProxy is + BaseImmutableAdminUpgradeabilityProxy, + InitializableUpgradeabilityProxy +{ + /** + * @dev Constructor. + * @param admin The address of the admin + */ + constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { + // Intentionally left blank + } + + /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy + function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { + BaseImmutableAdminUpgradeabilityProxy._willFallback(); + } +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol + +/** + * @title ConfiguratorLogic library + * @author Aave + * @notice Implements the functions to initialize reserves and update aTokens and debtTokens + */ +library ConfiguratorLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPoolConfigurator` for descriptions + event ReserveInitialized( + address indexed asset, + address indexed aToken, + address stableDebtToken, + address variableDebtToken, + address interestRateStrategyAddress + ); + event ATokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + event VariableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @notice Initialize a reserve by creating and initializing aToken and variable debt token + * @dev Emits the `ReserveInitialized` event + * @param pool The Pool in which the reserve will be initialized + * @param input The needed parameters for the initialization + */ + function executeInitReserve( + IPool pool, + ConfiguratorInputTypes.InitReserveInput calldata input + ) external { + // It is an assumption that the asset listed is non-malicious, and the external call doesn't create re-entrancies + uint8 underlyingAssetDecimals = IERC20Detailed(input.underlyingAsset).decimals(); + require(underlyingAssetDecimals > 5, Errors.INVALID_DECIMALS); + + address aTokenProxyAddress = _initTokenWithProxy( + input.aTokenImpl, + abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + pool, + input.treasury, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.aTokenName, + input.aTokenSymbol, + input.params + ) + ); + + address variableDebtTokenProxyAddress = _initTokenWithProxy( + input.variableDebtTokenImpl, + abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + pool, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.variableDebtTokenName, + input.variableDebtTokenSymbol, + input.params + ) + ); + + pool.initReserve( + input.underlyingAsset, + aTokenProxyAddress, + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + + DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); + + currentConfig.setDecimals(underlyingAssetDecimals); + + currentConfig.setActive(true); + currentConfig.setPaused(false); + currentConfig.setFrozen(false); + currentConfig.setVirtualAccActive(input.useVirtualBalance); + + pool.setConfiguration(input.underlyingAsset, currentConfig); + + IReserveInterestRateStrategy(input.interestRateStrategyAddress).setInterestRateParams( + input.underlyingAsset, + input.interestRateData + ); + + emit ReserveInitialized( + input.underlyingAsset, + aTokenProxyAddress, + address(0), + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + } + + /** + * @notice Updates the aToken implementation and initializes it + * @dev Emits the `ATokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the aToken + * @param input The parameters needed for the initialize call + */ + function executeUpdateAToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateATokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + cachedPool, + input.treasury, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); + + emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); + } + + /** + * @notice Updates the variable debt token implementation and initializes it + * @dev Emits the `VariableDebtTokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the variable debt token + * @param input The parameters needed for the initialize call + */ + function executeUpdateVariableDebtToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + cachedPool, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation( + reserveData.variableDebtTokenAddress, + input.implementation, + encodedCall + ); + + emit VariableDebtTokenUpgraded( + input.asset, + reserveData.variableDebtTokenAddress, + input.implementation + ); + } + + /** + * @notice Creates a new proxy and initializes the implementation + * @param implementation The address of the implementation + * @param initParams The parameters that is passed to the implementation to initialize + * @return The address of initialized proxy + */ + function _initTokenWithProxy( + address implementation, + bytes memory initParams + ) internal returns (address) { + InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( + address(this) + ); + + proxy.initialize(implementation, initParams); + + return address(proxy); + } + + /** + * @notice Upgrades the implementation and makes call to the proxy + * @dev The call is used to initialize the new implementation. + * @param proxyAddress The address of the proxy + * @param implementation The address of the new implementation + * @param initParams The parameters to the call after the upgrade + */ + function _upgradeTokenImplementation( + address proxyAddress, + address implementation, + bytes memory initParams + ) internal { + InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( + payable(proxyAddress) + ); + + proxy.upgradeToAndCall(implementation, initParams); + } +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/pool/PoolConfigurator.sol + +/** + * @title PoolConfigurator + * @author Aave + * @dev Implements the configuration methods for the Aave protocol + */ +abstract contract PoolConfigurator is VersionedInitializable, IPoolConfigurator { + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + IPoolAddressesProvider internal _addressesProvider; + IPool internal _pool; + + mapping(address => uint256) internal _pendingLtv; + + uint40 public constant MAX_GRACE_PERIOD = 4 hours; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + _onlyPoolAdmin(); + _; + } + + /** + * @dev Only emergency or pool admin can call functions marked by this modifier. + */ + modifier onlyEmergencyOrPoolAdmin() { + _onlyPoolOrEmergencyAdmin(); + _; + } + + /** + * @dev Only asset listing or pool admin can call functions marked by this modifier. + */ + modifier onlyAssetListingOrPoolAdmins() { + _onlyAssetListingOrPoolAdmins(); + _; + } + + /** + * @dev Only risk or pool admin can call functions marked by this modifier. + */ + modifier onlyRiskOrPoolAdmins() { + _onlyRiskOrPoolAdmins(); + _; + } + + /** + * @dev Only risk, pool or emergency admin can call functions marked by this modifier. + */ + modifier onlyRiskOrPoolOrEmergencyAdmins() { + _onlyRiskOrPoolOrEmergencyAdmins(); + _; + } + + function initialize(IPoolAddressesProvider provider) public virtual; + + /// @inheritdoc IPoolConfigurator + function initReserves( + ConfiguratorInputTypes.InitReserveInput[] calldata input + ) external override onlyAssetListingOrPoolAdmins { + IPool cachedPool = _pool; + + for (uint256 i = 0; i < input.length; i++) { + ConfiguratorLogic.executeInitReserve(cachedPool, input[i]); + emit ReserveInterestRateDataChanged( + input[i].underlyingAsset, + input[i].interestRateStrategyAddress, + input[i].interestRateData + ); + } + } + + /// @inheritdoc IPoolConfigurator + function dropReserve(address asset) external override onlyPoolAdmin { + _pool.dropReserve(asset); + emit ReserveDropped(asset); + } + + /// @inheritdoc IPoolConfigurator + function updateAToken( + ConfiguratorInputTypes.UpdateATokenInput calldata input + ) external override onlyPoolAdmin { + ConfiguratorLogic.executeUpdateAToken(_pool, input); + } + + /// @inheritdoc IPoolConfigurator + function updateVariableDebtToken( + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external override onlyPoolAdmin { + ConfiguratorLogic.executeUpdateVariableDebtToken(_pool, input); + } + + /// @inheritdoc IPoolConfigurator + function setReserveBorrowing(address asset, bool enabled) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setBorrowingEnabled(enabled); + _pool.setConfiguration(asset, currentConfig); + emit ReserveBorrowing(asset, enabled); + } + + /// @inheritdoc IPoolConfigurator + function configureReserveAsCollateral( + address asset, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus + ) external override onlyRiskOrPoolAdmins { + //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_RESERVE_PARAMS); + + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + if (liquidationThreshold != 0) { + //liquidation bonus must be bigger than 100.00%, otherwise the liquidator would receive less + //collateral than needed to cover the debt + require(liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_PARAMS); + + //if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment + //a loan is taken there is enough collateral available to cover the liquidation bonus + require( + liquidationThreshold.percentMul(liquidationBonus) <= PercentageMath.PERCENTAGE_FACTOR, + Errors.INVALID_RESERVE_PARAMS + ); + } else { + require(liquidationBonus == 0, Errors.INVALID_RESERVE_PARAMS); + //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 supplied + _checkNoSuppliers(asset); + } + + uint256 newLtv = ltv; + + if (currentConfig.getFrozen()) { + _pendingLtv[asset] = ltv; + newLtv = 0; + + emit PendingLtvChanged(asset, ltv); + } else { + currentConfig.setLtv(ltv); + } + + currentConfig.setLiquidationThreshold(liquidationThreshold); + currentConfig.setLiquidationBonus(liquidationBonus); + + _pool.setConfiguration(asset, currentConfig); + + emit CollateralConfigurationChanged(asset, newLtv, liquidationThreshold, liquidationBonus); + } + + /// @inheritdoc IPoolConfigurator + function setReserveFlashLoaning( + address asset, + bool enabled + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + currentConfig.setFlashLoanEnabled(enabled); + _pool.setConfiguration(asset, currentConfig); + emit ReserveFlashLoaning(asset, enabled); + } + + /// @inheritdoc IPoolConfigurator + function setReserveActive(address asset, bool active) external override onlyPoolAdmin { + if (!active) _checkNoSuppliers(asset); + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setActive(active); + _pool.setConfiguration(asset, currentConfig); + emit ReserveActive(asset, active); + } + + /// @inheritdoc IPoolConfigurator + function setReserveFreeze( + address asset, + bool freeze + ) external override onlyRiskOrPoolOrEmergencyAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + require(freeze != currentConfig.getFrozen(), Errors.INVALID_FREEZE_STATE); + + currentConfig.setFrozen(freeze); + + uint256 ltvSet; + uint256 pendingLtvSet; + + if (freeze) { + pendingLtvSet = currentConfig.getLtv(); + _pendingLtv[asset] = pendingLtvSet; + currentConfig.setLtv(0); + } else { + ltvSet = _pendingLtv[asset]; + currentConfig.setLtv(ltvSet); + delete _pendingLtv[asset]; + } + + emit PendingLtvChanged(asset, pendingLtvSet); + emit CollateralConfigurationChanged( + asset, + ltvSet, + currentConfig.getLiquidationThreshold(), + currentConfig.getLiquidationBonus() + ); + + _pool.setConfiguration(asset, currentConfig); + emit ReserveFrozen(asset, freeze); + } + + /// @inheritdoc IPoolConfigurator + function setBorrowableInIsolation( + address asset, + bool borrowable + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setBorrowableInIsolation(borrowable); + _pool.setConfiguration(asset, currentConfig); + emit BorrowableInIsolationChanged(asset, borrowable); + } + + /// @inheritdoc IPoolConfigurator + function setReservePause( + address asset, + bool paused, + uint40 gracePeriod + ) public override onlyEmergencyOrPoolAdmin { + if (!paused && gracePeriod != 0) { + require(gracePeriod <= MAX_GRACE_PERIOD, Errors.INVALID_GRACE_PERIOD); + + uint40 until = uint40(block.timestamp) + gracePeriod; + _pool.setLiquidationGracePeriod(asset, until); + emit LiquidationGracePeriodChanged(asset, until); + } + + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setPaused(paused); + _pool.setConfiguration(asset, currentConfig); + emit ReservePaused(asset, paused); + } + + /// @inheritdoc IPoolConfigurator + function setReservePause(address asset, bool paused) external override onlyEmergencyOrPoolAdmin { + setReservePause(asset, paused, 0); + } + + /// @inheritdoc IPoolConfigurator + function disableLiquidationGracePeriod(address asset) external override onlyEmergencyOrPoolAdmin { + // set the liquidation grace period in the past to disable liquidation grace period + _pool.setLiquidationGracePeriod(asset, 0); + + emit LiquidationGracePeriodDisabled(asset); + } + + /// @inheritdoc IPoolConfigurator + function setReserveFactor( + address asset, + uint256 newReserveFactor + ) external override onlyRiskOrPoolAdmins { + require(newReserveFactor <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + _pool.syncIndexesState(asset); + + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldReserveFactor = currentConfig.getReserveFactor(); + currentConfig.setReserveFactor(newReserveFactor); + _pool.setConfiguration(asset, currentConfig); + emit ReserveFactorChanged(asset, oldReserveFactor, newReserveFactor); + + _pool.syncRatesState(asset); + } + + /// @inheritdoc IPoolConfigurator + function setDebtCeiling( + address asset, + uint256 newDebtCeiling + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + uint256 oldDebtCeiling = currentConfig.getDebtCeiling(); + if (currentConfig.getLiquidationThreshold() != 0 && oldDebtCeiling == 0) { + _checkNoSuppliers(asset); + } + currentConfig.setDebtCeiling(newDebtCeiling); + _pool.setConfiguration(asset, currentConfig); + + if (newDebtCeiling == 0) { + _pool.resetIsolationModeTotalDebt(asset); + } + + emit DebtCeilingChanged(asset, oldDebtCeiling, newDebtCeiling); + } + + /// @inheritdoc IPoolConfigurator + function setSiloedBorrowing( + address asset, + bool newSiloed + ) external override onlyRiskOrPoolAdmins { + if (newSiloed) { + _checkNoBorrowers(asset); + } + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + bool oldSiloed = currentConfig.getSiloedBorrowing(); + + currentConfig.setSiloedBorrowing(newSiloed); + + _pool.setConfiguration(asset, currentConfig); + + emit SiloedBorrowingChanged(asset, oldSiloed, newSiloed); + } + + /// @inheritdoc IPoolConfigurator + function setBorrowCap( + address asset, + uint256 newBorrowCap + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldBorrowCap = currentConfig.getBorrowCap(); + currentConfig.setBorrowCap(newBorrowCap); + _pool.setConfiguration(asset, currentConfig); + emit BorrowCapChanged(asset, oldBorrowCap, newBorrowCap); + } + + /// @inheritdoc IPoolConfigurator + function setSupplyCap( + address asset, + uint256 newSupplyCap + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldSupplyCap = currentConfig.getSupplyCap(); + currentConfig.setSupplyCap(newSupplyCap); + _pool.setConfiguration(asset, currentConfig); + emit SupplyCapChanged(asset, oldSupplyCap, newSupplyCap); + } + + /// @inheritdoc IPoolConfigurator + function setLiquidationProtocolFee( + address asset, + uint256 newFee + ) external override onlyRiskOrPoolAdmins { + require(newFee <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_LIQUIDATION_PROTOCOL_FEE); + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldFee = currentConfig.getLiquidationProtocolFee(); + currentConfig.setLiquidationProtocolFee(newFee); + _pool.setConfiguration(asset, currentConfig); + emit LiquidationProtocolFeeChanged(asset, oldFee, newFee); + } + + /// @inheritdoc IPoolConfigurator + function setEModeCategory( + uint8 categoryId, + uint16 ltv, + uint16 liquidationThreshold, + uint16 liquidationBonus, + string calldata label + ) external override onlyRiskOrPoolAdmins { + require(ltv != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); + require(liquidationThreshold != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); + + // 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_EMODE_CATEGORY_PARAMS); + require( + liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, + Errors.INVALID_EMODE_CATEGORY_PARAMS + ); + + // if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment + // a loan is taken there is enough collateral available to cover the liquidation bonus + require( + uint256(liquidationThreshold).percentMul(liquidationBonus) <= + PercentageMath.PERCENTAGE_FACTOR, + Errors.INVALID_EMODE_CATEGORY_PARAMS + ); + + DataTypes.EModeCategoryBaseConfiguration memory categoryData; + categoryData.ltv = ltv; + categoryData.liquidationThreshold = liquidationThreshold; + categoryData.liquidationBonus = liquidationBonus; + categoryData.label = label; + + _pool.configureEModeCategory(categoryId, categoryData); + emit EModeCategoryAdded( + categoryId, + ltv, + liquidationThreshold, + liquidationBonus, + address(0), + label + ); + } + + /// @inheritdoc IPoolConfigurator + function setAssetCollateralInEMode( + address asset, + uint8 categoryId, + bool allowed + ) external override onlyRiskOrPoolAdmins { + uint128 collateralBitmap = _pool.getEModeCategoryCollateralBitmap(categoryId); + DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); + require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED); + collateralBitmap = EModeConfiguration.setReserveBitmapBit( + collateralBitmap, + reserveData.id, + allowed + ); + _pool.configureEModeCategoryCollateralBitmap(categoryId, collateralBitmap); + emit AssetCollateralInEModeChanged(asset, categoryId, allowed); + } + + /// @inheritdoc IPoolConfigurator + function setAssetBorrowableInEMode( + address asset, + uint8 categoryId, + bool borrowable + ) external override onlyRiskOrPoolAdmins { + uint128 borrowableBitmap = _pool.getEModeCategoryBorrowableBitmap(categoryId); + DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); + require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED); + borrowableBitmap = EModeConfiguration.setReserveBitmapBit( + borrowableBitmap, + reserveData.id, + borrowable + ); + _pool.configureEModeCategoryBorrowableBitmap(categoryId, borrowableBitmap); + emit AssetBorrowableInEModeChanged(asset, categoryId, borrowable); + } + + /// @inheritdoc IPoolConfigurator + function setUnbackedMintCap( + address asset, + uint256 newUnbackedMintCap + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldUnbackedMintCap = currentConfig.getUnbackedMintCap(); + currentConfig.setUnbackedMintCap(newUnbackedMintCap); + _pool.setConfiguration(asset, currentConfig); + emit UnbackedMintCapChanged(asset, oldUnbackedMintCap, newUnbackedMintCap); + } + + /// @inheritdoc IPoolConfigurator + function setReserveInterestRateData( + address asset, + bytes calldata rateData + ) external onlyRiskOrPoolAdmins { + DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset); + _updateInterestRateStrategy(asset, reserve, reserve.interestRateStrategyAddress, rateData); + } + + /// @inheritdoc IPoolConfigurator + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress, + bytes calldata rateData + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset); + _updateInterestRateStrategy(asset, reserve, rateStrategyAddress, rateData); + } + + /// @inheritdoc IPoolConfigurator + function setPoolPause(bool paused, uint40 gracePeriod) public override onlyEmergencyOrPoolAdmin { + address[] memory reserves = _pool.getReservesList(); + + for (uint256 i = 0; i < reserves.length; i++) { + if (reserves[i] != address(0)) { + setReservePause(reserves[i], paused, gracePeriod); + } + } + } + + /// @inheritdoc IPoolConfigurator + function setPoolPause(bool paused) external override onlyEmergencyOrPoolAdmin { + setPoolPause(paused, 0); + } + + /// @inheritdoc IPoolConfigurator + function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external override onlyPoolAdmin { + require( + newBridgeProtocolFee <= PercentageMath.PERCENTAGE_FACTOR, + Errors.BRIDGE_PROTOCOL_FEE_INVALID + ); + uint256 oldBridgeProtocolFee = _pool.BRIDGE_PROTOCOL_FEE(); + _pool.updateBridgeProtocolFee(newBridgeProtocolFee); + emit BridgeProtocolFeeUpdated(oldBridgeProtocolFee, newBridgeProtocolFee); + } + + /// @inheritdoc IPoolConfigurator + function updateFlashloanPremiumTotal( + uint128 newFlashloanPremiumTotal + ) external override onlyPoolAdmin { + require( + newFlashloanPremiumTotal <= PercentageMath.PERCENTAGE_FACTOR, + Errors.FLASHLOAN_PREMIUM_INVALID + ); + uint128 oldFlashloanPremiumTotal = _pool.FLASHLOAN_PREMIUM_TOTAL(); + _pool.updateFlashloanPremiums(newFlashloanPremiumTotal, _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL()); + emit FlashloanPremiumTotalUpdated(oldFlashloanPremiumTotal, newFlashloanPremiumTotal); + } + + /// @inheritdoc IPoolConfigurator + function updateFlashloanPremiumToProtocol( + uint128 newFlashloanPremiumToProtocol + ) external override onlyPoolAdmin { + require( + newFlashloanPremiumToProtocol <= PercentageMath.PERCENTAGE_FACTOR, + Errors.FLASHLOAN_PREMIUM_INVALID + ); + uint128 oldFlashloanPremiumToProtocol = _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL(); + _pool.updateFlashloanPremiums(_pool.FLASHLOAN_PREMIUM_TOTAL(), newFlashloanPremiumToProtocol); + emit FlashloanPremiumToProtocolUpdated( + oldFlashloanPremiumToProtocol, + newFlashloanPremiumToProtocol + ); + } + + /// @inheritdoc IPoolConfigurator + function getPendingLtv(address asset) external view override returns (uint256) { + return _pendingLtv[asset]; + } + + /// @inheritdoc IPoolConfigurator + function getConfiguratorLogic() external pure returns (address) { + return address(ConfiguratorLogic); + } + + function _updateInterestRateStrategy( + address asset, + DataTypes.ReserveDataLegacy memory reserve, + address newRateStrategyAddress, + bytes calldata rateData + ) internal { + address oldRateStrategyAddress = reserve.interestRateStrategyAddress; + + _pool.syncIndexesState(asset); + + IDefaultInterestRateStrategyV2(newRateStrategyAddress).setInterestRateParams(asset, rateData); + emit ReserveInterestRateDataChanged(asset, newRateStrategyAddress, rateData); + + if (oldRateStrategyAddress != newRateStrategyAddress) { + _pool.setReserveInterestRateStrategyAddress(asset, newRateStrategyAddress); + emit ReserveInterestRateStrategyChanged( + asset, + oldRateStrategyAddress, + newRateStrategyAddress + ); + } + + _pool.syncRatesState(asset); + } + + function _checkNoSuppliers(address asset) internal view { + DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); + uint256 totalSupplied = IPoolDataProvider(_addressesProvider.getPoolDataProvider()) + .getATokenTotalSupply(asset); + + require( + totalSupplied == 0 && reserveData.accruedToTreasury == 0, + Errors.RESERVE_LIQUIDITY_NOT_ZERO + ); + } + + function _checkNoBorrowers(address asset) internal view { + uint256 totalDebt = IPoolDataProvider(_addressesProvider.getPoolDataProvider()).getTotalDebt( + asset + ); + require(totalDebt == 0, Errors.RESERVE_DEBT_NOT_ZERO); + } + + function _onlyPoolAdmin() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + } + + function _onlyPoolOrEmergencyAdmin() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isPoolAdmin(msg.sender) || aclManager.isEmergencyAdmin(msg.sender), + Errors.CALLER_NOT_POOL_OR_EMERGENCY_ADMIN + ); + } + + function _onlyAssetListingOrPoolAdmins() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), + Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN + ); + } + + function _onlyRiskOrPoolAdmins() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isRiskAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), + Errors.CALLER_NOT_RISK_OR_POOL_ADMIN + ); + } + + function _onlyRiskOrPoolOrEmergencyAdmins() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isRiskAdmin(msg.sender) || + aclManager.isPoolAdmin(msg.sender) || + aclManager.isEmergencyAdmin(msg.sender), + Errors.CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN + ); + } +} + +// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/instances/PoolConfiguratorInstance.sol + +contract PoolConfiguratorInstance is PoolConfigurator { + uint256 public constant CONFIGURATOR_REVISION = 4; + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure virtual override returns (uint256) { + return CONFIGURATOR_REVISION; + } + + function initialize(IPoolAddressesProvider provider) public virtual override initializer { + _addressesProvider = provider; + _pool = IPool(_addressesProvider.getPool()); + } +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol new file mode 100644 index 00000000..aec817cb --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import './Proxy.sol'; +import '../contracts/Address.sol'; + +/** + * @title BaseUpgradeabilityProxy + * @dev This contract implements a proxy that allows to change the + * implementation address to which it will delegate. + * Such a change is called an implementation upgrade. + */ +contract BaseUpgradeabilityProxy is Proxy { + /** + * @dev Emitted when the implementation is upgraded. + * @param implementation Address of the new implementation. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Storage slot with the address of the current implementation. + * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is + * validated in the constructor. + */ + bytes32 internal constant IMPLEMENTATION_SLOT = + 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + /** + * @dev Returns the current implementation. + * @return impl Address of the current implementation + */ + function _implementation() internal view override returns (address impl) { + bytes32 slot = IMPLEMENTATION_SLOT; + //solium-disable-next-line + assembly { + impl := sload(slot) + } + } + + /** + * @dev Upgrades the proxy to a new implementation. + * @param newImplementation Address of the new implementation. + */ + function _upgradeTo(address newImplementation) internal { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + } + + /** + * @dev Sets the implementation address of the proxy. + * @param newImplementation Address of the new implementation. + */ + function _setImplementation(address newImplementation) internal { + require( + Address.isContract(newImplementation), + 'Cannot set a proxy implementation to a non-contract address' + ); + + bytes32 slot = IMPLEMENTATION_SLOT; + + //solium-disable-next-line + assembly { + sstore(slot, newImplementation) + } + } +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol new file mode 100644 index 00000000..4b43fa6a --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import './BaseUpgradeabilityProxy.sol'; + +/** + * @title InitializableUpgradeabilityProxy + * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing + * implementation and init data. + */ +contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { + /** + * @dev Contract initializer. + * @param _logic Address of the initial implementation. + * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. + */ + function initialize(address _logic, bytes memory _data) public payable { + require(_implementation() == address(0)); + assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); + _setImplementation(_logic); + if (_data.length > 0) { + (bool success, ) = _logic.delegatecall(_data); + require(success); + } + } +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol new file mode 100644 index 00000000..53589441 --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title Proxy + * @dev Implements delegation of calls to other contracts, with proper + * forwarding of return values and bubbling of failures. + * It defines a fallback function that delegates all calls to the address + * returned by the abstract _implementation() internal function. + */ +abstract contract Proxy { + /** + * @dev Fallback function. + * Will run if no other function in the contract matches the call data. + * Implemented entirely in `_fallback`. + */ + fallback() external payable { + _fallback(); + } + + /** + * @dev Fallback function that will run if call data is empty. + * IMPORTANT. receive() on implementation contracts will be unreachable + */ + receive() external payable { + _fallback(); + } + + /** + * @return The Address of the implementation. + */ + function _implementation() internal view virtual returns (address); + + /** + * @dev Delegates execution to an implementation contract. + * This is a low level function that doesn't return to its internal call site. + * It will return to the external caller whatever the implementation returns. + * @param implementation Address to delegate. + */ + function _delegate(address implementation) internal { + //solium-disable-next-line + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + /** + * @dev Function that is run as the first thing in the fallback function. + * Can be redefined in derived contracts to add functionality. + * Redefinitions must call super._willFallback(). + */ + function _willFallback() internal virtual {} + + /** + * @dev fallback implementation. + * Extracted to enable manual triggering. + */ + function _fallback() internal { + _willFallback(); + _delegate(_implementation()); + } +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/instances/PoolConfiguratorInstance.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/instances/PoolConfiguratorInstance.sol new file mode 100644 index 00000000..8d2e4939 --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/instances/PoolConfiguratorInstance.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {PoolConfigurator, IPoolAddressesProvider, IPool, VersionedInitializable} from '../protocol/pool/PoolConfigurator.sol'; + +contract PoolConfiguratorInstance is PoolConfigurator { + uint256 public constant CONFIGURATOR_REVISION = 4; + + /// @inheritdoc VersionedInitializable + function getRevision() internal pure virtual override returns (uint256) { + return CONFIGURATOR_REVISION; + } + + function initialize(IPoolAddressesProvider provider) public virtual override initializer { + _addressesProvider = provider; + _pool = IPool(_addressesProvider.getPool()); + } +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol new file mode 100644 index 00000000..938e2d8f --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IReserveInterestRateStrategy} from './IReserveInterestRateStrategy.sol'; +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IDefaultInterestRateStrategyV2 + * @author BGD Labs + * @notice Interface of the default interest rate strategy used by the Aave protocol + */ +interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { + /** + * @notice Holds the interest rate data for a given reserve + * + * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This + * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. + * + * @param optimalUsageRatio The optimal usage ratio, in bps + * @param baseVariableBorrowRate The base variable borrow rate, in bps + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps + */ + struct InterestRateData { + uint16 optimalUsageRatio; + uint32 baseVariableBorrowRate; + uint32 variableRateSlope1; + uint32 variableRateSlope2; + } + + /** + * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, + * used in in-memory calculations. + * + * @param optimalUsageRatio The optimal usage ratio + * @param baseVariableBorrowRate The base variable borrow rate + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio + */ + struct InterestRateDataRay { + uint256 optimalUsageRatio; + uint256 baseVariableBorrowRate; + uint256 variableRateSlope1; + uint256 variableRateSlope2; + } + + /** + * @notice emitted when new interest rate data is set in a reserve + * + * @param reserve address of the reserve that has new interest rate data set + * @param optimalUsageRatio The optimal usage ratio, in bps + * @param baseVariableBorrowRate The base variable borrow rate, in bps + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps + */ + event RateDataUpdate( + address indexed reserve, + uint256 optimalUsageRatio, + uint256 baseVariableBorrowRate, + uint256 variableRateSlope1, + uint256 variableRateSlope2 + ); + + /** + * @notice Returns the address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the maximum value achievable for variable borrow rate, in bps + * @return The maximum rate + */ + function MAX_BORROW_RATE() external view returns (uint256); + + /** + * @notice Returns the minimum optimal point, in bps + * @return The optimal point + */ + function MIN_OPTIMAL_POINT() external view returns (uint256); + + /** + * @notice Returns the maximum optimal point, in bps + * @return The optimal point + */ + function MAX_OPTIMAL_POINT() external view returns (uint256); + + /** + * notice Returns the full InterestRateData object for the given reserve, in ray + * + * @param reserve The reserve to get the data of + * + * @return The InterestRateDataRay object for the given reserve + */ + function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); + + /** + * notice Returns the full InterestRateDataRay object for the given reserve, in bps + * + * @param reserve The reserve to get the data of + * + * @return The InterestRateData object for the given reserve + */ + function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); + + /** + * @notice Returns the optimal usage rate for the given reserve in ray + * + * @param reserve The reserve to get the optimal usage rate of + * + * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate + */ + function getOptimalUsageRatio(address reserve) external view returns (uint256); + + /** + * @notice Returns the variable rate slope below optimal usage ratio in ray + * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO + * + * @param reserve The reserve to get the variable rate slope 1 of + * + * @return The variable rate slope + */ + function getVariableRateSlope1(address reserve) external view returns (uint256); + + /** + * @notice Returns the variable rate slope above optimal usage ratio in ray + * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO + * + * @param reserve The reserve to get the variable rate slope 2 of + * + * @return The variable rate slope + */ + function getVariableRateSlope2(address reserve) external view returns (uint256); + + /** + * @notice Returns the base variable borrow rate, in ray + * + * @param reserve The reserve to get the base variable borrow rate of + * + * @return The base variable borrow rate + */ + function getBaseVariableBorrowRate(address reserve) external view returns (uint256); + + /** + * @notice Returns the maximum variable borrow rate, in ray + * + * @param reserve The reserve to get the maximum variable borrow rate of + * + * @return The maximum variable borrow rate + */ + function getMaxVariableBorrowRate(address reserve) external view returns (uint256); + + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The reserve interest rate data to apply to the given reserve + * Being specific to this custom implementation, with custom struct type, + * overloading the function on the generic interface + */ + function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPool.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolConfigurator.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolConfigurator.sol new file mode 100644 index 00000000..977d316e --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolConfigurator.sol @@ -0,0 +1,551 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {ConfiguratorInputTypes} from '../protocol/libraries/types/ConfiguratorInputTypes.sol'; +import {IDefaultInterestRateStrategyV2} from './IDefaultInterestRateStrategyV2.sol'; + +/** + * @title IPoolConfigurator + * @author Aave + * @notice Defines the basic interface for a Pool configurator. + */ +interface IPoolConfigurator { + /** + * @dev Emitted when a reserve is initialized. + * @param asset The address of the underlying asset of the reserve + * @param aToken The address of the associated aToken contract + * @param stableDebtToken, DEPRECATED in v3.2.0 + * @param variableDebtToken The address of the associated variable rate debt token + * @param interestRateStrategyAddress The address of the interest rate strategy for the reserve + */ + event ReserveInitialized( + address indexed asset, + address indexed aToken, + address stableDebtToken, + address variableDebtToken, + address interestRateStrategyAddress + ); + + /** + * @dev Emitted when borrowing is enabled or disabled on a reserve. + * @param asset The address of the underlying asset of the reserve + * @param enabled True if borrowing is enabled, false otherwise + */ + event ReserveBorrowing(address indexed asset, bool enabled); + + /** + * @dev Emitted when flashloans are enabled or disabled on a reserve. + * @param asset The address of the underlying asset of the reserve + * @param enabled True if flashloans are enabled, false otherwise + */ + event ReserveFlashLoaning(address indexed asset, bool enabled); + + /** + * @dev Emitted when the ltv is set for the frozen asset. + * @param asset The address of the underlying asset of the reserve + * @param ltv The loan to value of the asset when used as collateral + */ + event PendingLtvChanged(address indexed asset, uint256 ltv); + + /** + * @dev Emitted when the collateralization risk parameters for the specified asset are updated. + * @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 + */ + event CollateralConfigurationChanged( + address indexed asset, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus + ); + + /** + * @dev Emitted when a reserve is activated or deactivated + * @param asset The address of the underlying asset of the reserve + * @param active True if reserve is active, false otherwise + */ + event ReserveActive(address indexed asset, bool active); + + /** + * @dev Emitted when a reserve is frozen or unfrozen + * @param asset The address of the underlying asset of the reserve + * @param frozen True if reserve is frozen, false otherwise + */ + event ReserveFrozen(address indexed asset, bool frozen); + + /** + * @dev Emitted when a reserve is paused or unpaused + * @param asset The address of the underlying asset of the reserve + * @param paused True if reserve is paused, false otherwise + */ + event ReservePaused(address indexed asset, bool paused); + + /** + * @dev Emitted when a reserve is dropped. + * @param asset The address of the underlying asset of the reserve + */ + event ReserveDropped(address indexed asset); + + /** + * @dev Emitted when a reserve factor is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldReserveFactor The old reserve factor, expressed in bps + * @param newReserveFactor The new reserve factor, expressed in bps + */ + event ReserveFactorChanged( + address indexed asset, + uint256 oldReserveFactor, + uint256 newReserveFactor + ); + + /** + * @dev Emitted when the borrow cap of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldBorrowCap The old borrow cap + * @param newBorrowCap The new borrow cap + */ + event BorrowCapChanged(address indexed asset, uint256 oldBorrowCap, uint256 newBorrowCap); + + /** + * @dev Emitted when the supply cap of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldSupplyCap The old supply cap + * @param newSupplyCap The new supply cap + */ + event SupplyCapChanged(address indexed asset, uint256 oldSupplyCap, uint256 newSupplyCap); + + /** + * @dev Emitted when the liquidation protocol fee of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldFee The old liquidation protocol fee, expressed in bps + * @param newFee The new liquidation protocol fee, expressed in bps + */ + event LiquidationProtocolFeeChanged(address indexed asset, uint256 oldFee, uint256 newFee); + + /** + * @dev Emitted when the liquidation grace period is updated. + * @param asset The address of the underlying asset of the reserve + * @param gracePeriodUntil Timestamp until when liquidations will not be allowed post-unpause + */ + event LiquidationGracePeriodChanged(address indexed asset, uint40 gracePeriodUntil); + + /** + * @dev Emitted when the liquidation grace period is disabled. + * @param asset The address of the underlying asset of the reserve + */ + event LiquidationGracePeriodDisabled(address indexed asset); + + /** + * @dev Emitted when the unbacked mint cap of a reserve is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldUnbackedMintCap The old unbacked mint cap + * @param newUnbackedMintCap The new unbacked mint cap + */ + event UnbackedMintCapChanged( + address indexed asset, + uint256 oldUnbackedMintCap, + uint256 newUnbackedMintCap + ); + + /** + * @dev Emitted when an collateral configuration of an asset in an eMode is changed. + * @param asset The address of the underlying asset of the reserve + * @param categoryId The eMode category + * @param collateral True if the asset is enabled as collateral in the eMode, false otherwise. + */ + event AssetCollateralInEModeChanged(address indexed asset, uint8 categoryId, bool collateral); + + /** + * @dev Emitted when the borrowable configuration of an asset in an eMode changed. + * @param asset The address of the underlying asset of the reserve + * @param categoryId The eMode category + * @param borrowable True if the asset is enabled as borrowable in the eMode, false otherwise. + */ + event AssetBorrowableInEModeChanged(address indexed asset, uint8 categoryId, bool borrowable); + + /** + * @dev Emitted when a new eMode category is added or an existing category is altered. + * @param categoryId The new eMode category id + * @param ltv The ltv for the asset category in eMode + * @param liquidationThreshold The liquidationThreshold for the asset category in eMode + * @param liquidationBonus The liquidationBonus for the asset category in eMode + * @param oracle DEPRECATED in v3.2.0 + * @param label A human readable identifier for the category + */ + event EModeCategoryAdded( + uint8 indexed categoryId, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + address oracle, + string label + ); + + /** + * @dev Emitted when a reserve interest strategy contract is updated. + * @param asset The address of the underlying asset of the reserve + * @param oldStrategy The address of the old interest strategy contract + * @param newStrategy The address of the new interest strategy contract + */ + event ReserveInterestRateStrategyChanged( + address indexed asset, + address oldStrategy, + address newStrategy + ); + + /** + * @dev Emitted when the data of a reserve interest strategy contract is updated. + * @param asset The address of the underlying asset of the reserve + * @param data abi encoded data + */ + event ReserveInterestRateDataChanged(address indexed asset, address indexed strategy, bytes data); + + /** + * @dev Emitted when an aToken implementation is upgraded. + * @param asset The address of the underlying asset of the reserve + * @param proxy The aToken proxy address + * @param implementation The new aToken implementation + */ + event ATokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @dev Emitted when the implementation of a variable debt token is upgraded. + * @param asset The address of the underlying asset of the reserve + * @param proxy The variable debt token proxy address + * @param implementation The new aToken implementation + */ + event VariableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @dev Emitted when the debt ceiling of an asset is set. + * @param asset The address of the underlying asset of the reserve + * @param oldDebtCeiling The old debt ceiling + * @param newDebtCeiling The new debt ceiling + */ + event DebtCeilingChanged(address indexed asset, uint256 oldDebtCeiling, uint256 newDebtCeiling); + + /** + * @dev Emitted when the the siloed borrowing state for an asset is changed. + * @param asset The address of the underlying asset of the reserve + * @param oldState The old siloed borrowing state + * @param newState The new siloed borrowing state + */ + event SiloedBorrowingChanged(address indexed asset, bool oldState, bool newState); + + /** + * @dev Emitted when the bridge protocol fee is updated. + * @param oldBridgeProtocolFee The old protocol fee, expressed in bps + * @param newBridgeProtocolFee The new protocol fee, expressed in bps + */ + event BridgeProtocolFeeUpdated(uint256 oldBridgeProtocolFee, uint256 newBridgeProtocolFee); + + /** + * @dev Emitted when the total premium on flashloans is updated. + * @param oldFlashloanPremiumTotal The old premium, expressed in bps + * @param newFlashloanPremiumTotal The new premium, expressed in bps + */ + event FlashloanPremiumTotalUpdated( + uint128 oldFlashloanPremiumTotal, + uint128 newFlashloanPremiumTotal + ); + + /** + * @dev Emitted when the part of the premium that goes to protocol is updated. + * @param oldFlashloanPremiumToProtocol The old premium, expressed in bps + * @param newFlashloanPremiumToProtocol The new premium, expressed in bps + */ + event FlashloanPremiumToProtocolUpdated( + uint128 oldFlashloanPremiumToProtocol, + uint128 newFlashloanPremiumToProtocol + ); + + /** + * @dev Emitted when the reserve is set as borrowable/non borrowable in isolation mode. + * @param asset The address of the underlying asset of the reserve + * @param borrowable True if the reserve is borrowable in isolation, false otherwise + */ + event BorrowableInIsolationChanged(address asset, bool borrowable); + + /** + * @notice Initializes multiple reserves. + * @dev param useVirtualBalance of the input struct should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param input The array of initialization parameters + */ + function initReserves(ConfiguratorInputTypes.InitReserveInput[] calldata input) external; + + /** + * @dev Updates the aToken implementation for the reserve. + * @param input The aToken update parameters + */ + function updateAToken(ConfiguratorInputTypes.UpdateATokenInput calldata input) external; + + /** + * @notice Updates the variable debt token implementation for the asset. + * @param input The variableDebtToken update parameters + */ + function updateVariableDebtToken( + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external; + + /** + * @notice Configures borrowing on a reserve. + * @param asset The address of the underlying asset of the reserve + * @param enabled True if borrowing needs to be enabled, false otherwise + */ + function setReserveBorrowing(address asset, bool enabled) external; + + /** + * @notice Configures the reserve collateralization parameters. + * @dev All the values are expressed in bps. A value of 10000, results in 100.00% + * @dev The `liquidationBonus` is always above 100%. A value of 105% means the liquidator will receive a 5% bonus + * @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 + */ + function configureReserveAsCollateral( + address asset, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus + ) external; + + /** + * @notice Enable or disable flashloans on a reserve + * @param asset The address of the underlying asset of the reserve + * @param enabled True if flashloans need to be enabled, false otherwise + */ + function setReserveFlashLoaning(address asset, bool enabled) external; + + /** + * @notice Activate or deactivate a reserve + * @param asset The address of the underlying asset of the reserve + * @param active True if the reserve needs to be active, false otherwise + */ + function setReserveActive(address asset, bool active) external; + + /** + * @notice Freeze or unfreeze a reserve. A frozen reserve doesn't allow any new supply, borrow + * or rate swap but allows repayments, liquidations, rate rebalances and withdrawals. + * @param asset The address of the underlying asset of the reserve + * @param freeze True if the reserve needs to be frozen, false otherwise + */ + function setReserveFreeze(address asset, bool freeze) external; + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the + * borrowed amount will be accumulated in the isolated collateral's total debt exposure + * @dev Only assets of the same family (e.g. USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations + * @param asset The address of the underlying asset of the reserve + * @param borrowable True if the asset should be borrowable in isolation, false otherwise + */ + function setBorrowableInIsolation(address asset, bool borrowable) external; + + /** + * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, + * swap interest rate, liquidate, atoken transfers). + * @param asset The address of the underlying asset of the reserve + * @param paused True if pausing the reserve, false if unpausing + * @param gracePeriod Count of seconds after unpause during which liquidations will not be available + * - Only applicable whenever unpausing (`paused` as false) + * - Passing 0 means no grace period + * - Capped to maximum MAX_GRACE_PERIOD + */ + function setReservePause(address asset, bool paused, uint40 gracePeriod) external; + + /** + * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, + * swap interest rate, liquidate, atoken transfers). + * @dev Version with no grace period + * @param asset The address of the underlying asset of the reserve + * @param paused True if pausing the reserve, false if unpausing + */ + function setReservePause(address asset, bool paused) external; + + /** + * @notice Disables liquidation grace period for the asset. The liquidation grace period is set in the past + * so that liquidations are allowed for the asset. + * @param asset The address of the underlying asset of the reserve + */ + function disableLiquidationGracePeriod(address asset) external; + + /** + * @notice Updates the reserve factor of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newReserveFactor The new reserve factor of the reserve + */ + function setReserveFactor(address asset, uint256 newReserveFactor) external; + + /** + * @notice Sets the interest rate strategy of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newRateStrategyAddress The address of the new interest strategy contract + * @param rateData bytes-encoded rate data. In this format in order to allow the rate strategy contract + * to de-structure custom data + */ + function setReserveInterestRateStrategyAddress( + address asset, + address newRateStrategyAddress, + bytes calldata rateData + ) external; + + /** + * @notice Sets interest rate data for a reserve + * @param asset The address of the underlying asset of the reserve + * @param rateData bytes-encoded rate data. In this format in order to allow the rate strategy contract + * to de-structure custom data + */ + function setReserveInterestRateData(address asset, bytes calldata rateData) external; + + /** + * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions + * are suspended. + * @param paused True if protocol needs to be paused, false otherwise + * @param gracePeriod Count of seconds after unpause during which liquidations will not be available + * - Only applicable whenever unpausing (`paused` as false) + * - Passing 0 means no grace period + * - Capped to maximum MAX_GRACE_PERIOD + */ + function setPoolPause(bool paused, uint40 gracePeriod) external; + + /** + * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions + * are suspended. + * @dev Version with no grace period + * @param paused True if protocol needs to be paused, false otherwise + */ + function setPoolPause(bool paused) external; + + /** + * @notice Updates the borrow cap of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newBorrowCap The new borrow cap of the reserve + */ + function setBorrowCap(address asset, uint256 newBorrowCap) external; + + /** + * @notice Updates the supply cap of a reserve. + * @param asset The address of the underlying asset of the reserve + * @param newSupplyCap The new supply cap of the reserve + */ + function setSupplyCap(address asset, uint256 newSupplyCap) external; + + /** + * @notice Updates the liquidation protocol fee of reserve. + * @param asset The address of the underlying asset of the reserve + * @param newFee The new liquidation protocol fee of the reserve, expressed in bps + */ + function setLiquidationProtocolFee(address asset, uint256 newFee) external; + + /** + * @notice Updates the unbacked mint cap of reserve. + * @param asset The address of the underlying asset of the reserve + * @param newUnbackedMintCap The new unbacked mint cap of the reserve + */ + function setUnbackedMintCap(address asset, uint256 newUnbackedMintCap) external; + + /** + * @notice Enables/disables an asset to be borrowable in a selected eMode. + * - eMode.borrowable always has less priority then reserve.borrowable + * @param asset The address of the underlying asset of the reserve + * @param categoryId The eMode categoryId + * @param borrowable True if the asset should be borrowable in the given eMode category, false otherwise. + */ + function setAssetBorrowableInEMode(address asset, uint8 categoryId, bool borrowable) external; + + /** + * @notice Enables/disables an asset to be collateral in a selected eMode. + * @param asset The address of the underlying asset of the reserve + * @param categoryId The eMode categoryId + * @param collateral True if the asset should be collateral in the given eMode category, false otherwise. + */ + function setAssetCollateralInEMode(address asset, uint8 categoryId, bool collateral) external; + + /** + * @notice Adds a new efficiency mode (eMode) category or alters a existing one. + * @param categoryId The id of the category to be configured + * @param ltv The ltv associated with the category + * @param liquidationThreshold The liquidation threshold associated with the category + * @param liquidationBonus The liquidation bonus associated with the category + * @param label A label identifying the category + */ + function setEModeCategory( + uint8 categoryId, + uint16 ltv, + uint16 liquidationThreshold, + uint16 liquidationBonus, + string calldata label + ) external; + + /** + * @notice Drops a reserve entirely. + * @param asset The address of the reserve to drop + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the bridge fee collected by the protocol reserves. + * @param newBridgeProtocolFee The part of the fee sent to the protocol treasury, expressed in bps + */ + function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external; + + /** + * @notice Updates the total flash loan premium. + * Total flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra balance + * - A part is collected by the protocol reserves + * @dev Expressed in bps + * @dev The premium is calculated on the total amount borrowed + * @param newFlashloanPremiumTotal The total flashloan premium + */ + function updateFlashloanPremiumTotal(uint128 newFlashloanPremiumTotal) external; + + /** + * @notice Updates the flash loan premium collected by protocol reserves + * @dev Expressed in bps + * @dev The premium to protocol is calculated on the total flashloan premium + * @param newFlashloanPremiumToProtocol The part of the flashloan premium sent to the protocol treasury + */ + function updateFlashloanPremiumToProtocol(uint128 newFlashloanPremiumToProtocol) external; + + /** + * @notice Sets the debt ceiling for an asset. + * @param newDebtCeiling The new debt ceiling + */ + function setDebtCeiling(address asset, uint256 newDebtCeiling) external; + + /** + * @notice Sets siloed borrowing for an asset + * @param siloed The new siloed borrowing state + */ + function setSiloedBorrowing(address asset, bool siloed) external; + + /** + * @notice Gets pending ltv value + * @param asset The new siloed borrowing state + */ + function getPendingLtv(address asset) external view returns (uint256); + + /** + * @notice Gets the address of the external ConfiguratorLogic + */ + function getConfiguratorLogic() external view returns (address); + + /** + * @notice Gets the maximum liquidations grace period allowed, in seconds + */ + function MAX_GRACE_PERIOD() external view returns (uint40); +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolDataProvider.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolDataProvider.sol new file mode 100644 index 00000000..a9df8903 --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolDataProvider.sol @@ -0,0 +1,250 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPoolDataProvider + * @author Aave + * @notice Defines the basic interface of a PoolDataProvider + */ +interface IPoolDataProvider { + struct TokenData { + string symbol; + address tokenAddress; + } + + /** + * @notice Returns the address for the PoolAddressesProvider contract. + * @return The address for the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the list of the existing reserves in the pool. + * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. + * @return The list of reserves, pairs of symbols and addresses + */ + function getAllReservesTokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the list of the existing ATokens in the pool. + * @return The list of ATokens, pairs of symbols and addresses + */ + function getAllATokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the configuration data of the reserve + * @dev Not returning borrow and supply caps for compatibility, nor pause flag + * @param asset The address of the underlying asset of the reserve + * @return decimals The number of decimals of the reserve + * @return ltv The ltv of the reserve + * @return liquidationThreshold The liquidationThreshold of the reserve + * @return liquidationBonus The liquidationBonus of the reserve + * @return reserveFactor The reserveFactor of the reserve + * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise + * @return borrowingEnabled True if borrowing is enabled, false otherwise + * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise + * @return isActive True if it is active, false otherwise + * @return isFrozen True if it is frozen, false otherwise + */ + function getReserveConfigurationData( + address asset + ) + external + view + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ); + + /** + * @notice Returns the caps parameters of the reserve + * @param asset The address of the underlying asset of the reserve + * @return borrowCap The borrow cap of the reserve + * @return supplyCap The supply cap of the reserve + */ + function getReserveCaps( + address asset + ) external view returns (uint256 borrowCap, uint256 supplyCap); + + /** + * @notice Returns if the pool is paused + * @param asset The address of the underlying asset of the reserve + * @return isPaused True if the pool is paused, false otherwise + */ + function getPaused(address asset) external view returns (bool isPaused); + + /** + * @notice Returns the siloed borrowing flag + * @param asset The address of the underlying asset of the reserve + * @return True if the asset is siloed for borrowing + */ + function getSiloedBorrowing(address asset) external view returns (bool); + + /** + * @notice Returns the protocol fee on the liquidation bonus + * @param asset The address of the underlying asset of the reserve + * @return The protocol fee on liquidation + */ + function getLiquidationProtocolFee(address asset) external view returns (uint256); + + /** + * @notice Returns the unbacked mint cap of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The unbacked mint cap of the reserve + */ + function getUnbackedMintCap(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The debt ceiling of the reserve + */ + function getDebtCeiling(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling decimals + * @return The debt ceiling decimals + */ + function getDebtCeilingDecimals() external pure returns (uint256); + + /** + * @notice Returns the reserve data + * @param asset The address of the underlying asset of the reserve + * @return unbacked The amount of unbacked tokens + * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted + * @return totalAToken The total supply of the aToken + * @return totalStableDebt The total stable debt of the reserve + * @return totalVariableDebt The total variable debt of the reserve + * @return liquidityRate The liquidity rate of the reserve + * @return variableBorrowRate The variable borrow rate of the reserve + * @return stableBorrowRate The stable borrow rate of the reserve + * @return averageStableBorrowRate The average stable borrow rate of the reserve + * @return liquidityIndex The liquidity index of the reserve + * @return variableBorrowIndex The variable borrow index of the reserve + * @return lastUpdateTimestamp The timestamp of the last update of the reserve + */ + function getReserveData( + address asset + ) + external + view + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ); + + /** + * @notice Returns the total supply of aTokens for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total supply of the aToken + */ + function getATokenTotalSupply(address asset) external view returns (uint256); + + /** + * @notice Returns the total debt for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total debt for asset + */ + function getTotalDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the user data in a reserve + * @param asset The address of the underlying asset of the reserve + * @param user The address of the user + * @return currentATokenBalance The current AToken balance of the user + * @return currentStableDebt The current stable debt of the user + * @return currentVariableDebt The current variable debt of the user + * @return principalStableDebt The principal stable debt of the user + * @return scaledVariableDebt The scaled variable debt of the user + * @return stableBorrowRate The stable borrow rate of the user + * @return liquidityRate The liquidity rate of the reserve + * @return stableRateLastUpdated The timestamp of the last update of the user stable rate + * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false + * otherwise + */ + function getUserReserveData( + address asset, + address user + ) + external + view + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ); + + /** + * @notice Returns the token addresses of the reserve + * @param asset The address of the underlying asset of the reserve + * @return aTokenAddress The AToken address of the reserve + * @return stableDebtTokenAddress DEPRECATED in v3.2.0 + * @return variableDebtTokenAddress The VariableDebtToken address of the reserve + */ + function getReserveTokensAddresses( + address asset + ) + external + view + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ); + + /** + * @notice Returns the address of the Interest Rate strategy + * @param asset The address of the underlying asset of the reserve + * @return irStrategyAddress The address of the Interest Rate strategy + */ + function getInterestRateStrategyAddress( + address asset + ) external view returns (address irStrategyAddress); + + /** + * @notice Returns whether the reserve has FlashLoans enabled or disabled + * @param asset The address of the underlying asset of the reserve + * @return True if FlashLoans are enabled, false otherwise + */ + function getFlashLoanEnabled(address asset) external view returns (bool); + + /** + * @notice Returns whether virtual accounting is enabled/not for a reserve + * @param asset The address of the underlying asset of the reserve + * @return True if active, false otherwise + */ + function getIsVirtualAccActive(address asset) external view returns (bool); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint256); +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..252b4a4b --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {BaseUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol'; + +/** + * @title BaseImmutableAdminUpgradeabilityProxy + * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern + * @notice This contract combines an upgradeability proxy with an authorization + * mechanism for administrative tasks. + * @dev The admin role is stored in an immutable, which helps saving transactions costs + * All external functions in this contract must be guarded by the + * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity + * feature proposal that would enable this to be done automatically. + */ +contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { + address internal immutable _admin; + + /** + * @dev Constructor. + * @param admin_ The address of the admin + */ + constructor(address admin_) { + _admin = admin_; + } + + modifier ifAdmin() { + if (msg.sender == _admin) { + _; + } else { + _fallback(); + } + } + + /** + * @notice Return the admin address + * @return The address of the proxy admin. + */ + function admin() external ifAdmin returns (address) { + return _admin; + } + + /** + * @notice Return the implementation address + * @return The address of the implementation. + */ + function implementation() external ifAdmin returns (address) { + return _implementation(); + } + + /** + * @notice Upgrade the backing implementation of the proxy. + * @dev Only the admin can call this function. + * @param newImplementation The address of the new implementation. + */ + function upgradeTo(address newImplementation) external ifAdmin { + _upgradeTo(newImplementation); + } + + /** + * @notice Upgrade the backing implementation of the proxy and call a function + * on the new implementation. + * @dev This is useful to initialize the proxied contract. + * @param newImplementation The address of the new implementation. + * @param data Data to send as msg.data in the low level call. + * It should include the signature and the parameters of the function to be called, as described in + * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. + */ + function upgradeToAndCall( + address newImplementation, + bytes calldata data + ) external payable ifAdmin { + _upgradeTo(newImplementation); + (bool success, ) = newImplementation.delegatecall(data); + require(success); + } + + /** + * @notice Only fall back when the sender is not the admin. + */ + function _willFallback() internal virtual override { + require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); + super._willFallback(); + } +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol new file mode 100644 index 00000000..6913a19d --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {InitializableUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol'; +import {Proxy} from '../../dependencies/openzeppelin/upgradeability/Proxy.sol'; +import {BaseImmutableAdminUpgradeabilityProxy} from './BaseImmutableAdminUpgradeabilityProxy.sol'; + +/** + * @title InitializableAdminUpgradeabilityProxy + * @author Aave + * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function + */ +contract InitializableImmutableAdminUpgradeabilityProxy is + BaseImmutableAdminUpgradeabilityProxy, + InitializableUpgradeabilityProxy +{ + /** + * @dev Constructor. + * @param admin The address of the admin + */ + constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { + // Intentionally left blank + } + + /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy + function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { + BaseImmutableAdminUpgradeabilityProxy._willFallback(); + } +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol new file mode 100644 index 00000000..1070227a --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title VersionedInitializable + * @author Aave, inspired by the OpenZeppelin Initializable contract + * @notice Helper contract to implement initializer functions. To use it, replace + * the constructor with a function that has the `initializer` modifier. + * @dev WARNING: Unlike constructors, initializer functions must be manually + * invoked. This applies both to deploying an Initializable contract, as well + * as extending an Initializable contract via inheritance. + * WARNING: When used with inheritance, manual care must be taken to not invoke + * a parent initializer twice, or ensure that all initializers are idempotent, + * because this is not dealt with automatically as with constructors. + */ +abstract contract VersionedInitializable { + /** + * @dev Indicates that the contract has been initialized. + */ + uint256 private lastInitializedRevision = 0; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + uint256 revision = getRevision(); + require( + initializing || isConstructor() || revision > lastInitializedRevision, + 'Contract instance has already been initialized' + ); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + lastInitializedRevision = revision; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /** + * @notice Returns the revision number of the contract + * @dev Needs to be defined in the inherited class as a constant. + * @return The revision number + */ + function getRevision() internal pure virtual returns (uint256); + + /** + * @notice Returns true if and only if the function is running in the constructor + * @return True if the function is running in the constructor + */ + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + uint256 cs; + //solium-disable-next-line + assembly { + cs := extcodesize(address()) + } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol new file mode 100644 index 00000000..c6b08dcc --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol @@ -0,0 +1,223 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IPool} from '../../../interfaces/IPool.sol'; +import {IInitializableAToken} from '../../../interfaces/IInitializableAToken.sol'; +import {IInitializableDebtToken} from '../../../interfaces/IInitializableDebtToken.sol'; +import {InitializableImmutableAdminUpgradeabilityProxy} from '../../../misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {ConfiguratorInputTypes} from '../types/ConfiguratorInputTypes.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; + +/** + * @title ConfiguratorLogic library + * @author Aave + * @notice Implements the functions to initialize reserves and update aTokens and debtTokens + */ +library ConfiguratorLogic { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPoolConfigurator` for descriptions + event ReserveInitialized( + address indexed asset, + address indexed aToken, + address stableDebtToken, + address variableDebtToken, + address interestRateStrategyAddress + ); + event ATokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + event VariableDebtTokenUpgraded( + address indexed asset, + address indexed proxy, + address indexed implementation + ); + + /** + * @notice Initialize a reserve by creating and initializing aToken and variable debt token + * @dev Emits the `ReserveInitialized` event + * @param pool The Pool in which the reserve will be initialized + * @param input The needed parameters for the initialization + */ + function executeInitReserve( + IPool pool, + ConfiguratorInputTypes.InitReserveInput calldata input + ) external { + // It is an assumption that the asset listed is non-malicious, and the external call doesn't create re-entrancies + uint8 underlyingAssetDecimals = IERC20Detailed(input.underlyingAsset).decimals(); + require(underlyingAssetDecimals > 5, Errors.INVALID_DECIMALS); + + address aTokenProxyAddress = _initTokenWithProxy( + input.aTokenImpl, + abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + pool, + input.treasury, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.aTokenName, + input.aTokenSymbol, + input.params + ) + ); + + address variableDebtTokenProxyAddress = _initTokenWithProxy( + input.variableDebtTokenImpl, + abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + pool, + input.underlyingAsset, + input.incentivesController, + underlyingAssetDecimals, + input.variableDebtTokenName, + input.variableDebtTokenSymbol, + input.params + ) + ); + + pool.initReserve( + input.underlyingAsset, + aTokenProxyAddress, + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + + DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); + + currentConfig.setDecimals(underlyingAssetDecimals); + + currentConfig.setActive(true); + currentConfig.setPaused(false); + currentConfig.setFrozen(false); + currentConfig.setVirtualAccActive(input.useVirtualBalance); + + pool.setConfiguration(input.underlyingAsset, currentConfig); + + IReserveInterestRateStrategy(input.interestRateStrategyAddress).setInterestRateParams( + input.underlyingAsset, + input.interestRateData + ); + + emit ReserveInitialized( + input.underlyingAsset, + aTokenProxyAddress, + address(0), + variableDebtTokenProxyAddress, + input.interestRateStrategyAddress + ); + } + + /** + * @notice Updates the aToken implementation and initializes it + * @dev Emits the `ATokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the aToken + * @param input The parameters needed for the initialize call + */ + function executeUpdateAToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateATokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableAToken.initialize.selector, + cachedPool, + input.treasury, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); + + emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); + } + + /** + * @notice Updates the variable debt token implementation and initializes it + * @dev Emits the `VariableDebtTokenUpgraded` event + * @param cachedPool The Pool containing the reserve with the variable debt token + * @param input The parameters needed for the initialize call + */ + function executeUpdateVariableDebtToken( + IPool cachedPool, + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external { + DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + + (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); + + bytes memory encodedCall = abi.encodeWithSelector( + IInitializableDebtToken.initialize.selector, + cachedPool, + input.asset, + input.incentivesController, + decimals, + input.name, + input.symbol, + input.params + ); + + _upgradeTokenImplementation( + reserveData.variableDebtTokenAddress, + input.implementation, + encodedCall + ); + + emit VariableDebtTokenUpgraded( + input.asset, + reserveData.variableDebtTokenAddress, + input.implementation + ); + } + + /** + * @notice Creates a new proxy and initializes the implementation + * @param implementation The address of the implementation + * @param initParams The parameters that is passed to the implementation to initialize + * @return The address of initialized proxy + */ + function _initTokenWithProxy( + address implementation, + bytes memory initParams + ) internal returns (address) { + InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( + address(this) + ); + + proxy.initialize(implementation, initParams); + + return address(proxy); + } + + /** + * @notice Upgrades the implementation and makes call to the proxy + * @dev The call is used to initialize the new implementation. + * @param proxyAddress The address of the proxy + * @param implementation The address of the new implementation + * @param initParams The parameters to the call after the upgrade + */ + function _upgradeTokenImplementation( + address proxyAddress, + address implementation, + bytes memory initParams + ) internal { + InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( + payable(proxyAddress) + ); + + proxy.upgradeToAndCall(implementation, initParams); + } +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol new file mode 100644 index 00000000..7894871b --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library ConfiguratorInputTypes { + struct InitReserveInput { + address aTokenImpl; + address variableDebtTokenImpl; + bool useVirtualBalance; + address interestRateStrategyAddress; + address underlyingAsset; + address treasury; + address incentivesController; + string aTokenName; + string aTokenSymbol; + string variableDebtTokenName; + string variableDebtTokenSymbol; + bytes params; + bytes interestRateData; + } + + struct UpdateATokenInput { + address asset; + address treasury; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } + + struct UpdateDebtTokenInput { + address asset; + address incentivesController; + string name; + string symbol; + address implementation; + bytes params; + } +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/pool/PoolConfigurator.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/pool/PoolConfigurator.sol new file mode 100644 index 00000000..778ee79b --- /dev/null +++ b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/pool/PoolConfigurator.sol @@ -0,0 +1,630 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {VersionedInitializable} from '../../misc/aave-upgradeability/VersionedInitializable.sol'; +import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; +import {EModeConfiguration} from '../libraries/configuration/EModeConfiguration.sol'; +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {IDefaultInterestRateStrategyV2} from '../../interfaces/IDefaultInterestRateStrategyV2.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; +import {PercentageMath} from '../libraries/math/PercentageMath.sol'; +import {DataTypes} from '../libraries/types/DataTypes.sol'; +import {ConfiguratorLogic} from '../libraries/logic/ConfiguratorLogic.sol'; +import {ConfiguratorInputTypes} from '../libraries/types/ConfiguratorInputTypes.sol'; +import {IPoolConfigurator} from '../../interfaces/IPoolConfigurator.sol'; +import {IPool} from '../../interfaces/IPool.sol'; +import {IACLManager} from '../../interfaces/IACLManager.sol'; +import {IPoolDataProvider} from '../../interfaces/IPoolDataProvider.sol'; +import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; + +/** + * @title PoolConfigurator + * @author Aave + * @dev Implements the configuration methods for the Aave protocol + */ +abstract contract PoolConfigurator is VersionedInitializable, IPoolConfigurator { + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + IPoolAddressesProvider internal _addressesProvider; + IPool internal _pool; + + mapping(address => uint256) internal _pendingLtv; + + uint40 public constant MAX_GRACE_PERIOD = 4 hours; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + _onlyPoolAdmin(); + _; + } + + /** + * @dev Only emergency or pool admin can call functions marked by this modifier. + */ + modifier onlyEmergencyOrPoolAdmin() { + _onlyPoolOrEmergencyAdmin(); + _; + } + + /** + * @dev Only asset listing or pool admin can call functions marked by this modifier. + */ + modifier onlyAssetListingOrPoolAdmins() { + _onlyAssetListingOrPoolAdmins(); + _; + } + + /** + * @dev Only risk or pool admin can call functions marked by this modifier. + */ + modifier onlyRiskOrPoolAdmins() { + _onlyRiskOrPoolAdmins(); + _; + } + + /** + * @dev Only risk, pool or emergency admin can call functions marked by this modifier. + */ + modifier onlyRiskOrPoolOrEmergencyAdmins() { + _onlyRiskOrPoolOrEmergencyAdmins(); + _; + } + + function initialize(IPoolAddressesProvider provider) public virtual; + + /// @inheritdoc IPoolConfigurator + function initReserves( + ConfiguratorInputTypes.InitReserveInput[] calldata input + ) external override onlyAssetListingOrPoolAdmins { + IPool cachedPool = _pool; + + for (uint256 i = 0; i < input.length; i++) { + ConfiguratorLogic.executeInitReserve(cachedPool, input[i]); + emit ReserveInterestRateDataChanged( + input[i].underlyingAsset, + input[i].interestRateStrategyAddress, + input[i].interestRateData + ); + } + } + + /// @inheritdoc IPoolConfigurator + function dropReserve(address asset) external override onlyPoolAdmin { + _pool.dropReserve(asset); + emit ReserveDropped(asset); + } + + /// @inheritdoc IPoolConfigurator + function updateAToken( + ConfiguratorInputTypes.UpdateATokenInput calldata input + ) external override onlyPoolAdmin { + ConfiguratorLogic.executeUpdateAToken(_pool, input); + } + + /// @inheritdoc IPoolConfigurator + function updateVariableDebtToken( + ConfiguratorInputTypes.UpdateDebtTokenInput calldata input + ) external override onlyPoolAdmin { + ConfiguratorLogic.executeUpdateVariableDebtToken(_pool, input); + } + + /// @inheritdoc IPoolConfigurator + function setReserveBorrowing(address asset, bool enabled) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setBorrowingEnabled(enabled); + _pool.setConfiguration(asset, currentConfig); + emit ReserveBorrowing(asset, enabled); + } + + /// @inheritdoc IPoolConfigurator + function configureReserveAsCollateral( + address asset, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus + ) external override onlyRiskOrPoolAdmins { + //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_RESERVE_PARAMS); + + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + if (liquidationThreshold != 0) { + //liquidation bonus must be bigger than 100.00%, otherwise the liquidator would receive less + //collateral than needed to cover the debt + require(liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_PARAMS); + + //if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment + //a loan is taken there is enough collateral available to cover the liquidation bonus + require( + liquidationThreshold.percentMul(liquidationBonus) <= PercentageMath.PERCENTAGE_FACTOR, + Errors.INVALID_RESERVE_PARAMS + ); + } else { + require(liquidationBonus == 0, Errors.INVALID_RESERVE_PARAMS); + //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 supplied + _checkNoSuppliers(asset); + } + + uint256 newLtv = ltv; + + if (currentConfig.getFrozen()) { + _pendingLtv[asset] = ltv; + newLtv = 0; + + emit PendingLtvChanged(asset, ltv); + } else { + currentConfig.setLtv(ltv); + } + + currentConfig.setLiquidationThreshold(liquidationThreshold); + currentConfig.setLiquidationBonus(liquidationBonus); + + _pool.setConfiguration(asset, currentConfig); + + emit CollateralConfigurationChanged(asset, newLtv, liquidationThreshold, liquidationBonus); + } + + /// @inheritdoc IPoolConfigurator + function setReserveFlashLoaning( + address asset, + bool enabled + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + currentConfig.setFlashLoanEnabled(enabled); + _pool.setConfiguration(asset, currentConfig); + emit ReserveFlashLoaning(asset, enabled); + } + + /// @inheritdoc IPoolConfigurator + function setReserveActive(address asset, bool active) external override onlyPoolAdmin { + if (!active) _checkNoSuppliers(asset); + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setActive(active); + _pool.setConfiguration(asset, currentConfig); + emit ReserveActive(asset, active); + } + + /// @inheritdoc IPoolConfigurator + function setReserveFreeze( + address asset, + bool freeze + ) external override onlyRiskOrPoolOrEmergencyAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + require(freeze != currentConfig.getFrozen(), Errors.INVALID_FREEZE_STATE); + + currentConfig.setFrozen(freeze); + + uint256 ltvSet; + uint256 pendingLtvSet; + + if (freeze) { + pendingLtvSet = currentConfig.getLtv(); + _pendingLtv[asset] = pendingLtvSet; + currentConfig.setLtv(0); + } else { + ltvSet = _pendingLtv[asset]; + currentConfig.setLtv(ltvSet); + delete _pendingLtv[asset]; + } + + emit PendingLtvChanged(asset, pendingLtvSet); + emit CollateralConfigurationChanged( + asset, + ltvSet, + currentConfig.getLiquidationThreshold(), + currentConfig.getLiquidationBonus() + ); + + _pool.setConfiguration(asset, currentConfig); + emit ReserveFrozen(asset, freeze); + } + + /// @inheritdoc IPoolConfigurator + function setBorrowableInIsolation( + address asset, + bool borrowable + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setBorrowableInIsolation(borrowable); + _pool.setConfiguration(asset, currentConfig); + emit BorrowableInIsolationChanged(asset, borrowable); + } + + /// @inheritdoc IPoolConfigurator + function setReservePause( + address asset, + bool paused, + uint40 gracePeriod + ) public override onlyEmergencyOrPoolAdmin { + if (!paused && gracePeriod != 0) { + require(gracePeriod <= MAX_GRACE_PERIOD, Errors.INVALID_GRACE_PERIOD); + + uint40 until = uint40(block.timestamp) + gracePeriod; + _pool.setLiquidationGracePeriod(asset, until); + emit LiquidationGracePeriodChanged(asset, until); + } + + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + currentConfig.setPaused(paused); + _pool.setConfiguration(asset, currentConfig); + emit ReservePaused(asset, paused); + } + + /// @inheritdoc IPoolConfigurator + function setReservePause(address asset, bool paused) external override onlyEmergencyOrPoolAdmin { + setReservePause(asset, paused, 0); + } + + /// @inheritdoc IPoolConfigurator + function disableLiquidationGracePeriod(address asset) external override onlyEmergencyOrPoolAdmin { + // set the liquidation grace period in the past to disable liquidation grace period + _pool.setLiquidationGracePeriod(asset, 0); + + emit LiquidationGracePeriodDisabled(asset); + } + + /// @inheritdoc IPoolConfigurator + function setReserveFactor( + address asset, + uint256 newReserveFactor + ) external override onlyRiskOrPoolAdmins { + require(newReserveFactor <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + _pool.syncIndexesState(asset); + + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldReserveFactor = currentConfig.getReserveFactor(); + currentConfig.setReserveFactor(newReserveFactor); + _pool.setConfiguration(asset, currentConfig); + emit ReserveFactorChanged(asset, oldReserveFactor, newReserveFactor); + + _pool.syncRatesState(asset); + } + + /// @inheritdoc IPoolConfigurator + function setDebtCeiling( + address asset, + uint256 newDebtCeiling + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + uint256 oldDebtCeiling = currentConfig.getDebtCeiling(); + if (currentConfig.getLiquidationThreshold() != 0 && oldDebtCeiling == 0) { + _checkNoSuppliers(asset); + } + currentConfig.setDebtCeiling(newDebtCeiling); + _pool.setConfiguration(asset, currentConfig); + + if (newDebtCeiling == 0) { + _pool.resetIsolationModeTotalDebt(asset); + } + + emit DebtCeilingChanged(asset, oldDebtCeiling, newDebtCeiling); + } + + /// @inheritdoc IPoolConfigurator + function setSiloedBorrowing( + address asset, + bool newSiloed + ) external override onlyRiskOrPoolAdmins { + if (newSiloed) { + _checkNoBorrowers(asset); + } + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + + bool oldSiloed = currentConfig.getSiloedBorrowing(); + + currentConfig.setSiloedBorrowing(newSiloed); + + _pool.setConfiguration(asset, currentConfig); + + emit SiloedBorrowingChanged(asset, oldSiloed, newSiloed); + } + + /// @inheritdoc IPoolConfigurator + function setBorrowCap( + address asset, + uint256 newBorrowCap + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldBorrowCap = currentConfig.getBorrowCap(); + currentConfig.setBorrowCap(newBorrowCap); + _pool.setConfiguration(asset, currentConfig); + emit BorrowCapChanged(asset, oldBorrowCap, newBorrowCap); + } + + /// @inheritdoc IPoolConfigurator + function setSupplyCap( + address asset, + uint256 newSupplyCap + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldSupplyCap = currentConfig.getSupplyCap(); + currentConfig.setSupplyCap(newSupplyCap); + _pool.setConfiguration(asset, currentConfig); + emit SupplyCapChanged(asset, oldSupplyCap, newSupplyCap); + } + + /// @inheritdoc IPoolConfigurator + function setLiquidationProtocolFee( + address asset, + uint256 newFee + ) external override onlyRiskOrPoolAdmins { + require(newFee <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_LIQUIDATION_PROTOCOL_FEE); + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldFee = currentConfig.getLiquidationProtocolFee(); + currentConfig.setLiquidationProtocolFee(newFee); + _pool.setConfiguration(asset, currentConfig); + emit LiquidationProtocolFeeChanged(asset, oldFee, newFee); + } + + /// @inheritdoc IPoolConfigurator + function setEModeCategory( + uint8 categoryId, + uint16 ltv, + uint16 liquidationThreshold, + uint16 liquidationBonus, + string calldata label + ) external override onlyRiskOrPoolAdmins { + require(ltv != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); + require(liquidationThreshold != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); + + // 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_EMODE_CATEGORY_PARAMS); + require( + liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, + Errors.INVALID_EMODE_CATEGORY_PARAMS + ); + + // if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment + // a loan is taken there is enough collateral available to cover the liquidation bonus + require( + uint256(liquidationThreshold).percentMul(liquidationBonus) <= + PercentageMath.PERCENTAGE_FACTOR, + Errors.INVALID_EMODE_CATEGORY_PARAMS + ); + + DataTypes.EModeCategoryBaseConfiguration memory categoryData; + categoryData.ltv = ltv; + categoryData.liquidationThreshold = liquidationThreshold; + categoryData.liquidationBonus = liquidationBonus; + categoryData.label = label; + + _pool.configureEModeCategory(categoryId, categoryData); + emit EModeCategoryAdded( + categoryId, + ltv, + liquidationThreshold, + liquidationBonus, + address(0), + label + ); + } + + /// @inheritdoc IPoolConfigurator + function setAssetCollateralInEMode( + address asset, + uint8 categoryId, + bool allowed + ) external override onlyRiskOrPoolAdmins { + uint128 collateralBitmap = _pool.getEModeCategoryCollateralBitmap(categoryId); + DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); + require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED); + collateralBitmap = EModeConfiguration.setReserveBitmapBit( + collateralBitmap, + reserveData.id, + allowed + ); + _pool.configureEModeCategoryCollateralBitmap(categoryId, collateralBitmap); + emit AssetCollateralInEModeChanged(asset, categoryId, allowed); + } + + /// @inheritdoc IPoolConfigurator + function setAssetBorrowableInEMode( + address asset, + uint8 categoryId, + bool borrowable + ) external override onlyRiskOrPoolAdmins { + uint128 borrowableBitmap = _pool.getEModeCategoryBorrowableBitmap(categoryId); + DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); + require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED); + borrowableBitmap = EModeConfiguration.setReserveBitmapBit( + borrowableBitmap, + reserveData.id, + borrowable + ); + _pool.configureEModeCategoryBorrowableBitmap(categoryId, borrowableBitmap); + emit AssetBorrowableInEModeChanged(asset, categoryId, borrowable); + } + + /// @inheritdoc IPoolConfigurator + function setUnbackedMintCap( + address asset, + uint256 newUnbackedMintCap + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); + uint256 oldUnbackedMintCap = currentConfig.getUnbackedMintCap(); + currentConfig.setUnbackedMintCap(newUnbackedMintCap); + _pool.setConfiguration(asset, currentConfig); + emit UnbackedMintCapChanged(asset, oldUnbackedMintCap, newUnbackedMintCap); + } + + /// @inheritdoc IPoolConfigurator + function setReserveInterestRateData( + address asset, + bytes calldata rateData + ) external onlyRiskOrPoolAdmins { + DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset); + _updateInterestRateStrategy(asset, reserve, reserve.interestRateStrategyAddress, rateData); + } + + /// @inheritdoc IPoolConfigurator + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress, + bytes calldata rateData + ) external override onlyRiskOrPoolAdmins { + DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset); + _updateInterestRateStrategy(asset, reserve, rateStrategyAddress, rateData); + } + + /// @inheritdoc IPoolConfigurator + function setPoolPause(bool paused, uint40 gracePeriod) public override onlyEmergencyOrPoolAdmin { + address[] memory reserves = _pool.getReservesList(); + + for (uint256 i = 0; i < reserves.length; i++) { + if (reserves[i] != address(0)) { + setReservePause(reserves[i], paused, gracePeriod); + } + } + } + + /// @inheritdoc IPoolConfigurator + function setPoolPause(bool paused) external override onlyEmergencyOrPoolAdmin { + setPoolPause(paused, 0); + } + + /// @inheritdoc IPoolConfigurator + function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external override onlyPoolAdmin { + require( + newBridgeProtocolFee <= PercentageMath.PERCENTAGE_FACTOR, + Errors.BRIDGE_PROTOCOL_FEE_INVALID + ); + uint256 oldBridgeProtocolFee = _pool.BRIDGE_PROTOCOL_FEE(); + _pool.updateBridgeProtocolFee(newBridgeProtocolFee); + emit BridgeProtocolFeeUpdated(oldBridgeProtocolFee, newBridgeProtocolFee); + } + + /// @inheritdoc IPoolConfigurator + function updateFlashloanPremiumTotal( + uint128 newFlashloanPremiumTotal + ) external override onlyPoolAdmin { + require( + newFlashloanPremiumTotal <= PercentageMath.PERCENTAGE_FACTOR, + Errors.FLASHLOAN_PREMIUM_INVALID + ); + uint128 oldFlashloanPremiumTotal = _pool.FLASHLOAN_PREMIUM_TOTAL(); + _pool.updateFlashloanPremiums(newFlashloanPremiumTotal, _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL()); + emit FlashloanPremiumTotalUpdated(oldFlashloanPremiumTotal, newFlashloanPremiumTotal); + } + + /// @inheritdoc IPoolConfigurator + function updateFlashloanPremiumToProtocol( + uint128 newFlashloanPremiumToProtocol + ) external override onlyPoolAdmin { + require( + newFlashloanPremiumToProtocol <= PercentageMath.PERCENTAGE_FACTOR, + Errors.FLASHLOAN_PREMIUM_INVALID + ); + uint128 oldFlashloanPremiumToProtocol = _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL(); + _pool.updateFlashloanPremiums(_pool.FLASHLOAN_PREMIUM_TOTAL(), newFlashloanPremiumToProtocol); + emit FlashloanPremiumToProtocolUpdated( + oldFlashloanPremiumToProtocol, + newFlashloanPremiumToProtocol + ); + } + + /// @inheritdoc IPoolConfigurator + function getPendingLtv(address asset) external view override returns (uint256) { + return _pendingLtv[asset]; + } + + /// @inheritdoc IPoolConfigurator + function getConfiguratorLogic() external pure returns (address) { + return address(ConfiguratorLogic); + } + + function _updateInterestRateStrategy( + address asset, + DataTypes.ReserveDataLegacy memory reserve, + address newRateStrategyAddress, + bytes calldata rateData + ) internal { + address oldRateStrategyAddress = reserve.interestRateStrategyAddress; + + _pool.syncIndexesState(asset); + + IDefaultInterestRateStrategyV2(newRateStrategyAddress).setInterestRateParams(asset, rateData); + emit ReserveInterestRateDataChanged(asset, newRateStrategyAddress, rateData); + + if (oldRateStrategyAddress != newRateStrategyAddress) { + _pool.setReserveInterestRateStrategyAddress(asset, newRateStrategyAddress); + emit ReserveInterestRateStrategyChanged( + asset, + oldRateStrategyAddress, + newRateStrategyAddress + ); + } + + _pool.syncRatesState(asset); + } + + function _checkNoSuppliers(address asset) internal view { + DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); + uint256 totalSupplied = IPoolDataProvider(_addressesProvider.getPoolDataProvider()) + .getATokenTotalSupply(asset); + + require( + totalSupplied == 0 && reserveData.accruedToTreasury == 0, + Errors.RESERVE_LIQUIDITY_NOT_ZERO + ); + } + + function _checkNoBorrowers(address asset) internal view { + uint256 totalDebt = IPoolDataProvider(_addressesProvider.getPoolDataProvider()).getTotalDebt( + asset + ); + require(totalDebt == 0, Errors.RESERVE_DEBT_NOT_ZERO); + } + + function _onlyPoolAdmin() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + } + + function _onlyPoolOrEmergencyAdmin() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isPoolAdmin(msg.sender) || aclManager.isEmergencyAdmin(msg.sender), + Errors.CALLER_NOT_POOL_OR_EMERGENCY_ADMIN + ); + } + + function _onlyAssetListingOrPoolAdmins() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), + Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN + ); + } + + function _onlyRiskOrPoolAdmins() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isRiskAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), + Errors.CALLER_NOT_RISK_OR_POOL_ADMIN + ); + } + + function _onlyRiskOrPoolOrEmergencyAdmins() internal view { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require( + aclManager.isRiskAdmin(msg.sender) || + aclManager.isPoolAdmin(msg.sender) || + aclManager.isEmergencyAdmin(msg.sender), + Errors.CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN + ); + } +} diff --git a/downloads/LINEA/POOL_LOGIC.sol b/downloads/LINEA/POOL_LOGIC.sol new file mode 100644 index 00000000..61a4f73d --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC.sol @@ -0,0 +1,5725 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} + +// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol + +/** + * @title PoolLogic library + * @author Aave + * @notice Implements the logic for Pool specific functions + */ +library PoolLogic { + using GPv2SafeERC20 for IERC20; + using WadRayMath for uint256; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice Initialize an asset reserve and add the reserve to the list of reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param params Additional parameters needed for initiation + * @return true if appended, false if inserted at existing empty spot + */ + function executeInitReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.InitReserveParams memory params + ) external returns (bool) { + require(Address.isContract(params.asset), Errors.NOT_CONTRACT); + reservesData[params.asset].init( + params.aTokenAddress, + params.variableDebtAddress, + params.interestRateStrategyAddress + ); + + bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || + reservesList[0] == params.asset; + require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); + + for (uint16 i = 0; i < params.reservesCount; i++) { + if (reservesList[i] == address(0)) { + reservesData[params.asset].id = i; + reservesList[i] = params.asset; + return false; + } + } + + require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); + reservesData[params.asset].id = params.reservesCount; + reservesList[params.reservesCount] = params.asset; + return true; + } + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function executeRescueTokens(address token, address to, uint256 amount) external { + IERC20(token).safeTransfer(to, amount); + } + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param reservesData The state of all the reserves + * @param assets The list of reserves for which the minting needs to be executed + */ + function executeMintToTreasury( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] calldata assets + ) external { + for (uint256 i = 0; i < assets.length; i++) { + address assetAddress = assets[i]; + + DataTypes.ReserveData storage reserve = reservesData[assetAddress]; + + // this cover both inactive reserves and invalid reserves since the flag will be 0 for both + if (!reserve.configuration.getActive()) { + continue; + } + + uint256 accruedToTreasury = reserve.accruedToTreasury; + + if (accruedToTreasury != 0) { + reserve.accruedToTreasury = 0; + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); + IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); + + emit MintedToTreasury(assetAddress, amountToMint); + } + } + } + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function executeResetIsolationModeTotalDebt( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset + ) external { + require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); + reservesData[asset].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(asset, 0); + } + + /** + * @notice Sets the liquidation grace period of the asset + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + */ + function executeSetLiquidationGracePeriod( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset, + uint40 until + ) external { + reservesData[asset].liquidationGracePeriodUntil = until; + } + + /** + * @notice Drop a reserve + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param asset The address of the underlying asset of the reserve + */ + function executeDropReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + address asset + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + ValidationLogic.validateDropReserve(reservesList, reserve, asset); + reservesList[reservesData[asset].id] = address(0); + delete reservesData[asset]; + } + + /** + * @notice Returns the user account data across all the reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the calculation + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function executeGetUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ) + { + ( + totalCollateralBase, + totalDebtBase, + ltv, + currentLiquidationThreshold, + healthFactor, + + ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); + + availableBorrowsBase = GenericLogic.calculateAvailableBorrows( + totalCollateralBase, + totalDebtBase, + ltv + ); + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..e7ba8f7a --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..647fc7e7 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..cd5b83c6 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol new file mode 100644 index 00000000..1558fe55 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; + +/** + * @title PoolLogic library + * @author Aave + * @notice Implements the logic for Pool specific functions + */ +library PoolLogic { + using GPv2SafeERC20 for IERC20; + using WadRayMath for uint256; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @notice Initialize an asset reserve and add the reserve to the list of reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param params Additional parameters needed for initiation + * @return true if appended, false if inserted at existing empty spot + */ + function executeInitReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.InitReserveParams memory params + ) external returns (bool) { + require(Address.isContract(params.asset), Errors.NOT_CONTRACT); + reservesData[params.asset].init( + params.aTokenAddress, + params.variableDebtAddress, + params.interestRateStrategyAddress + ); + + bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || + reservesList[0] == params.asset; + require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); + + for (uint16 i = 0; i < params.reservesCount; i++) { + if (reservesList[i] == address(0)) { + reservesData[params.asset].id = i; + reservesList[i] = params.asset; + return false; + } + } + + require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); + reservesData[params.asset].id = params.reservesCount; + reservesList[params.reservesCount] = params.asset; + return true; + } + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function executeRescueTokens(address token, address to, uint256 amount) external { + IERC20(token).safeTransfer(to, amount); + } + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param reservesData The state of all the reserves + * @param assets The list of reserves for which the minting needs to be executed + */ + function executeMintToTreasury( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] calldata assets + ) external { + for (uint256 i = 0; i < assets.length; i++) { + address assetAddress = assets[i]; + + DataTypes.ReserveData storage reserve = reservesData[assetAddress]; + + // this cover both inactive reserves and invalid reserves since the flag will be 0 for both + if (!reserve.configuration.getActive()) { + continue; + } + + uint256 accruedToTreasury = reserve.accruedToTreasury; + + if (accruedToTreasury != 0) { + reserve.accruedToTreasury = 0; + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); + IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); + + emit MintedToTreasury(assetAddress, amountToMint); + } + } + } + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function executeResetIsolationModeTotalDebt( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset + ) external { + require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); + reservesData[asset].isolationModeTotalDebt = 0; + emit IsolationModeTotalDebtUpdated(asset, 0); + } + + /** + * @notice Sets the liquidation grace period of the asset + * @param reservesData The state of all the reserves + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + */ + function executeSetLiquidationGracePeriod( + mapping(address => DataTypes.ReserveData) storage reservesData, + address asset, + uint40 until + ) external { + reservesData[asset].liquidationGracePeriodUntil = until; + } + + /** + * @notice Drop a reserve + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param asset The address of the underlying asset of the reserve + */ + function executeDropReserve( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + address asset + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + ValidationLogic.validateDropReserve(reservesList, reserve, asset); + reservesList[reservesData[asset].id] = address(0); + delete reservesData[asset]; + } + + /** + * @notice Returns the user account data across all the reserves + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the calculation + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function executeGetUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ) + { + ( + totalCollateralBase, + totalDebtBase, + ltv, + currentLiquidationThreshold, + healthFactor, + + ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); + + availableBorrowsBase = GenericLogic.calculateAvailableBorrows( + totalCollateralBase, + totalDebtBase, + ltv + ); + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..dd5c637d --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..e08a30e8 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,642 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..9adca939 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC.sol b/downloads/LINEA/SUPPLY_LOGIC.sol new file mode 100644 index 00000000..a3cc5ddc --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC.sol @@ -0,0 +1,5824 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} + +// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol + +/** + * @title SupplyLogic library + * @author Aave + * @notice Implements the base logic for supply/withdraw + */ +library SupplyLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. + * @dev Emits the `Supply()` event. + * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as + * collateral. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the supply function + */ + function executeSupply( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSupplyParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, reserve, params.amount, params.onBehalfOf); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, params.amount, 0); + + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + params.onBehalfOf, + params.amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration, + reserveCache.aTokenAddress + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); + } + } + + emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); + } + + /** + * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset + * previously supplied in the Aave protocol. + * @dev Emits the `Withdraw()` event. + * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the withdraw function + * @return The actual amount withdrawn + */ + function executeWithdraw( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteWithdrawParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + require(params.to != reserveCache.aTokenAddress, Errors.WITHDRAW_TO_ATOKEN); + + reserve.updateState(reserveCache); + + uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( + reserveCache.nextLiquidityIndex + ); + + uint256 amountToWithdraw = params.amount; + + if (params.amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + + ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, amountToWithdraw); + + bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); + + if (isCollateral && amountToWithdraw == userBalance) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + params.to, + amountToWithdraw, + reserveCache.nextLiquidityIndex + ); + + if (isCollateral && userConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + params.asset, + msg.sender, + params.reservesCount, + params.oracle, + params.userEModeCategory + ); + } + + emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); + + return amountToWithdraw; + } + + /** + * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid + * collateralization constraints violation. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as + * collateral. + * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param params The additional parameters needed to execute the finalizeTransfer function + */ + function executeFinalizeTransfer( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.FinalizeTransferParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + + ValidationLogic.validateTransfer(reserve); + + uint256 reserveId = reserve.id; + uint256 scaledAmount = params.amount.rayDiv(reserve.getNormalizedIncome()); + + if (params.from != params.to && scaledAmount != 0) { + DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; + + if (fromConfig.isUsingAsCollateral(reserveId)) { + if (fromConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + usersConfig[params.from], + params.asset, + params.from, + params.reservesCount, + params.oracle, + params.fromEModeCategory + ); + } + if (params.balanceFromBefore == params.amount) { + fromConfig.setUsingAsCollateral(reserveId, false); + emit ReserveUsedAsCollateralDisabled(params.asset, params.from); + } + } + + if (params.balanceToBefore == 0) { + DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + toConfig, + reserve.configuration, + reserve.aTokenAddress + ) + ) { + toConfig.setUsingAsCollateral(reserveId, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.to); + } + } + } + } + + /** + * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as + * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor + * checks to ensure collateralization. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. + * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The users configuration mapping that track the supplied/borrowed assets + * @param asset The address of the asset being configured as collateral + * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise + * @param reservesCount The number of initialized reserves + * @param priceOracle The address of the price oracle + * @param userEModeCategory The eMode category chosen by the user + */ + function executeUseReserveAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + bool useAsCollateral, + uint256 reservesCount, + address priceOracle, + uint8 userEModeCategory + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); + + ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); + + if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; + + if (useAsCollateral) { + require( + ValidationLogic.validateUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration + ), + Errors.USER_IN_ISOLATION_MODE_OR_LTV_ZERO + ); + + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, msg.sender); + } else { + userConfig.setUsingAsCollateral(reserve.id, false); + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + asset, + msg.sender, + reservesCount, + priceOracle, + userEModeCategory + ); + + emit ReserveUsedAsCollateralDisabled(asset, msg.sender); + } + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol new file mode 100644 index 00000000..7c97ec92 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + * + * _Available since v3.1._ + */ + event RoleAdminChanged( + bytes32 indexed role, + bytes32 indexed previousAdminRole, + bytes32 indexed newAdminRole + ); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `account`. + */ + function renounceRole(bytes32 role, address account) external; +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol new file mode 100644 index 00000000..e7ba8f7a --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPriceOracleSentinel + * @author Aave + * @notice Defines the basic interface for the PriceOracleSentinel + */ +interface IPriceOracleSentinel { + /** + * @dev Emitted after the sequencer oracle is updated + * @param newSequencerOracle The new sequencer oracle + */ + event SequencerOracleUpdated(address newSequencerOracle); + + /** + * @dev Emitted after the grace period is updated + * @param newGracePeriod The new grace period value + */ + event GracePeriodUpdated(uint256 newGracePeriod); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns true if the `borrow` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `borrow` operation is allowed, false otherwise. + */ + function isBorrowAllowed() external view returns (bool); + + /** + * @notice Returns true if the `liquidation` operation is allowed. + * @dev Operation not allowed when PriceOracle is down or grace period not passed. + * @return True if the `liquidation` operation is allowed, false otherwise. + */ + function isLiquidationAllowed() external view returns (bool); + + /** + * @notice Updates the address of the sequencer oracle + * @param newSequencerOracle The address of the new Sequencer Oracle to use + */ + function setSequencerOracle(address newSequencerOracle) external; + + /** + * @notice Updates the duration of the grace period + * @param newGracePeriod The value of the new grace period duration + */ + function setGracePeriod(uint256 newGracePeriod) external; + + /** + * @notice Returns the SequencerOracle + * @return The address of the sequencer oracle contract + */ + function getSequencerOracle() external view returns (address); + + /** + * @notice Returns the grace period + * @return The duration of the grace period + */ + function getGracePeriod() external view returns (uint256); +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol new file mode 100644 index 00000000..3bb69ef0 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title EModeConfiguration library + * @author BGD Labs + * @notice Implements the bitmap logic to handle the eMode configuration + */ +library EModeConfiguration { + /** + * @notice Sets a bit in a given bitmap that represents the reserve index range + * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise + * @return The altered bitmap + */ + function setReserveBitmapBit( + uint128 bitmap, + uint256 reserveIndex, + bool enabled + ) internal pure returns (uint128) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint128 bit = uint128(1 << reserveIndex); + if (enabled) { + return bitmap | bit; + } else { + return bitmap & ~bit; + } + } + } + + /** + * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap + * @param bitmap The bitmap + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the reserveindex is flagged true + */ + function isReserveEnabledOnBitmap( + uint128 bitmap, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (bitmap >> reserveIndex) & 1 != 0; + } + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol new file mode 100644 index 00000000..647fc7e7 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; + +/** + * @title EModeLogic library + * @author Aave + * @notice Implements the base logic for all the actions related to the eMode + */ +library EModeLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @notice Updates the user efficiency mode category + * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD + * @dev Emits the `UserEModeSet` event + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersEModeCategory The state of all users efficiency mode category + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the setUserEMode function + */ + function executeSetUserEMode( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => uint8) storage usersEModeCategory, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSetUserEModeParams memory params + ) external { + if (usersEModeCategory[msg.sender] == params.categoryId) return; + + ValidationLogic.validateSetUserEMode( + eModeCategories, + userConfig, + params.reservesCount, + params.categoryId + ); + + usersEModeCategory[msg.sender] = params.categoryId; + + ValidationLogic.validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + msg.sender, + params.categoryId, + params.reservesCount, + params.oracle + ); + emit UserEModeSet(msg.sender, params.categoryId); + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol new file mode 100644 index 00000000..cd5b83c6 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {EModeLogic} from './EModeLogic.sol'; + +/** + * @title GenericLogic library + * @author Aave + * @notice Implements protocol-level logic to calculate and validate the state of a user + */ +library GenericLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + struct CalculateUserAccountDataVars { + uint256 assetPrice; + uint256 assetUnit; + uint256 userBalanceInBaseCurrency; + uint256 decimals; + uint256 ltv; + uint256 liquidationThreshold; + uint256 i; + uint256 healthFactor; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 avgLtv; + uint256 avgLiquidationThreshold; + uint256 eModeLtv; + uint256 eModeLiqThreshold; + address currentReserveAddress; + bool hasZeroLtvCollateral; + bool isInEModeCategory; + } + + /** + * @notice Calculates the user data across the reserves. + * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, + * the average Loan To Value, the average Liquidation Ratio, and the Health factor. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional parameters needed for the calculation + * @return The total collateral of the user in the base currency used by the price feed + * @return The total debt of the user in the base currency used by the price feed + * @return The average ltv of the user + * @return The average liquidation threshold of the user + * @return The health factor of the user + * @return True if the ltv is zero, false otherwise + */ + function calculateUserAccountData( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { + if (params.userConfig.isEmpty()) { + return (0, 0, 0, 0, type(uint256).max, false); + } + + CalculateUserAccountDataVars memory vars; + + if (params.userEModeCategory != 0) { + vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; + vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; + } + + while (vars.i < params.reservesCount) { + if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { + unchecked { + ++vars.i; + } + continue; + } + + vars.currentReserveAddress = reservesList[vars.i]; + + if (vars.currentReserveAddress == address(0)) { + unchecked { + ++vars.i; + } + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; + + (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve + .configuration + .getParams(); + + unchecked { + vars.assetUnit = 10 ** vars.decimals; + } + + vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); + + if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { + vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + + vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; + + vars.isInEModeCategory = + params.userEModeCategory != 0 && + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].collateralBitmap, + vars.i + ); + + if (vars.ltv != 0) { + vars.avgLtv += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); + } else { + vars.hasZeroLtvCollateral = true; + } + + vars.avgLiquidationThreshold += + vars.userBalanceInBaseCurrency * + (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); + } + + if (params.userConfig.isBorrowing(vars.i)) { + vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( + params.user, + currentReserve, + vars.assetPrice, + vars.assetUnit + ); + } + + unchecked { + ++vars.i; + } + } + + unchecked { + vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLtv / vars.totalCollateralInBaseCurrency + : 0; + vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 + ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency + : 0; + } + + vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) + ? type(uint256).max + : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( + vars.totalDebtInBaseCurrency + ); + return ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.avgLtv, + vars.avgLiquidationThreshold, + vars.healthFactor, + vars.hasZeroLtvCollateral + ); + } + + /** + * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt + * and the average Loan To Value + * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed + * @param ltv The average loan to value + * @return The amount available to borrow in the base currency of the used by the price feed + */ + function calculateAvailableBorrows( + uint256 totalCollateralInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 ltv + ) internal pure returns (uint256) { + uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); + + if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { + return 0; + } + + availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; + return availableBorrowsInBaseCurrency; + } + + /** + * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets + * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the + * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than + * fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total debt of the user is being calculated + * @param assetPrice The price of the asset for which the total debt of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total debt of the user normalized to the base currency + */ + function _getUserDebtInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + // fetching variable debt + uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( + user + ); + if (userTotalDebt == 0) { + return 0; + } + + userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; + unchecked { + return userTotalDebt / assetUnit; + } + } + + /** + * @notice Calculates total aToken balance of the user in the based currency used by the price oracle + * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which + * is cheaper than fetching `balanceOf` + * @param user The address of the user + * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated + * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated + * @param assetUnit The value representing one full unit of the asset (10^decimals) + * @return The total aToken balance of the user normalized to the base currency of the price oracle + */ + function _getUserBalanceInBaseCurrency( + address user, + DataTypes.ReserveData storage reserve, + uint256 assetPrice, + uint256 assetUnit + ) private view returns (uint256) { + uint256 normalizedIncome = reserve.getNormalizedIncome(); + uint256 balance = ( + IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) + ) * assetPrice; + + unchecked { + return balance / assetUnit; + } + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol new file mode 100644 index 00000000..dd5c637d --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {MathUtils} from '../math/MathUtils.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements the logic to update the reserves state + */ +library ReserveLogic { + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveLogic for DataTypes.ReserveData; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + // See `IPool` for descriptions + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @notice Returns the ongoing normalized income for the reserve. + * @dev A value of 1e27 means there is no income. As time passes, the income is accrued + * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued + * @param reserve The reserve object + * @return The normalized income, expressed in ray + */ + function getNormalizedIncome( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.liquidityIndex; + } else { + return + MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( + reserve.liquidityIndex + ); + } + } + + /** + * @notice Returns the ongoing normalized variable debt for the reserve. + * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued + * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated + * @param reserve The reserve object + * @return The normalized variable debt, expressed in ray + */ + function getNormalizedDebt( + DataTypes.ReserveData storage reserve + ) internal view returns (uint256) { + uint40 timestamp = reserve.lastUpdateTimestamp; + + //solium-disable-next-line + if (timestamp == block.timestamp) { + //if the index was updated in the same block, no need to perform any calculation + return reserve.variableBorrowIndex; + } else { + return + MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( + reserve.variableBorrowIndex + ); + } + } + + /** + * @notice Updates the liquidity cumulative index and the variable borrow index. + * @param reserve The reserve object + * @param reserveCache The caching layer for the reserve data + */ + function updateState( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // If time didn't pass since last stored timestamp, skip state update + //solium-disable-next-line + if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + return; + } + + _updateIndexes(reserve, reserveCache); + _accrueToTreasury(reserve, reserveCache); + + //solium-disable-next-line + reserve.lastUpdateTimestamp = uint40(block.timestamp); + } + + /** + * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example + * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. + * @param reserve The reserve object + * @param totalLiquidity The total liquidity available in the reserve + * @param amount The amount to accumulate + * @return The next liquidity index of the reserve + */ + function cumulateToLiquidityIndex( + DataTypes.ReserveData storage reserve, + uint256 totalLiquidity, + uint256 amount + ) internal returns (uint256) { + //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` + //division `amount / totalLiquidity` done in ray for precision + uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( + reserve.liquidityIndex + ); + reserve.liquidityIndex = result.toUint128(); + return result; + } + + /** + * @notice Initializes a reserve. + * @param reserve The reserve object + * @param aTokenAddress The address of the overlying atoken contract + * @param variableDebtTokenAddress The address of the overlying variable debt token contract + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function init( + DataTypes.ReserveData storage reserve, + address aTokenAddress, + address variableDebtTokenAddress, + address interestRateStrategyAddress + ) internal { + require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); + + reserve.liquidityIndex = uint128(WadRayMath.RAY); + reserve.variableBorrowIndex = uint128(WadRayMath.RAY); + reserve.aTokenAddress = aTokenAddress; + reserve.variableDebtTokenAddress = variableDebtTokenAddress; + reserve.interestRateStrategyAddress = interestRateStrategyAddress; + } + + /** + * @notice Updates the reserve current variable borrow rate and the current liquidity rate. + * @param reserve The reserve reserve to be updated + * @param reserveCache The caching layer for the reserve data + * @param reserveAddress The address of the reserve to be updated + * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action + * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) + */ + function updateInterestRatesAndVirtualBalance( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache, + address reserveAddress, + uint256 liquidityAdded, + uint256 liquidityTaken + ) internal { + uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( + reserve.interestRateStrategyAddress + ).calculateInterestRates( + DataTypes.CalculateInterestRatesParams({ + unbacked: reserve.unbacked, + liquidityAdded: liquidityAdded, + liquidityTaken: liquidityTaken, + totalDebt: totalVariableDebt, + reserveFactor: reserveCache.reserveFactor, + reserve: reserveAddress, + usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + virtualUnderlyingBalance: reserve.virtualUnderlyingBalance + }) + ); + + reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); + reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); + + // Only affect virtual balance if the reserve uses it + if (reserve.configuration.getIsVirtualAccActive()) { + if (liquidityAdded > 0) { + reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); + } + if (liquidityTaken > 0) { + reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); + } + } + + emit ReserveDataUpdated( + reserveAddress, + nextLiquidityRate, + 0, + nextVariableRate, + reserveCache.nextLiquidityIndex, + reserveCache.nextVariableBorrowIndex + ); + } + + /** + * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the + * specific asset. + * @param reserve The reserve to be updated + * @param reserveCache The caching layer for the reserve data + */ + function _accrueToTreasury( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + if (reserveCache.reserveFactor == 0) { + return; + } + + //calculate the total variable debt at moment of the last interaction + uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.currVariableBorrowIndex + ); + + //calculate the new total variable debt after accumulation of the interest on the index + uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( + reserveCache.nextVariableBorrowIndex + ); + + //debt accrued is the sum of the current debt minus the sum of the debt at the last update + uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; + + uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); + + if (amountToMint != 0) { + reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); + } + } + + /** + * @notice Updates the reserve indexes and the timestamp of the update. + * @param reserve The reserve reserve to be updated + * @param reserveCache The cache layer holding the cached protocol data + */ + function _updateIndexes( + DataTypes.ReserveData storage reserve, + DataTypes.ReserveCache memory reserveCache + ) internal { + // Only cumulating on the supply side if there is any income being produced + // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), + // as liquidity index should not be updated + if (reserveCache.currLiquidityRate != 0) { + uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( + reserveCache.currLiquidityRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( + reserveCache.currLiquidityIndex + ); + reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); + } + + // Variable borrow index only gets updated if there is any variable debt. + // reserveCache.currVariableBorrowRate != 0 is not a correct validation, + // because a positive base variable rate can be stored on + // reserveCache.currVariableBorrowRate, but the index should not increase + if (reserveCache.currScaledVariableDebt != 0) { + uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( + reserveCache.currVariableBorrowRate, + reserveCache.reserveLastUpdateTimestamp + ); + reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( + reserveCache.currVariableBorrowIndex + ); + reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); + } + } + + /** + * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and + * interest rates. + * @param reserve The reserve object for which the cache will be filled + * @return The cache object + */ + function cache( + DataTypes.ReserveData storage reserve + ) internal view returns (DataTypes.ReserveCache memory) { + DataTypes.ReserveCache memory reserveCache; + + reserveCache.reserveConfiguration = reserve.configuration; + reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); + reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; + reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve + .variableBorrowIndex; + reserveCache.currLiquidityRate = reserve.currentLiquidityRate; + reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; + + reserveCache.aTokenAddress = reserve.aTokenAddress; + reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; + + reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; + + reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( + reserveCache.variableDebtTokenAddress + ).scaledTotalSupply(); + + return reserveCache; + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol new file mode 100644 index 00000000..727886e7 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol @@ -0,0 +1,300 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; + +/** + * @title SupplyLogic library + * @author Aave + * @notice Implements the base logic for supply/withdraw + */ +library SupplyLogic { + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + using GPv2SafeERC20 for IERC20; + using UserConfiguration for DataTypes.UserConfigurationMap; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using WadRayMath for uint256; + using PercentageMath for uint256; + + // See `IPool` for descriptions + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. + * @dev Emits the `Supply()` event. + * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as + * collateral. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the supply function + */ + function executeSupply( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteSupplyParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + reserve.updateState(reserveCache); + + ValidationLogic.validateSupply(reserveCache, reserve, params.amount, params.onBehalfOf); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, params.amount, 0); + + IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); + + bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( + msg.sender, + params.onBehalfOf, + params.amount, + reserveCache.nextLiquidityIndex + ); + + if (isFirstSupply) { + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration, + reserveCache.aTokenAddress + ) + ) { + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); + } + } + + emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); + } + + /** + * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset + * previously supplied in the Aave protocol. + * @dev Emits the `Withdraw()` event. + * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the withdraw function + * @return The actual amount withdrawn + */ + function executeWithdraw( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteWithdrawParams memory params + ) external returns (uint256) { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + require(params.to != reserveCache.aTokenAddress, Errors.WITHDRAW_TO_ATOKEN); + + reserve.updateState(reserveCache); + + uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( + reserveCache.nextLiquidityIndex + ); + + uint256 amountToWithdraw = params.amount; + + if (params.amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + + ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); + + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, amountToWithdraw); + + bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); + + if (isCollateral && amountToWithdraw == userBalance) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + params.to, + amountToWithdraw, + reserveCache.nextLiquidityIndex + ); + + if (isCollateral && userConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + params.asset, + msg.sender, + params.reservesCount, + params.oracle, + params.userEModeCategory + ); + } + + emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); + + return amountToWithdraw; + } + + /** + * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid + * collateralization constraints violation. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as + * collateral. + * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param usersConfig The users configuration mapping that track the supplied/borrowed assets + * @param params The additional parameters needed to execute the finalizeTransfer function + */ + function executeFinalizeTransfer( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, + DataTypes.FinalizeTransferParams memory params + ) external { + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + + ValidationLogic.validateTransfer(reserve); + + uint256 reserveId = reserve.id; + uint256 scaledAmount = params.amount.rayDiv(reserve.getNormalizedIncome()); + + if (params.from != params.to && scaledAmount != 0) { + DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; + + if (fromConfig.isUsingAsCollateral(reserveId)) { + if (fromConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + usersConfig[params.from], + params.asset, + params.from, + params.reservesCount, + params.oracle, + params.fromEModeCategory + ); + } + if (params.balanceFromBefore == params.amount) { + fromConfig.setUsingAsCollateral(reserveId, false); + emit ReserveUsedAsCollateralDisabled(params.asset, params.from); + } + } + + if (params.balanceToBefore == 0) { + DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; + if ( + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + toConfig, + reserve.configuration, + reserve.aTokenAddress + ) + ) { + toConfig.setUsingAsCollateral(reserveId, true); + emit ReserveUsedAsCollateralEnabled(params.asset, params.to); + } + } + } + } + + /** + * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as + * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor + * checks to ensure collateralization. + * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. + * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The users configuration mapping that track the supplied/borrowed assets + * @param asset The address of the asset being configured as collateral + * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise + * @param reservesCount The number of initialized reserves + * @param priceOracle The address of the price oracle + * @param userEModeCategory The eMode category chosen by the user + */ + function executeUseReserveAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + address asset, + bool useAsCollateral, + uint256 reservesCount, + address priceOracle, + uint8 userEModeCategory + ) external { + DataTypes.ReserveData storage reserve = reservesData[asset]; + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + + uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); + + ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); + + if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; + + if (useAsCollateral) { + require( + ValidationLogic.validateUseAsCollateral( + reservesData, + reservesList, + userConfig, + reserveCache.reserveConfiguration + ), + Errors.USER_IN_ISOLATION_MODE_OR_LTV_ZERO + ); + + userConfig.setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, msg.sender); + } else { + userConfig.setUsingAsCollateral(reserve.id, false); + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + asset, + msg.sender, + reservesCount, + priceOracle, + userEModeCategory + ); + + emit ReserveUsedAsCollateralDisabled(asset, msg.sender); + } + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol new file mode 100644 index 00000000..e08a30e8 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -0,0 +1,642 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; +import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; +import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; +import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; +import {Errors} from '../helpers/Errors.sol'; +import {WadRayMath} from '../math/WadRayMath.sol'; +import {PercentageMath} from '../math/PercentageMath.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveLogic} from './ReserveLogic.sol'; +import {GenericLogic} from './GenericLogic.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; + +/** + * @title ReserveLogic library + * @author Aave + * @notice Implements functions to validate the different actions of the protocol + */ +library ValidationLogic { + using ReserveLogic for DataTypes.ReserveData; + using WadRayMath for uint256; + using PercentageMath for uint256; + using SafeCast for uint256; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using Address for address; + + // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps + // A value of 0.9e4 results in 90% + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; + + // Minimum health factor allowed under any circumstance + // A value of 0.95e18 results in 0.95 + uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; + + /** + * @dev Minimum health factor to consider a user position healthy + * A value of 1e18 results in 1 + */ + uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; + + /** + * @dev Role identifier for the role allowed to supply isolated reserves as collateral + */ + bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = + keccak256('ISOLATED_COLLATERAL_SUPPLIER'); + + /** + * @notice Validates a supply action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be supplied + */ + function validateSupply( + DataTypes.ReserveCache memory reserveCache, + DataTypes.ReserveData storage reserve, + uint256 amount, + address onBehalfOf + ) internal view { + require(amount != 0, Errors.INVALID_AMOUNT); + + (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + require(!isFrozen, Errors.RESERVE_FROZEN); + require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); + + uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); + require( + supplyCap == 0 || + ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + + uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= + supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), + Errors.SUPPLY_CAP_EXCEEDED + ); + } + + /** + * @notice Validates a withdraw action. + * @param reserveCache The cached data of the reserve + * @param amount The amount to be withdrawn + * @param userBalance The balance of the user + */ + function validateWithdraw( + DataTypes.ReserveCache memory reserveCache, + uint256 amount, + uint256 userBalance + ) internal pure { + require(amount != 0, Errors.INVALID_AMOUNT); + require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + struct ValidateBorrowLocalVars { + uint256 currentLtv; + uint256 collateralNeededInBaseCurrency; + uint256 userCollateralInBaseCurrency; + uint256 userDebtInBaseCurrency; + uint256 availableLiquidity; + uint256 healthFactor; + uint256 totalDebt; + uint256 totalSupplyVariableDebt; + uint256 reserveDecimals; + uint256 borrowCap; + uint256 amountInBaseCurrency; + uint256 assetUnit; + address siloedBorrowingAddress; + bool isActive; + bool isFrozen; + bool isPaused; + bool borrowingEnabled; + bool siloedBorrowingEnabled; + } + + /** + * @notice Validates a borrow action. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param params Additional params needed for the validation + */ + function validateBorrow( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.ValidateBorrowParams memory params + ) internal view { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + ValidateBorrowLocalVars memory vars; + + (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params + .reserveCache + .reserveConfiguration + .getFlags(); + + require(vars.isActive, Errors.RESERVE_INACTIVE); + require(!vars.isPaused, Errors.RESERVE_PAUSED); + require(!vars.isFrozen, Errors.RESERVE_FROZEN); + require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); + require( + !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || + IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, + Errors.INVALID_AMOUNT + ); + + require( + params.priceOracleSentinel == address(0) || + IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + //validate interest rate mode + require( + params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + + vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); + vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); + unchecked { + vars.assetUnit = 10 ** vars.reserveDecimals; + } + + if (vars.borrowCap != 0) { + vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( + params.reserveCache.nextVariableBorrowIndex + ); + + vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; + + unchecked { + require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); + } + } + + if (params.isolationModeActive) { + // check that the asset being borrowed is borrowable in isolation mode AND + // the total exposure is no bigger than the collateral debt ceiling + require( + params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), + Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION + ); + + require( + reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + + (params.amount / + 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) + .toUint128() <= + params.isolationModeDebtCeiling, + Errors.DEBT_CEILING_EXCEEDED + ); + } + + if (params.userEModeCategory != 0) { + require( + EModeConfiguration.isReserveEnabledOnBitmap( + eModeCategories[params.userEModeCategory].borrowableBitmap, + reservesData[params.asset].id + ), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + + ( + vars.userCollateralInBaseCurrency, + vars.userDebtInBaseCurrency, + vars.currentLtv, + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: params.userConfig, + reservesCount: params.reservesCount, + user: params.userAddress, + oracle: params.oracle, + userEModeCategory: params.userEModeCategory + }) + ); + + require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); + require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); + + require( + vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + vars.amountInBaseCurrency = + IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * + params.amount; + unchecked { + vars.amountInBaseCurrency /= vars.assetUnit; + } + + //add the current already borrowed amount to the amount requested to calculate the total collateral needed. + vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) + .percentDiv(vars.currentLtv); //LTV is calculated in percentage + + require( + vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, + Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW + ); + + if (params.userConfig.isBorrowingAny()) { + (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params + .userConfig + .getSiloedBorrowingState(reservesData, reservesList); + + if (vars.siloedBorrowingEnabled) { + require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); + } else { + require( + !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), + Errors.SILOED_BORROWING_VIOLATION + ); + } + } + } + + /** + * @notice Validates a repay action. + * @param reserveCache The cached data of the reserve + * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) + * @param onBehalfOf The address of the user msg.sender is repaying for + * @param debt The borrow balance of the user + */ + function validateRepay( + DataTypes.ReserveCache memory reserveCache, + uint256 amountSent, + DataTypes.InterestRateMode interestRateMode, + address onBehalfOf, + uint256 debt + ) internal view { + require(amountSent != 0, Errors.INVALID_AMOUNT); + require( + interestRateMode == DataTypes.InterestRateMode.VARIABLE, + Errors.INVALID_INTEREST_RATE_MODE_SELECTED + ); + require( + amountSent != type(uint256).max || msg.sender == onBehalfOf, + Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF + ); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + + require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); + } + + /** + * @notice Validates the action of setting an asset as collateral. + * @param reserveCache The cached data of the reserve + * @param userBalance The balance of the user + */ + function validateSetUseReserveAsCollateral( + DataTypes.ReserveCache memory reserveCache, + uint256 userBalance + ) internal pure { + require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); + + (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); + require(isActive, Errors.RESERVE_INACTIVE); + require(!isPaused, Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a flashloan action. + * @param reservesData The state of all the reserves + * @param assets The assets being flash-borrowed + * @param amounts The amounts for each asset being borrowed + */ + function validateFlashloan( + mapping(address => DataTypes.ReserveData) storage reservesData, + address[] memory assets, + uint256[] memory amounts + ) internal view { + require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); + for (uint256 i = 0; i < assets.length; i++) { + for (uint256 j = i + 1; j < assets.length; j++) { + require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); + } + validateFlashloanSimple(reservesData[assets[i]], amounts[i]); + } + } + + /** + * @notice Validates a flashloan action. + * @param reserve The state of the reserve + */ + function validateFlashloanSimple( + DataTypes.ReserveData storage reserve, + uint256 amount + ) internal view { + DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; + require(!configuration.getPaused(), Errors.RESERVE_PAUSED); + require(configuration.getActive(), Errors.RESERVE_INACTIVE); + require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); + require( + !configuration.getIsVirtualAccActive() || + IERC20(reserve.aTokenAddress).totalSupply() >= amount, + Errors.INVALID_AMOUNT + ); + } + + struct ValidateLiquidationCallLocalVars { + bool collateralReserveActive; + bool collateralReservePaused; + bool principalReserveActive; + bool principalReservePaused; + bool isCollateralEnabled; + } + + /** + * @notice Validates the liquidation action. + * @param userConfig The user configuration mapping + * @param collateralReserve The reserve data of the collateral + * @param debtReserve The reserve data of the debt + * @param params Additional parameters needed for the validation + */ + function validateLiquidationCall( + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveData storage collateralReserve, + DataTypes.ReserveData storage debtReserve, + DataTypes.ValidateLiquidationCallParams memory params + ) internal view { + ValidateLiquidationCallLocalVars memory vars; + + (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve + .configuration + .getFlags(); + + (vars.principalReserveActive, , , vars.principalReservePaused) = params + .debtReserveCache + .reserveConfiguration + .getFlags(); + + require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); + require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); + + require( + params.priceOracleSentinel == address(0) || + params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || + IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), + Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED + ); + + require( + collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && + debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), + Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED + ); + + require( + params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD + ); + + vars.isCollateralEnabled = + collateralReserve.configuration.getLiquidationThreshold() != 0 && + userConfig.isUsingAsCollateral(collateralReserve.id); + + //if collateral isn't enabled as collateral by user, it cannot be liquidated + require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); + require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); + } + + /** + * @notice Validates the health factor of a user. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param user The user to validate health factor of + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function validateHealthFactor( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) internal view returns (uint256, bool) { + (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic + .calculateUserAccountData( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + + require( + healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, + Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD + ); + + return (healthFactor, hasZeroLtvCollateral); + } + + /** + * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param eModeCategories The configuration of all the efficiency mode categories + * @param userConfig The state of the user for the specific reserve + * @param asset The asset for which the ltv will be validated + * @param from The user from which the aTokens are being transferred + * @param reservesCount The number of available reserves + * @param oracle The price oracle + * @param userEModeCategory The users active efficiency mode category + */ + function validateHFAndLtv( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + address asset, + address from, + uint256 reservesCount, + address oracle, + uint8 userEModeCategory + ) internal view { + DataTypes.ReserveData memory reserve = reservesData[asset]; + + (, bool hasZeroLtvCollateral) = validateHealthFactor( + reservesData, + reservesList, + eModeCategories, + userConfig, + from, + userEModeCategory, + reservesCount, + oracle + ); + + require( + !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, + Errors.LTV_VALIDATION_FAILED + ); + } + + /** + * @notice Validates a transfer action. + * @param reserve The reserve object + */ + function validateTransfer(DataTypes.ReserveData storage reserve) internal view { + require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); + } + + /** + * @notice Validates a drop reserve action. + * @param reservesList The addresses of all the active reserves + * @param reserve The reserve object + * @param asset The address of the reserve's underlying asset + */ + function validateDropReserve( + mapping(uint256 => address) storage reservesList, + DataTypes.ReserveData storage reserve, + address asset + ) internal view { + require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); + require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); + require( + IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, + Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO + ); + require( + IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, + Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO + ); + } + + /** + * @notice Validates the action of setting efficiency mode. + * @param eModeCategories a mapping storing configurations for all efficiency mode categories + * @param userConfig the user configuration + * @param reservesCount The total number of valid reserves + * @param categoryId The id of the category + */ + function validateSetUserEMode( + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap memory userConfig, + uint256 reservesCount, + uint8 categoryId + ) internal view { + DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; + // category is invalid if the liq threshold is not set + require( + categoryId == 0 || eModeCategory.liquidationThreshold != 0, + Errors.INCONSISTENT_EMODE_CATEGORY + ); + + // eMode can always be enabled if the user hasn't supplied anything + if (userConfig.isEmpty()) { + return; + } + + // if user is trying to set another category than default we require that + // either the user is not borrowing, or it's borrowing assets of categoryId + if (categoryId != 0) { + unchecked { + for (uint256 i = 0; i < reservesCount; i++) { + if (userConfig.isBorrowing(i)) { + require( + EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), + Errors.NOT_BORROWABLE_IN_EMODE + ); + } + } + } + } + } + + /** + * @notice Validates the action of activating the asset as collateral. + * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig + ) internal view returns (bool) { + if (reserveConfig.getLtv() == 0) { + return false; + } + if (!userConfig.isUsingAsCollateralAny()) { + return true; + } + (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); + + return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); + } + + /** + * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, + * transfer, mint unbacked, and liquidate + * @dev This is used to ensure that isolated assets are not enabled as collateral automatically + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig the user configuration + * @param reserveConfig The reserve configuration + * @return True if the asset can be activated as collateral, false otherwise + */ + function validateAutomaticUseAsCollateral( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ReserveConfigurationMap memory reserveConfig, + address aTokenAddress + ) internal view returns (bool) { + if (reserveConfig.getDebtCeiling() != 0) { + // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action + IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) + .POOL() + .ADDRESSES_PROVIDER(); + if ( + !IAccessControl(addressesProvider.getACLManager()).hasRole( + ISOLATED_COLLATERAL_SUPPLIER_ROLE, + msg.sender + ) + ) return false; + } + return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol new file mode 100644 index 00000000..9adca939 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {WadRayMath} from './WadRayMath.sol'; + +/** + * @title MathUtils library + * @author Aave + * @notice Provides functions to perform linear and compounded interest calculations + */ +library MathUtils { + using WadRayMath for uint256; + + /// @dev Ignoring leap years + uint256 internal constant SECONDS_PER_YEAR = 365 days; + + /** + * @dev Function to calculate the interest accumulated using a linear interest rate formula + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate linearly accumulated during the timeDelta, in ray + */ + function calculateLinearInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + //solium-disable-next-line + uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); + unchecked { + result = result / SECONDS_PER_YEAR; + } + + return WadRayMath.RAY + result; + } + + /** + * @dev Function to calculate the interest using a compounded interest rate formula + * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: + * + * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... + * + * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great + * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of + * error per different time periods + * + * @param rate The interest rate, in ray + * @param lastUpdateTimestamp The timestamp of the last update of the interest + * @return The interest rate compounded during the timeDelta, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp, + uint256 currentTimestamp + ) internal pure returns (uint256) { + //solium-disable-next-line + uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); + + if (exp == 0) { + return WadRayMath.RAY; + } + + uint256 expMinusOne; + uint256 expMinusTwo; + uint256 basePowerTwo; + uint256 basePowerThree; + unchecked { + expMinusOne = exp - 1; + + expMinusTwo = exp > 2 ? exp - 2 : 0; + + basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); + basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; + } + + uint256 secondTerm = exp * expMinusOne * basePowerTwo; + unchecked { + secondTerm /= 2; + } + uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; + unchecked { + thirdTerm /= 6; + } + + return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; + } + + /** + * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp + * @param rate The interest rate (in ray) + * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated + * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray + */ + function calculateCompoundedInterest( + uint256 rate, + uint40 lastUpdateTimestamp + ) internal view returns (uint256) { + return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol new file mode 100644 index 00000000..c000be3a --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title PercentageMath library + * @author Aave + * @notice Provides functions to perform percentage calculations + * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library PercentageMath { + // Maximum percentage factor (100.00%) + uint256 internal constant PERCENTAGE_FACTOR = 1e4; + + // Half percentage factor (50.00%) + uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; + + /** + * @notice Executes a percentage multiplication + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentmul percentage + */ + function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage + assembly { + if iszero( + or( + iszero(percentage), + iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) + ) + ) { + revert(0, 0) + } + + result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) + } + } + + /** + * @notice Executes a percentage division + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param value The value of which the percentage needs to be calculated + * @param percentage The percentage of the value to be calculated + * @return result value percentdiv percentage + */ + function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { + // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR + assembly { + if or( + iszero(percentage), + iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) + ) { + revert(0, 0) + } + + result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) + } + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER.sol new file mode 100644 index 00000000..64c6bd56 --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER.sol @@ -0,0 +1,4044 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol + +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol + +/** + * @title IRewardsDistributor + * @author Aave + * @notice Defines the basic interface for a Rewards Distributor. + */ +interface IRewardsDistributor { + /** + * @dev Emitted when the configuration of the rewards of an asset is updated. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param oldEmission The old emissions per second value of the reward distribution + * @param newEmission The new emissions per second value of the reward distribution + * @param oldDistributionEnd The old end timestamp of the reward distribution + * @param newDistributionEnd The new end timestamp of the reward distribution + * @param assetIndex The index of the asset distribution + */ + event AssetConfigUpdated( + address indexed asset, + address indexed reward, + uint256 oldEmission, + uint256 newEmission, + uint256 oldDistributionEnd, + uint256 newDistributionEnd, + uint256 assetIndex + ); + + /** + * @dev Emitted when rewards of an asset are accrued on behalf of a user. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param user The address of the user that rewards are accrued on behalf of + * @param assetIndex The index of the asset distribution + * @param userIndex The index of the asset distribution on behalf of the user + * @param rewardsAccrued The amount of rewards accrued + */ + event Accrued( + address indexed asset, + address indexed reward, + address indexed user, + uint256 assetIndex, + uint256 userIndex, + uint256 rewardsAccrued + ); + + /** + * @dev Sets the end date for the distribution + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Gets the end date for the distribution + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The timestamp with the end of the distribution, in unix time format + **/ + function getDistributionEnd(address asset, address reward) external view returns (uint256); + + /** + * @dev Returns the index of a user on a reward distribution + * @param user Address of the user + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The current user asset index, not including new distributions + **/ + function getUserAssetIndex( + address user, + address asset, + address reward + ) external view returns (uint256); + + /** + * @dev Returns the configuration of the distribution reward for a certain asset + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The index of the asset distribution + * @return The emission per second of the reward distribution + * @return The timestamp of the last update of the index + * @return The timestamp of the distribution end + **/ + function getRewardsData( + address asset, + address reward + ) external view returns (uint256, uint256, uint256, uint256); + + /** + * @dev Calculates the next value of an specific distribution index, with validations. + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The old index of the asset distribution + * @return The new index of the asset distribution + **/ + function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); + + /** + * @dev Returns the list of available reward token addresses of an incentivized asset + * @param asset The incentivized asset + * @return List of rewards addresses of the input asset + **/ + function getRewardsByAsset(address asset) external view returns (address[] memory); + + /** + * @dev Returns the list of available reward addresses + * @return List of rewards supported in this contract + **/ + function getRewardsList() external view returns (address[] memory); + + /** + * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. + * @param user The address of the user + * @param reward The address of the reward token + * @return Unclaimed rewards, not including new distributions + **/ + function getUserAccruedRewards(address user, address reward) external view returns (uint256); + + /** + * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @param reward The address of the reward token + * @return The rewards amount + **/ + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view returns (uint256); + + /** + * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @return The list of reward addresses + * @return The list of unclaimed amount of rewards + **/ + function getAllUserRewards( + address[] calldata assets, + address user + ) external view returns (address[] memory, uint256[] memory); + + /** + * @dev Returns the decimals of an asset to calculate the distribution delta + * @param asset The address to retrieve decimals + * @return The decimals of an underlying asset + */ + function getAssetDecimals(address asset) external view returns (uint8); + + /** + * @dev Returns the address of the emission manager + * @return The address of the EmissionManager + */ + function EMISSION_MANAGER() external view returns (address); + + /** + * @dev Returns the address of the emission manager. + * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. + * @return The address of the EmissionManager + */ + function getEmissionManager() external view returns (address); +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol + +interface ITransferStrategyBase { + event EmergencyWithdrawal( + address indexed caller, + address indexed token, + address indexed to, + uint256 amount + ); + + /** + * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation + * @param to Account to transfer rewards + * @param reward Address of the reward token + * @param amount Amount to transfer to the "to" address parameter + * @return Returns true bool if transfer logic succeeds + */ + function performTransfer(address to, address reward, uint256 amount) external returns (bool); + + /** + * @return Returns the address of the Incentives Controller + */ + function getIncentivesController() external view returns (address); + + /** + * @return Returns the address of the Rewards admin + */ + function getRewardsAdmin() external view returns (address); + + /** + * @dev Perform an emergency token withdrawal only callable by the Rewards admin + * @param token Address of the token to withdraw funds from this contract + * @param to Address of the recipient of the withdrawal + * @param amount Amount of the withdrawal + */ + function emergencyWithdrawal(address token, address to, uint256 amount) external; +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol + +interface IUiIncentiveDataProviderV3 { + struct AggregatedReserveIncentiveData { + address underlyingAsset; + IncentiveData aIncentiveData; + IncentiveData vIncentiveData; + } + + struct IncentiveData { + address tokenAddress; + address incentiveControllerAddress; + RewardInfo[] rewardsTokenInformation; + } + + struct RewardInfo { + string rewardTokenSymbol; + address rewardTokenAddress; + address rewardOracleAddress; + uint256 emissionPerSecond; + uint256 incentivesLastUpdateTimestamp; + uint256 tokenIncentivesIndex; + uint256 emissionEndTimestamp; + int256 rewardPriceFeed; + uint8 rewardTokenDecimals; + uint8 precision; + uint8 priceFeedDecimals; + } + + struct UserReserveIncentiveData { + address underlyingAsset; + UserIncentiveData aTokenIncentivesUserData; + UserIncentiveData vTokenIncentivesUserData; + } + + struct UserIncentiveData { + address tokenAddress; + address incentiveControllerAddress; + UserRewardInfo[] userRewardsInformation; + } + + struct UserRewardInfo { + string rewardTokenSymbol; + address rewardOracleAddress; + address rewardTokenAddress; + uint256 userUnclaimedRewards; + uint256 tokenIncentivesUserIndex; + int256 rewardPriceFeed; + uint8 priceFeedDecimals; + uint8 rewardTokenDecimals; + } + + function getReservesIncentivesData( + IPoolAddressesProvider provider + ) external view returns (AggregatedReserveIncentiveData[] memory); + + function getUserReservesIncentivesData( + IPoolAddressesProvider provider, + address user + ) external view returns (UserReserveIncentiveData[] memory); + + // generic method with full data + function getFullReservesIncentiveData( + IPoolAddressesProvider provider, + address user + ) + external + view + returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory); +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol + +library RewardsDataTypes { + struct RewardsConfigInput { + uint88 emissionPerSecond; + uint256 totalSupply; + uint32 distributionEnd; + address asset; + address reward; + ITransferStrategyBase transferStrategy; + IEACAggregatorProxy rewardOracle; + } + + struct UserAssetBalance { + address asset; + uint256 userBalance; + uint256 totalSupply; + } + + struct UserData { + // Liquidity index of the reward distribution for the user + uint104 index; + // Amount of accrued rewards for the user since last user index update + uint128 accrued; + } + + struct RewardData { + // Liquidity index of the reward distribution + uint104 index; + // Amount of reward tokens distributed per second + uint88 emissionPerSecond; + // Timestamp of the last reward index update + uint32 lastUpdateTimestamp; + // The end of the distribution of rewards (in seconds) + uint32 distributionEnd; + // Map of user addresses and their rewards data (userAddress => userData) + mapping(address => UserData) usersData; + } + + struct AssetData { + // Map of reward token addresses and their data (rewardTokenAddress => rewardData) + mapping(address => RewardData) rewards; + // List of reward token addresses for the asset + mapping(uint128 => address) availableRewards; + // Count of reward tokens for the asset + uint128 availableRewardsCount; + // Number of decimals of the asset + uint8 decimals; + } +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol + +/** + * @title IRewardsController + * @author Aave + * @notice Defines the basic interface for a Rewards Controller. + */ +interface IRewardsController is IRewardsDistributor { + /** + * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user + * @param user The address of the user + * @param claimer The address of the claimer + */ + event ClaimerSet(address indexed user, address indexed claimer); + + /** + * @dev Emitted when rewards are claimed + * @param user The address of the user rewards has been claimed on behalf of + * @param reward The address of the token reward is claimed + * @param to The address of the receiver of the rewards + * @param claimer The address of the claimer + * @param amount The amount of rewards claimed + */ + event RewardsClaimed( + address indexed user, + address indexed reward, + address indexed to, + address claimer, + uint256 amount + ); + + /** + * @dev Emitted when a transfer strategy is installed for the reward distribution + * @param reward The address of the token reward + * @param transferStrategy The address of TransferStrategy contract + */ + event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); + + /** + * @dev Emitted when the reward oracle is updated + * @param reward The address of the token reward + * @param rewardOracle The address of oracle + */ + event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Get the price aggregator oracle address + * @param reward The address of the reward + * @return The price oracle of the reward + */ + function getRewardOracle(address reward) external view returns (address); + + /** + * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) + * @param user The address of the user + * @return The claimer address + */ + function getClaimer(address user) external view returns (address); + + /** + * @dev Returns the Transfer Strategy implementation contract address being used for a reward address + * @param reward The address of the reward + * @return The address of the TransferStrategy contract + */ + function getTransferStrategy(address reward) external view returns (address); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + **/ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + + /** + * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The + * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external returns (uint256); + + /** + * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" + **/ + function claimAllRewards( + address[] calldata assets, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must + * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsToSelf( + address[] calldata assets + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} + +// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol + +contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { + using UserConfiguration for DataTypes.UserConfigurationMap; + + function getFullReservesIncentiveData( + IPoolAddressesProvider provider, + address user + ) + external + view + override + returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory) + { + return (_getReservesIncentivesData(provider), _getUserReservesIncentivesData(provider, user)); + } + + function getReservesIncentivesData( + IPoolAddressesProvider provider + ) external view override returns (AggregatedReserveIncentiveData[] memory) { + return _getReservesIncentivesData(provider); + } + + function _getReservesIncentivesData( + IPoolAddressesProvider provider + ) private view returns (AggregatedReserveIncentiveData[] memory) { + IPool pool = IPool(provider.getPool()); + address[] memory reserves = pool.getReservesList(); + AggregatedReserveIncentiveData[] + memory reservesIncentiveData = new AggregatedReserveIncentiveData[](reserves.length); + // Iterate through the reserves to get all the information from the (a/s/v) Tokens + for (uint256 i = 0; i < reserves.length; i++) { + AggregatedReserveIncentiveData memory reserveIncentiveData = reservesIncentiveData[i]; + reserveIncentiveData.underlyingAsset = reserves[i]; + + DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); + + // Get aTokens rewards information + IRewardsController aTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) + ); + RewardInfo[] memory aRewardsInformation; + if (address(aTokenIncentiveController) != address(0)) { + address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( + baseData.aTokenAddress + ); + + aRewardsInformation = new RewardInfo[](aTokenRewardAddresses.length); + for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { + RewardInfo memory rewardInformation; + rewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; + + ( + rewardInformation.tokenIncentivesIndex, + rewardInformation.emissionPerSecond, + rewardInformation.incentivesLastUpdateTimestamp, + rewardInformation.emissionEndTimestamp + ) = aTokenIncentiveController.getRewardsData( + baseData.aTokenAddress, + rewardInformation.rewardTokenAddress + ); + + rewardInformation.precision = aTokenIncentiveController.getAssetDecimals( + baseData.aTokenAddress + ); + rewardInformation.rewardTokenDecimals = IERC20Detailed( + rewardInformation.rewardTokenAddress + ).decimals(); + rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) + .symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + rewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( + rewardInformation.rewardTokenAddress + ); + rewardInformation.priceFeedDecimals = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).decimals(); + rewardInformation.rewardPriceFeed = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).latestAnswer(); + + aRewardsInformation[j] = rewardInformation; + } + } + + reserveIncentiveData.aIncentiveData = IncentiveData( + baseData.aTokenAddress, + address(aTokenIncentiveController), + aRewardsInformation + ); + + // Get vTokens rewards information + IRewardsController vTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) + ); + RewardInfo[] memory vRewardsInformation; + if (address(vTokenIncentiveController) != address(0)) { + address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( + baseData.variableDebtTokenAddress + ); + vRewardsInformation = new RewardInfo[](vTokenRewardAddresses.length); + for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { + RewardInfo memory rewardInformation; + rewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; + + ( + rewardInformation.tokenIncentivesIndex, + rewardInformation.emissionPerSecond, + rewardInformation.incentivesLastUpdateTimestamp, + rewardInformation.emissionEndTimestamp + ) = vTokenIncentiveController.getRewardsData( + baseData.variableDebtTokenAddress, + rewardInformation.rewardTokenAddress + ); + + rewardInformation.precision = vTokenIncentiveController.getAssetDecimals( + baseData.variableDebtTokenAddress + ); + rewardInformation.rewardTokenDecimals = IERC20Detailed( + rewardInformation.rewardTokenAddress + ).decimals(); + rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) + .symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + rewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( + rewardInformation.rewardTokenAddress + ); + rewardInformation.priceFeedDecimals = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).decimals(); + rewardInformation.rewardPriceFeed = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).latestAnswer(); + + vRewardsInformation[j] = rewardInformation; + } + } + + reserveIncentiveData.vIncentiveData = IncentiveData( + baseData.variableDebtTokenAddress, + address(vTokenIncentiveController), + vRewardsInformation + ); + } + + return (reservesIncentiveData); + } + + function getUserReservesIncentivesData( + IPoolAddressesProvider provider, + address user + ) external view override returns (UserReserveIncentiveData[] memory) { + return _getUserReservesIncentivesData(provider, user); + } + + function _getUserReservesIncentivesData( + IPoolAddressesProvider provider, + address user + ) private view returns (UserReserveIncentiveData[] memory) { + IPool pool = IPool(provider.getPool()); + address[] memory reserves = pool.getReservesList(); + + UserReserveIncentiveData[] memory userReservesIncentivesData = new UserReserveIncentiveData[]( + user != address(0) ? reserves.length : 0 + ); + + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); + + // user reserve data + userReservesIncentivesData[i].underlyingAsset = reserves[i]; + + IRewardsController aTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) + ); + if (address(aTokenIncentiveController) != address(0)) { + // get all rewards information from the asset + address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( + baseData.aTokenAddress + ); + UserRewardInfo[] memory aUserRewardsInformation = new UserRewardInfo[]( + aTokenRewardAddresses.length + ); + for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { + UserRewardInfo memory userRewardInformation; + userRewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; + + userRewardInformation.tokenIncentivesUserIndex = aTokenIncentiveController + .getUserAssetIndex( + user, + baseData.aTokenAddress, + userRewardInformation.rewardTokenAddress + ); + + userRewardInformation.userUnclaimedRewards = aTokenIncentiveController + .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); + userRewardInformation.rewardTokenDecimals = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).decimals(); + userRewardInformation.rewardTokenSymbol = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + userRewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( + userRewardInformation.rewardTokenAddress + ); + userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).decimals(); + userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).latestAnswer(); + + aUserRewardsInformation[j] = userRewardInformation; + } + + userReservesIncentivesData[i].aTokenIncentivesUserData = UserIncentiveData( + baseData.aTokenAddress, + address(aTokenIncentiveController), + aUserRewardsInformation + ); + } + + // variable debt token + IRewardsController vTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) + ); + if (address(vTokenIncentiveController) != address(0)) { + // get all rewards information from the asset + address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( + baseData.variableDebtTokenAddress + ); + UserRewardInfo[] memory vUserRewardsInformation = new UserRewardInfo[]( + vTokenRewardAddresses.length + ); + for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { + UserRewardInfo memory userRewardInformation; + userRewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; + + userRewardInformation.tokenIncentivesUserIndex = vTokenIncentiveController + .getUserAssetIndex( + user, + baseData.variableDebtTokenAddress, + userRewardInformation.rewardTokenAddress + ); + + userRewardInformation.userUnclaimedRewards = vTokenIncentiveController + .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); + userRewardInformation.rewardTokenDecimals = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).decimals(); + userRewardInformation.rewardTokenSymbol = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + userRewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( + userRewardInformation.rewardTokenAddress + ); + userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).decimals(); + userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).latestAnswer(); + + vUserRewardsInformation[j] = userRewardInformation; + } + + userReservesIncentivesData[i].vTokenIncentivesUserData = UserIncentiveData( + baseData.variableDebtTokenAddress, + address(aTokenIncentiveController), + vUserRewardsInformation + ); + } + } + + return (userReservesIncentivesData); + } +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol new file mode 100644 index 00000000..fa24a0a1 --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) +pragma solidity ^0.8.10; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); + return uint224(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); + return uint96(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, 'SafeCast: value must be positive'); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require( + value >= type(int128).min && value <= type(int128).max, + "SafeCast: value doesn't fit in 128 bits" + ); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require( + value >= type(int64).min && value <= type(int64).max, + "SafeCast: value doesn't fit in 64 bits" + ); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require( + value >= type(int32).min && value <= type(int32).max, + "SafeCast: value doesn't fit in 32 bits" + ); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require( + value >= type(int16).min && value <= type(int16).max, + "SafeCast: value doesn't fit in 16 bits" + ); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require( + value >= type(int8).min && value <= type(int8).max, + "SafeCast: value doesn't fit in 8 bits" + ); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol new file mode 100644 index 00000000..79a1829d --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol @@ -0,0 +1,294 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../interfaces/IPool.sol'; +import {IncentivizedERC20} from '../protocol/tokenization/base/IncentivizedERC20.sol'; +import {UserConfiguration} from '../../contracts/protocol/libraries/configuration/UserConfiguration.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; +import {IRewardsController} from '../rewards/interfaces/IRewardsController.sol'; +import {IEACAggregatorProxy} from './interfaces/IEACAggregatorProxy.sol'; +import {IUiIncentiveDataProviderV3} from './interfaces/IUiIncentiveDataProviderV3.sol'; + +contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { + using UserConfiguration for DataTypes.UserConfigurationMap; + + function getFullReservesIncentiveData( + IPoolAddressesProvider provider, + address user + ) + external + view + override + returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory) + { + return (_getReservesIncentivesData(provider), _getUserReservesIncentivesData(provider, user)); + } + + function getReservesIncentivesData( + IPoolAddressesProvider provider + ) external view override returns (AggregatedReserveIncentiveData[] memory) { + return _getReservesIncentivesData(provider); + } + + function _getReservesIncentivesData( + IPoolAddressesProvider provider + ) private view returns (AggregatedReserveIncentiveData[] memory) { + IPool pool = IPool(provider.getPool()); + address[] memory reserves = pool.getReservesList(); + AggregatedReserveIncentiveData[] + memory reservesIncentiveData = new AggregatedReserveIncentiveData[](reserves.length); + // Iterate through the reserves to get all the information from the (a/s/v) Tokens + for (uint256 i = 0; i < reserves.length; i++) { + AggregatedReserveIncentiveData memory reserveIncentiveData = reservesIncentiveData[i]; + reserveIncentiveData.underlyingAsset = reserves[i]; + + DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); + + // Get aTokens rewards information + IRewardsController aTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) + ); + RewardInfo[] memory aRewardsInformation; + if (address(aTokenIncentiveController) != address(0)) { + address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( + baseData.aTokenAddress + ); + + aRewardsInformation = new RewardInfo[](aTokenRewardAddresses.length); + for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { + RewardInfo memory rewardInformation; + rewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; + + ( + rewardInformation.tokenIncentivesIndex, + rewardInformation.emissionPerSecond, + rewardInformation.incentivesLastUpdateTimestamp, + rewardInformation.emissionEndTimestamp + ) = aTokenIncentiveController.getRewardsData( + baseData.aTokenAddress, + rewardInformation.rewardTokenAddress + ); + + rewardInformation.precision = aTokenIncentiveController.getAssetDecimals( + baseData.aTokenAddress + ); + rewardInformation.rewardTokenDecimals = IERC20Detailed( + rewardInformation.rewardTokenAddress + ).decimals(); + rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) + .symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + rewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( + rewardInformation.rewardTokenAddress + ); + rewardInformation.priceFeedDecimals = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).decimals(); + rewardInformation.rewardPriceFeed = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).latestAnswer(); + + aRewardsInformation[j] = rewardInformation; + } + } + + reserveIncentiveData.aIncentiveData = IncentiveData( + baseData.aTokenAddress, + address(aTokenIncentiveController), + aRewardsInformation + ); + + // Get vTokens rewards information + IRewardsController vTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) + ); + RewardInfo[] memory vRewardsInformation; + if (address(vTokenIncentiveController) != address(0)) { + address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( + baseData.variableDebtTokenAddress + ); + vRewardsInformation = new RewardInfo[](vTokenRewardAddresses.length); + for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { + RewardInfo memory rewardInformation; + rewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; + + ( + rewardInformation.tokenIncentivesIndex, + rewardInformation.emissionPerSecond, + rewardInformation.incentivesLastUpdateTimestamp, + rewardInformation.emissionEndTimestamp + ) = vTokenIncentiveController.getRewardsData( + baseData.variableDebtTokenAddress, + rewardInformation.rewardTokenAddress + ); + + rewardInformation.precision = vTokenIncentiveController.getAssetDecimals( + baseData.variableDebtTokenAddress + ); + rewardInformation.rewardTokenDecimals = IERC20Detailed( + rewardInformation.rewardTokenAddress + ).decimals(); + rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) + .symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + rewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( + rewardInformation.rewardTokenAddress + ); + rewardInformation.priceFeedDecimals = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).decimals(); + rewardInformation.rewardPriceFeed = IEACAggregatorProxy( + rewardInformation.rewardOracleAddress + ).latestAnswer(); + + vRewardsInformation[j] = rewardInformation; + } + } + + reserveIncentiveData.vIncentiveData = IncentiveData( + baseData.variableDebtTokenAddress, + address(vTokenIncentiveController), + vRewardsInformation + ); + } + + return (reservesIncentiveData); + } + + function getUserReservesIncentivesData( + IPoolAddressesProvider provider, + address user + ) external view override returns (UserReserveIncentiveData[] memory) { + return _getUserReservesIncentivesData(provider, user); + } + + function _getUserReservesIncentivesData( + IPoolAddressesProvider provider, + address user + ) private view returns (UserReserveIncentiveData[] memory) { + IPool pool = IPool(provider.getPool()); + address[] memory reserves = pool.getReservesList(); + + UserReserveIncentiveData[] memory userReservesIncentivesData = new UserReserveIncentiveData[]( + user != address(0) ? reserves.length : 0 + ); + + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); + + // user reserve data + userReservesIncentivesData[i].underlyingAsset = reserves[i]; + + IRewardsController aTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) + ); + if (address(aTokenIncentiveController) != address(0)) { + // get all rewards information from the asset + address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( + baseData.aTokenAddress + ); + UserRewardInfo[] memory aUserRewardsInformation = new UserRewardInfo[]( + aTokenRewardAddresses.length + ); + for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { + UserRewardInfo memory userRewardInformation; + userRewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; + + userRewardInformation.tokenIncentivesUserIndex = aTokenIncentiveController + .getUserAssetIndex( + user, + baseData.aTokenAddress, + userRewardInformation.rewardTokenAddress + ); + + userRewardInformation.userUnclaimedRewards = aTokenIncentiveController + .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); + userRewardInformation.rewardTokenDecimals = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).decimals(); + userRewardInformation.rewardTokenSymbol = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + userRewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( + userRewardInformation.rewardTokenAddress + ); + userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).decimals(); + userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).latestAnswer(); + + aUserRewardsInformation[j] = userRewardInformation; + } + + userReservesIncentivesData[i].aTokenIncentivesUserData = UserIncentiveData( + baseData.aTokenAddress, + address(aTokenIncentiveController), + aUserRewardsInformation + ); + } + + // variable debt token + IRewardsController vTokenIncentiveController = IRewardsController( + address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) + ); + if (address(vTokenIncentiveController) != address(0)) { + // get all rewards information from the asset + address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( + baseData.variableDebtTokenAddress + ); + UserRewardInfo[] memory vUserRewardsInformation = new UserRewardInfo[]( + vTokenRewardAddresses.length + ); + for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { + UserRewardInfo memory userRewardInformation; + userRewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; + + userRewardInformation.tokenIncentivesUserIndex = vTokenIncentiveController + .getUserAssetIndex( + user, + baseData.variableDebtTokenAddress, + userRewardInformation.rewardTokenAddress + ); + + userRewardInformation.userUnclaimedRewards = vTokenIncentiveController + .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); + userRewardInformation.rewardTokenDecimals = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).decimals(); + userRewardInformation.rewardTokenSymbol = IERC20Detailed( + userRewardInformation.rewardTokenAddress + ).symbol(); + + // Get price of reward token from Chainlink Proxy Oracle + userRewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( + userRewardInformation.rewardTokenAddress + ); + userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).decimals(); + userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( + userRewardInformation.rewardOracleAddress + ).latestAnswer(); + + vUserRewardsInformation[j] = userRewardInformation; + } + + userReservesIncentivesData[i].vTokenIncentivesUserData = UserIncentiveData( + baseData.variableDebtTokenAddress, + address(aTokenIncentiveController), + vUserRewardsInformation + ); + } + } + + return (userReservesIncentivesData); + } +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol new file mode 100644 index 00000000..c89baee6 --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol new file mode 100644 index 00000000..3402953f --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; + +interface IUiIncentiveDataProviderV3 { + struct AggregatedReserveIncentiveData { + address underlyingAsset; + IncentiveData aIncentiveData; + IncentiveData vIncentiveData; + } + + struct IncentiveData { + address tokenAddress; + address incentiveControllerAddress; + RewardInfo[] rewardsTokenInformation; + } + + struct RewardInfo { + string rewardTokenSymbol; + address rewardTokenAddress; + address rewardOracleAddress; + uint256 emissionPerSecond; + uint256 incentivesLastUpdateTimestamp; + uint256 tokenIncentivesIndex; + uint256 emissionEndTimestamp; + int256 rewardPriceFeed; + uint8 rewardTokenDecimals; + uint8 precision; + uint8 priceFeedDecimals; + } + + struct UserReserveIncentiveData { + address underlyingAsset; + UserIncentiveData aTokenIncentivesUserData; + UserIncentiveData vTokenIncentivesUserData; + } + + struct UserIncentiveData { + address tokenAddress; + address incentiveControllerAddress; + UserRewardInfo[] userRewardsInformation; + } + + struct UserRewardInfo { + string rewardTokenSymbol; + address rewardOracleAddress; + address rewardTokenAddress; + uint256 userUnclaimedRewards; + uint256 tokenIncentivesUserIndex; + int256 rewardPriceFeed; + uint8 priceFeedDecimals; + uint8 rewardTokenDecimals; + } + + function getReservesIncentivesData( + IPoolAddressesProvider provider + ) external view returns (AggregatedReserveIncentiveData[] memory); + + function getUserReservesIncentivesData( + IPoolAddressesProvider provider, + address user + ) external view returns (UserReserveIncentiveData[] memory); + + // generic method with full data + function getFullReservesIncentiveData( + IPoolAddressesProvider provider, + address user + ) + external + view + returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory); +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol new file mode 100644 index 00000000..69eca346 --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IACLManager + * @author Aave + * @notice Defines the basic interface for the ACL Manager + */ +interface IACLManager { + /** + * @notice Returns the contract address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the identifier of the PoolAdmin role + * @return The id of the PoolAdmin role + */ + function POOL_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the EmergencyAdmin role + * @return The id of the EmergencyAdmin role + */ + function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the RiskAdmin role + * @return The id of the RiskAdmin role + */ + function RISK_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the FlashBorrower role + * @return The id of the FlashBorrower role + */ + function FLASH_BORROWER_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the Bridge role + * @return The id of the Bridge role + */ + function BRIDGE_ROLE() external view returns (bytes32); + + /** + * @notice Returns the identifier of the AssetListingAdmin role + * @return The id of the AssetListingAdmin role + */ + function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); + + /** + * @notice Set the role as admin of a specific role. + * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. + * @param role The role to be managed by the admin role + * @param adminRole The admin role + */ + function setRoleAdmin(bytes32 role, bytes32 adminRole) external; + + /** + * @notice Adds a new admin as PoolAdmin + * @param admin The address of the new admin + */ + function addPoolAdmin(address admin) external; + + /** + * @notice Removes an admin as PoolAdmin + * @param admin The address of the admin to remove + */ + function removePoolAdmin(address admin) external; + + /** + * @notice Returns true if the address is PoolAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is PoolAdmin, false otherwise + */ + function isPoolAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as EmergencyAdmin + * @param admin The address of the new admin + */ + function addEmergencyAdmin(address admin) external; + + /** + * @notice Removes an admin as EmergencyAdmin + * @param admin The address of the admin to remove + */ + function removeEmergencyAdmin(address admin) external; + + /** + * @notice Returns true if the address is EmergencyAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is EmergencyAdmin, false otherwise + */ + function isEmergencyAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new admin as RiskAdmin + * @param admin The address of the new admin + */ + function addRiskAdmin(address admin) external; + + /** + * @notice Removes an admin as RiskAdmin + * @param admin The address of the admin to remove + */ + function removeRiskAdmin(address admin) external; + + /** + * @notice Returns true if the address is RiskAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is RiskAdmin, false otherwise + */ + function isRiskAdmin(address admin) external view returns (bool); + + /** + * @notice Adds a new address as FlashBorrower + * @param borrower The address of the new FlashBorrower + */ + function addFlashBorrower(address borrower) external; + + /** + * @notice Removes an address as FlashBorrower + * @param borrower The address of the FlashBorrower to remove + */ + function removeFlashBorrower(address borrower) external; + + /** + * @notice Returns true if the address is FlashBorrower, false otherwise + * @param borrower The address to check + * @return True if the given address is FlashBorrower, false otherwise + */ + function isFlashBorrower(address borrower) external view returns (bool); + + /** + * @notice Adds a new address as Bridge + * @param bridge The address of the new Bridge + */ + function addBridge(address bridge) external; + + /** + * @notice Removes an address as Bridge + * @param bridge The address of the bridge to remove + */ + function removeBridge(address bridge) external; + + /** + * @notice Returns true if the address is Bridge, false otherwise + * @param bridge The address to check + * @return True if the given address is Bridge, false otherwise + */ + function isBridge(address bridge) external view returns (bool); + + /** + * @notice Adds a new admin as AssetListingAdmin + * @param admin The address of the new admin + */ + function addAssetListingAdmin(address admin) external; + + /** + * @notice Removes an admin as AssetListingAdmin + * @param admin The address of the admin to remove + */ + function removeAssetListingAdmin(address admin) external; + + /** + * @notice Returns true if the address is AssetListingAdmin, false otherwise + * @param admin The address to check + * @return True if the given address is AssetListingAdmin, false otherwise + */ + function isAssetListingAdmin(address admin) external view returns (bool); +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol new file mode 100644 index 00000000..4bca0483 --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; +import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; +import {Errors} from '../../libraries/helpers/Errors.sol'; +import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; +import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../../../interfaces/IPool.sol'; +import {IACLManager} from '../../../interfaces/IACLManager.sol'; + +/** + * @title IncentivizedERC20 + * @author Aave, inspired by the Openzeppelin ERC20 implementation + * @notice Basic ERC20 implementation + */ +abstract contract IncentivizedERC20 is Context, IERC20Detailed { + using WadRayMath for uint256; + using SafeCast for uint256; + + /** + * @dev Only pool admin can call functions marked by this modifier. + */ + modifier onlyPoolAdmin() { + IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); + require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev Only pool can call functions marked by this modifier. + */ + modifier onlyPool() { + require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); + _; + } + + /** + * @dev UserState - additionalData is a flexible field. + * ATokens and VariableDebtTokens use this field store the index of the + * user's last supply/withdrawal/borrow/repayment. + */ + struct UserState { + uint128 balance; + uint128 additionalData; + } + // Map of users address and their state data (userAddress => userStateData) + mapping(address => UserState) internal _userState; + + // Map of allowances (delegator => delegatee => allowanceAmount) + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 internal _totalSupply; + string private _name; + string private _symbol; + uint8 private _decimals; + IAaveIncentivesController internal _incentivesController; + IPoolAddressesProvider internal immutable _addressesProvider; + IPool public immutable POOL; + + /** + * @dev Constructor. + * @param pool The reference to the main Pool contract + * @param name_ The name of the token + * @param symbol_ The symbol of the token + * @param decimals_ The number of decimals of the token + */ + constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { + _addressesProvider = pool.ADDRESSES_PROVIDER(); + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + POOL = pool; + } + + /// @inheritdoc IERC20Detailed + function name() public view override returns (string memory) { + return _name; + } + + /// @inheritdoc IERC20Detailed + function symbol() external view override returns (string memory) { + return _symbol; + } + + /// @inheritdoc IERC20Detailed + function decimals() external view override returns (uint8) { + return _decimals; + } + + /// @inheritdoc IERC20 + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + /// @inheritdoc IERC20 + function balanceOf(address account) public view virtual override returns (uint256) { + return _userState[account].balance; + } + + /** + * @notice Returns the address of the Incentives Controller contract + * @return The address of the Incentives Controller + */ + function getIncentivesController() external view virtual returns (IAaveIncentivesController) { + return _incentivesController; + } + + /** + * @notice Sets a new Incentives Controller + * @param controller the new Incentives controller + */ + function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { + _incentivesController = controller; + } + + /// @inheritdoc IERC20 + function transfer(address recipient, uint256 amount) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _transfer(_msgSender(), recipient, castAmount); + return true; + } + + /// @inheritdoc IERC20 + function allowance( + address owner, + address spender + ) external view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 amount) external virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /// @inheritdoc IERC20 + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external virtual override returns (bool) { + uint128 castAmount = amount.toUint128(); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); + _transfer(sender, recipient, castAmount); + return true; + } + + /** + * @notice Increases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param addedValue The amount being added to the allowance + * @return `true` + */ + function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @notice Decreases the allowance of spender to spend _msgSender() tokens + * @param spender The user allowed to spend on behalf of _msgSender() + * @param subtractedValue The amount being subtracted to the allowance + * @return `true` + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) external virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @notice Transfers tokens between two users and apply incentives if defined. + * @param sender The source address + * @param recipient The destination address + * @param amount The amount getting transferred + */ + function _transfer(address sender, address recipient, uint128 amount) internal virtual { + uint128 oldSenderBalance = _userState[sender].balance; + _userState[sender].balance = oldSenderBalance - amount; + uint128 oldRecipientBalance = _userState[recipient].balance; + _userState[recipient].balance = oldRecipientBalance + amount; + + IAaveIncentivesController incentivesControllerLocal = _incentivesController; + if (address(incentivesControllerLocal) != address(0)) { + uint256 currentTotalSupply = _totalSupply; + incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); + if (sender != recipient) { + incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); + } + } + } + + /** + * @notice Approve `spender` to use `amount` of `owner`s balance + * @param owner The address owning the tokens + * @param spender The address approved for spending + * @param amount The amount of tokens to approve spending of + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @notice Update the name of the token + * @param newName The new name for the token + */ + function _setName(string memory newName) internal { + _name = newName; + } + + /** + * @notice Update the symbol for the token + * @param newSymbol The new symbol for the token + */ + function _setSymbol(string memory newSymbol) internal { + _symbol = newSymbol; + } + + /** + * @notice Update the number of decimals for the token + * @param newDecimals The new number of decimals for the token + */ + function _setDecimals(uint8 newDecimals) internal { + _decimals = newDecimals; + } +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol new file mode 100644 index 00000000..cdb2ac29 --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IRewardsDistributor} from './IRewardsDistributor.sol'; +import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; +import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; +import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; + +/** + * @title IRewardsController + * @author Aave + * @notice Defines the basic interface for a Rewards Controller. + */ +interface IRewardsController is IRewardsDistributor { + /** + * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user + * @param user The address of the user + * @param claimer The address of the claimer + */ + event ClaimerSet(address indexed user, address indexed claimer); + + /** + * @dev Emitted when rewards are claimed + * @param user The address of the user rewards has been claimed on behalf of + * @param reward The address of the token reward is claimed + * @param to The address of the receiver of the rewards + * @param claimer The address of the claimer + * @param amount The amount of rewards claimed + */ + event RewardsClaimed( + address indexed user, + address indexed reward, + address indexed to, + address claimer, + uint256 amount + ); + + /** + * @dev Emitted when a transfer strategy is installed for the reward distribution + * @param reward The address of the token reward + * @param transferStrategy The address of TransferStrategy contract + */ + event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); + + /** + * @dev Emitted when the reward oracle is updated + * @param reward The address of the token reward + * @param rewardOracle The address of oracle + */ + event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); + + /** + * @dev Whitelists an address to claim the rewards on behalf of another address + * @param user The address of the user + * @param claimer The address of the claimer + */ + function setClaimer(address user, address claimer) external; + + /** + * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer + * @param reward The address of the reward token + * @param transferStrategy The address of the TransferStrategy logic contract + */ + function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; + + /** + * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. + * @notice At the moment of reward configuration, the Incentives Controller performs + * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. + * This check is enforced for integrators to be able to show incentives at + * the current Aave UI without the need to setup an external price registry + * @param reward The address of the reward to set the price aggregator + * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface + */ + function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + + /** + * @dev Get the price aggregator oracle address + * @param reward The address of the reward + * @return The price oracle of the reward + */ + function getRewardOracle(address reward) external view returns (address); + + /** + * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) + * @param user The address of the user + * @return The claimer address + */ + function getClaimer(address user) external view returns (address); + + /** + * @dev Returns the Transfer Strategy implementation contract address being used for a reward address + * @param reward The address of the reward + * @return The address of the TransferStrategy contract + */ + function getTransferStrategy(address reward) external view returns (address); + + /** + * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. + * @param config The assets configuration input, the list of structs contains the following fields: + * uint104 emissionPerSecond: The emission per second following rewards unit decimals. + * uint256 totalSupply: The total supply of the asset to incentivize + * uint40 distributionEnd: The end of the distribution of the incentives for an asset + * address asset: The asset address to incentivize + * address reward: The reward token address + * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. + * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. + */ + function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; + + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + **/ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; + + /** + * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets List of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The + * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsOnBehalf( + address[] calldata assets, + uint256 amount, + address user, + address to, + address reward + ) external returns (uint256); + + /** + * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param amount The amount of rewards to claim + * @param reward The address of the reward token + * @return The amount of rewards claimed + **/ + function claimRewardsToSelf( + address[] calldata assets, + uint256 amount, + address reward + ) external returns (uint256); + + /** + * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" + **/ + function claimAllRewards( + address[] calldata assets, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must + * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager + * @param assets The list of assets to check eligible distributions before claiming rewards + * @param user The address to check and claim rewards + * @param to The address that will be receiving the rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsOnBehalf( + address[] calldata assets, + address user, + address to + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); + + /** + * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards + * @param assets The list of assets to check eligible distributions before claiming rewards + * @return rewardsList List of addresses of the reward tokens + * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" + **/ + function claimAllRewardsToSelf( + address[] calldata assets + ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol new file mode 100644 index 00000000..5cb58856 --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/** + * @title IRewardsDistributor + * @author Aave + * @notice Defines the basic interface for a Rewards Distributor. + */ +interface IRewardsDistributor { + /** + * @dev Emitted when the configuration of the rewards of an asset is updated. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param oldEmission The old emissions per second value of the reward distribution + * @param newEmission The new emissions per second value of the reward distribution + * @param oldDistributionEnd The old end timestamp of the reward distribution + * @param newDistributionEnd The new end timestamp of the reward distribution + * @param assetIndex The index of the asset distribution + */ + event AssetConfigUpdated( + address indexed asset, + address indexed reward, + uint256 oldEmission, + uint256 newEmission, + uint256 oldDistributionEnd, + uint256 newDistributionEnd, + uint256 assetIndex + ); + + /** + * @dev Emitted when rewards of an asset are accrued on behalf of a user. + * @param asset The address of the incentivized asset + * @param reward The address of the reward token + * @param user The address of the user that rewards are accrued on behalf of + * @param assetIndex The index of the asset distribution + * @param userIndex The index of the asset distribution on behalf of the user + * @param rewardsAccrued The amount of rewards accrued + */ + event Accrued( + address indexed asset, + address indexed reward, + address indexed user, + uint256 assetIndex, + uint256 userIndex, + uint256 rewardsAccrued + ); + + /** + * @dev Sets the end date for the distribution + * @param asset The asset to incentivize + * @param reward The reward token that incentives the asset + * @param newDistributionEnd The end date of the incentivization, in unix time format + **/ + function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; + + /** + * @dev Sets the emission per second of a set of reward distributions + * @param asset The asset is being incentivized + * @param rewards List of reward addresses are being distributed + * @param newEmissionsPerSecond List of new reward emissions per second + */ + function setEmissionPerSecond( + address asset, + address[] calldata rewards, + uint88[] calldata newEmissionsPerSecond + ) external; + + /** + * @dev Gets the end date for the distribution + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The timestamp with the end of the distribution, in unix time format + **/ + function getDistributionEnd(address asset, address reward) external view returns (uint256); + + /** + * @dev Returns the index of a user on a reward distribution + * @param user Address of the user + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The current user asset index, not including new distributions + **/ + function getUserAssetIndex( + address user, + address asset, + address reward + ) external view returns (uint256); + + /** + * @dev Returns the configuration of the distribution reward for a certain asset + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The index of the asset distribution + * @return The emission per second of the reward distribution + * @return The timestamp of the last update of the index + * @return The timestamp of the distribution end + **/ + function getRewardsData( + address asset, + address reward + ) external view returns (uint256, uint256, uint256, uint256); + + /** + * @dev Calculates the next value of an specific distribution index, with validations. + * @param asset The incentivized asset + * @param reward The reward token of the incentivized asset + * @return The old index of the asset distribution + * @return The new index of the asset distribution + **/ + function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); + + /** + * @dev Returns the list of available reward token addresses of an incentivized asset + * @param asset The incentivized asset + * @return List of rewards addresses of the input asset + **/ + function getRewardsByAsset(address asset) external view returns (address[] memory); + + /** + * @dev Returns the list of available reward addresses + * @return List of rewards supported in this contract + **/ + function getRewardsList() external view returns (address[] memory); + + /** + * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. + * @param user The address of the user + * @param reward The address of the reward token + * @return Unclaimed rewards, not including new distributions + **/ + function getUserAccruedRewards(address user, address reward) external view returns (uint256); + + /** + * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @param reward The address of the reward token + * @return The rewards amount + **/ + function getUserRewards( + address[] calldata assets, + address user, + address reward + ) external view returns (uint256); + + /** + * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards + * @param assets List of incentivized assets to check eligible distributions + * @param user The address of the user + * @return The list of reward addresses + * @return The list of unclaimed amount of rewards + **/ + function getAllUserRewards( + address[] calldata assets, + address user + ) external view returns (address[] memory, uint256[] memory); + + /** + * @dev Returns the decimals of an asset to calculate the distribution delta + * @param asset The address to retrieve decimals + * @return The decimals of an underlying asset + */ + function getAssetDecimals(address asset) external view returns (uint8); + + /** + * @dev Returns the address of the emission manager + * @return The address of the EmissionManager + */ + function EMISSION_MANAGER() external view returns (address); + + /** + * @dev Returns the address of the emission manager. + * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. + * @return The address of the EmissionManager + */ + function getEmissionManager() external view returns (address); +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol new file mode 100644 index 00000000..d2848fef --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +interface ITransferStrategyBase { + event EmergencyWithdrawal( + address indexed caller, + address indexed token, + address indexed to, + uint256 amount + ); + + /** + * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation + * @param to Account to transfer rewards + * @param reward Address of the reward token + * @param amount Amount to transfer to the "to" address parameter + * @return Returns true bool if transfer logic succeeds + */ + function performTransfer(address to, address reward, uint256 amount) external returns (bool); + + /** + * @return Returns the address of the Incentives Controller + */ + function getIncentivesController() external view returns (address); + + /** + * @return Returns the address of the Rewards admin + */ + function getRewardsAdmin() external view returns (address); + + /** + * @dev Perform an emergency token withdrawal only callable by the Rewards admin + * @param token Address of the token to withdraw funds from this contract + * @param to Address of the recipient of the withdrawal + * @param amount Amount of the withdrawal + */ + function emergencyWithdrawal(address token, address to, uint256 amount) external; +} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol new file mode 100644 index 00000000..38fe87c5 --- /dev/null +++ b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; +import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; + +library RewardsDataTypes { + struct RewardsConfigInput { + uint88 emissionPerSecond; + uint256 totalSupply; + uint32 distributionEnd; + address asset; + address reward; + ITransferStrategyBase transferStrategy; + IEACAggregatorProxy rewardOracle; + } + + struct UserAssetBalance { + address asset; + uint256 userBalance; + uint256 totalSupply; + } + + struct UserData { + // Liquidity index of the reward distribution for the user + uint104 index; + // Amount of accrued rewards for the user since last user index update + uint128 accrued; + } + + struct RewardData { + // Liquidity index of the reward distribution + uint104 index; + // Amount of reward tokens distributed per second + uint88 emissionPerSecond; + // Timestamp of the last reward index update + uint32 lastUpdateTimestamp; + // The end of the distribution of rewards (in seconds) + uint32 distributionEnd; + // Map of user addresses and their rewards data (userAddress => userData) + mapping(address => UserData) usersData; + } + + struct AssetData { + // Map of reward token addresses and their data (rewardTokenAddress => rewardData) + mapping(address => RewardData) rewards; + // List of reward token addresses for the asset + mapping(uint128 => address) availableRewards; + // Count of reward tokens for the asset + uint128 availableRewardsCount; + // Number of decimals of the asset + uint8 decimals; + } +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER.sol new file mode 100644 index 00000000..2d973663 --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER.sol @@ -0,0 +1,4068 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol + +interface IERC20DetailedBytes is IERC20 { + function name() external view returns (bytes32); + + function symbol() external view returns (bytes32); + + function decimals() external view returns (uint8); +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol + +/** + * @title IPoolDataProvider + * @author Aave + * @notice Defines the basic interface of a PoolDataProvider + */ +interface IPoolDataProvider { + struct TokenData { + string symbol; + address tokenAddress; + } + + /** + * @notice Returns the address for the PoolAddressesProvider contract. + * @return The address for the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the list of the existing reserves in the pool. + * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. + * @return The list of reserves, pairs of symbols and addresses + */ + function getAllReservesTokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the list of the existing ATokens in the pool. + * @return The list of ATokens, pairs of symbols and addresses + */ + function getAllATokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the configuration data of the reserve + * @dev Not returning borrow and supply caps for compatibility, nor pause flag + * @param asset The address of the underlying asset of the reserve + * @return decimals The number of decimals of the reserve + * @return ltv The ltv of the reserve + * @return liquidationThreshold The liquidationThreshold of the reserve + * @return liquidationBonus The liquidationBonus of the reserve + * @return reserveFactor The reserveFactor of the reserve + * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise + * @return borrowingEnabled True if borrowing is enabled, false otherwise + * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise + * @return isActive True if it is active, false otherwise + * @return isFrozen True if it is frozen, false otherwise + */ + function getReserveConfigurationData( + address asset + ) + external + view + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ); + + /** + * @notice Returns the caps parameters of the reserve + * @param asset The address of the underlying asset of the reserve + * @return borrowCap The borrow cap of the reserve + * @return supplyCap The supply cap of the reserve + */ + function getReserveCaps( + address asset + ) external view returns (uint256 borrowCap, uint256 supplyCap); + + /** + * @notice Returns if the pool is paused + * @param asset The address of the underlying asset of the reserve + * @return isPaused True if the pool is paused, false otherwise + */ + function getPaused(address asset) external view returns (bool isPaused); + + /** + * @notice Returns the siloed borrowing flag + * @param asset The address of the underlying asset of the reserve + * @return True if the asset is siloed for borrowing + */ + function getSiloedBorrowing(address asset) external view returns (bool); + + /** + * @notice Returns the protocol fee on the liquidation bonus + * @param asset The address of the underlying asset of the reserve + * @return The protocol fee on liquidation + */ + function getLiquidationProtocolFee(address asset) external view returns (uint256); + + /** + * @notice Returns the unbacked mint cap of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The unbacked mint cap of the reserve + */ + function getUnbackedMintCap(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The debt ceiling of the reserve + */ + function getDebtCeiling(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling decimals + * @return The debt ceiling decimals + */ + function getDebtCeilingDecimals() external pure returns (uint256); + + /** + * @notice Returns the reserve data + * @param asset The address of the underlying asset of the reserve + * @return unbacked The amount of unbacked tokens + * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted + * @return totalAToken The total supply of the aToken + * @return totalStableDebt The total stable debt of the reserve + * @return totalVariableDebt The total variable debt of the reserve + * @return liquidityRate The liquidity rate of the reserve + * @return variableBorrowRate The variable borrow rate of the reserve + * @return stableBorrowRate The stable borrow rate of the reserve + * @return averageStableBorrowRate The average stable borrow rate of the reserve + * @return liquidityIndex The liquidity index of the reserve + * @return variableBorrowIndex The variable borrow index of the reserve + * @return lastUpdateTimestamp The timestamp of the last update of the reserve + */ + function getReserveData( + address asset + ) + external + view + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ); + + /** + * @notice Returns the total supply of aTokens for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total supply of the aToken + */ + function getATokenTotalSupply(address asset) external view returns (uint256); + + /** + * @notice Returns the total debt for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total debt for asset + */ + function getTotalDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the user data in a reserve + * @param asset The address of the underlying asset of the reserve + * @param user The address of the user + * @return currentATokenBalance The current AToken balance of the user + * @return currentStableDebt The current stable debt of the user + * @return currentVariableDebt The current variable debt of the user + * @return principalStableDebt The principal stable debt of the user + * @return scaledVariableDebt The scaled variable debt of the user + * @return stableBorrowRate The stable borrow rate of the user + * @return liquidityRate The liquidity rate of the reserve + * @return stableRateLastUpdated The timestamp of the last update of the user stable rate + * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false + * otherwise + */ + function getUserReserveData( + address asset, + address user + ) + external + view + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ); + + /** + * @notice Returns the token addresses of the reserve + * @param asset The address of the underlying asset of the reserve + * @return aTokenAddress The AToken address of the reserve + * @return stableDebtTokenAddress DEPRECATED in v3.2.0 + * @return variableDebtTokenAddress The VariableDebtToken address of the reserve + */ + function getReserveTokensAddresses( + address asset + ) + external + view + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ); + + /** + * @notice Returns the address of the Interest Rate strategy + * @param asset The address of the underlying asset of the reserve + * @return irStrategyAddress The address of the Interest Rate strategy + */ + function getInterestRateStrategyAddress( + address asset + ) external view returns (address irStrategyAddress); + + /** + * @notice Returns whether the reserve has FlashLoans enabled or disabled + * @param asset The address of the underlying asset of the reserve + * @return True if FlashLoans are enabled, false otherwise + */ + function getFlashLoanEnabled(address asset) external view returns (bool); + + /** + * @notice Returns whether virtual accounting is enabled/not for a reserve + * @param asset The address of the underlying asset of the reserve + * @return True if active, false otherwise + */ + function getIsVirtualAccActive(address asset) external view returns (bool); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint256); +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol + +interface IUiPoolDataProviderV3 { + struct AggregatedReserveData { + address underlyingAsset; + string name; + string symbol; + uint256 decimals; + uint256 baseLTVasCollateral; + uint256 reserveLiquidationThreshold; + uint256 reserveLiquidationBonus; + uint256 reserveFactor; + bool usageAsCollateralEnabled; + bool borrowingEnabled; + bool isActive; + bool isFrozen; + // base data + uint128 liquidityIndex; + uint128 variableBorrowIndex; + uint128 liquidityRate; + uint128 variableBorrowRate; + uint40 lastUpdateTimestamp; + address aTokenAddress; + address variableDebtTokenAddress; + address interestRateStrategyAddress; + // + uint256 availableLiquidity; + uint256 totalScaledVariableDebt; + uint256 priceInMarketReferenceCurrency; + address priceOracle; + uint256 variableRateSlope1; + uint256 variableRateSlope2; + uint256 baseVariableBorrowRate; + uint256 optimalUsageRatio; + // v3 only + bool isPaused; + bool isSiloedBorrowing; + uint128 accruedToTreasury; + uint128 unbacked; + uint128 isolationModeTotalDebt; + bool flashLoanEnabled; + // + uint256 debtCeiling; + uint256 debtCeilingDecimals; + uint256 borrowCap; + uint256 supplyCap; + bool borrowableInIsolation; + // v3.1 + bool virtualAccActive; + uint128 virtualUnderlyingBalance; + } + + struct UserReserveData { + address underlyingAsset; + uint256 scaledATokenBalance; + bool usageAsCollateralEnabledOnUser; + uint256 scaledVariableDebt; + } + + struct BaseCurrencyInfo { + uint256 marketReferenceCurrencyUnit; + int256 marketReferenceCurrencyPriceInUsd; + int256 networkBaseTokenPriceInUsd; + uint8 networkBaseTokenPriceDecimals; + } + + struct Emode { + uint8 id; + DataTypes.EModeCategory eMode; + } + + function getReservesList( + IPoolAddressesProvider provider + ) external view returns (address[] memory); + + function getReservesData( + IPoolAddressesProvider provider + ) external view returns (AggregatedReserveData[] memory, BaseCurrencyInfo memory); + + function getUserReservesData( + IPoolAddressesProvider provider, + address user + ) external view returns (UserReserveData[] memory, uint8); + + /** + * @dev Iterates the eModes mapping and returns all eModes found + * @notice The method assumes for id gaps <= 2 within the eMode definitions + * @return an array of eModes that were found in the eMode mapping + */ + function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory); +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol + +/** + * @title IAaveOracle + * @author Aave + * @notice Defines the basic interface for the Aave Oracle + */ +interface IAaveOracle is IPriceOracleGetter { + /** + * @dev Emitted after the base currency is set + * @param baseCurrency The base currency of used for price quotes + * @param baseCurrencyUnit The unit of the base currency + */ + event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); + + /** + * @dev Emitted after the price source of an asset is updated + * @param asset The address of the asset + * @param source The price source of the asset + */ + event AssetSourceUpdated(address indexed asset, address indexed source); + + /** + * @dev Emitted after the address of fallback oracle is updated + * @param fallbackOracle The address of the fallback oracle + */ + event FallbackOracleUpdated(address indexed fallbackOracle); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Sets or replaces price sources of assets + * @param assets The addresses of the assets + * @param sources The addresses of the price sources + */ + function setAssetSources(address[] calldata assets, address[] calldata sources) external; + + /** + * @notice Sets the fallback oracle + * @param fallbackOracle The address of the fallback oracle + */ + function setFallbackOracle(address fallbackOracle) external; + + /** + * @notice Returns a list of prices from a list of assets addresses + * @param assets The list of assets addresses + * @return The prices of the given assets + */ + function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); + + /** + * @notice Returns the address of the source for an asset address + * @param asset The address of the asset + * @return The address of the source + */ + function getSourceOfAsset(address asset) external view returns (address); + + /** + * @notice Returns the address of the fallback oracle + * @return The address of the fallback oracle + */ + function getFallbackOracle() external view returns (address); +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol + +/** + * @title IDefaultInterestRateStrategyV2 + * @author BGD Labs + * @notice Interface of the default interest rate strategy used by the Aave protocol + */ +interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { + /** + * @notice Holds the interest rate data for a given reserve + * + * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This + * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. + * + * @param optimalUsageRatio The optimal usage ratio, in bps + * @param baseVariableBorrowRate The base variable borrow rate, in bps + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps + */ + struct InterestRateData { + uint16 optimalUsageRatio; + uint32 baseVariableBorrowRate; + uint32 variableRateSlope1; + uint32 variableRateSlope2; + } + + /** + * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, + * used in in-memory calculations. + * + * @param optimalUsageRatio The optimal usage ratio + * @param baseVariableBorrowRate The base variable borrow rate + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio + */ + struct InterestRateDataRay { + uint256 optimalUsageRatio; + uint256 baseVariableBorrowRate; + uint256 variableRateSlope1; + uint256 variableRateSlope2; + } + + /** + * @notice emitted when new interest rate data is set in a reserve + * + * @param reserve address of the reserve that has new interest rate data set + * @param optimalUsageRatio The optimal usage ratio, in bps + * @param baseVariableBorrowRate The base variable borrow rate, in bps + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps + */ + event RateDataUpdate( + address indexed reserve, + uint256 optimalUsageRatio, + uint256 baseVariableBorrowRate, + uint256 variableRateSlope1, + uint256 variableRateSlope2 + ); + + /** + * @notice Returns the address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the maximum value achievable for variable borrow rate, in bps + * @return The maximum rate + */ + function MAX_BORROW_RATE() external view returns (uint256); + + /** + * @notice Returns the minimum optimal point, in bps + * @return The optimal point + */ + function MIN_OPTIMAL_POINT() external view returns (uint256); + + /** + * @notice Returns the maximum optimal point, in bps + * @return The optimal point + */ + function MAX_OPTIMAL_POINT() external view returns (uint256); + + /** + * notice Returns the full InterestRateData object for the given reserve, in ray + * + * @param reserve The reserve to get the data of + * + * @return The InterestRateDataRay object for the given reserve + */ + function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); + + /** + * notice Returns the full InterestRateDataRay object for the given reserve, in bps + * + * @param reserve The reserve to get the data of + * + * @return The InterestRateData object for the given reserve + */ + function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); + + /** + * @notice Returns the optimal usage rate for the given reserve in ray + * + * @param reserve The reserve to get the optimal usage rate of + * + * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate + */ + function getOptimalUsageRatio(address reserve) external view returns (uint256); + + /** + * @notice Returns the variable rate slope below optimal usage ratio in ray + * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO + * + * @param reserve The reserve to get the variable rate slope 1 of + * + * @return The variable rate slope + */ + function getVariableRateSlope1(address reserve) external view returns (uint256); + + /** + * @notice Returns the variable rate slope above optimal usage ratio in ray + * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO + * + * @param reserve The reserve to get the variable rate slope 2 of + * + * @return The variable rate slope + */ + function getVariableRateSlope2(address reserve) external view returns (uint256); + + /** + * @notice Returns the base variable borrow rate, in ray + * + * @param reserve The reserve to get the base variable borrow rate of + * + * @return The base variable borrow rate + */ + function getBaseVariableBorrowRate(address reserve) external view returns (uint256); + + /** + * @notice Returns the maximum variable borrow rate, in ray + * + * @param reserve The reserve to get the maximum variable borrow rate of + * + * @return The maximum variable borrow rate + */ + function getMaxVariableBorrowRate(address reserve) external view returns (uint256); + + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The reserve interest rate data to apply to the given reserve + * Being specific to this custom implementation, with custom struct type, + * overloading the function on the generic interface + */ + function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol + +/** + * @title AaveProtocolDataProvider + * @author Aave + * @notice Peripheral contract to collect and pre-process information from the Pool. + */ +contract AaveProtocolDataProvider is IPoolDataProvider { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + + address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; + address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /// @inheritdoc IPoolDataProvider + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @notice Constructor + * @param addressesProvider The address of the PoolAddressesProvider contract + */ + constructor(IPoolAddressesProvider addressesProvider) { + ADDRESSES_PROVIDER = addressesProvider; + } + + /// @inheritdoc IPoolDataProvider + function getAllReservesTokens() external view override returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory reservesTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + if (reserves[i] == MKR) { + reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); + continue; + } + if (reserves[i] == ETH) { + reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); + continue; + } + reservesTokens[i] = TokenData({ + symbol: IERC20Detailed(reserves[i]).symbol(), + tokenAddress: reserves[i] + }); + } + return reservesTokens; + } + + /// @inheritdoc IPoolDataProvider + function getAllATokens() external view override returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory aTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveDataLegacy memory reserveData = pool.getReserveData(reserves[i]); + aTokens[i] = TokenData({ + symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), + tokenAddress: reserveData.aTokenAddress + }); + } + return aTokens; + } + + /// @inheritdoc IPoolDataProvider + function getReserveConfigurationData( + address asset + ) + external + view + override + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ) + { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration + .getParams(); + + (isActive, isFrozen, borrowingEnabled, ) = configuration.getFlags(); + + // @notice all stable debt related parameters deprecated in v3.2.0 + stableBorrowRateEnabled = false; + + usageAsCollateralEnabled = liquidationThreshold != 0; + } + + /// @inheritdoc IPoolDataProvider + function getReserveCaps( + address asset + ) external view override returns (uint256 borrowCap, uint256 supplyCap) { + (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); + } + + /// @inheritdoc IPoolDataProvider + function getPaused(address asset) external view override returns (bool isPaused) { + (, , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); + } + + /// @inheritdoc IPoolDataProvider + function getSiloedBorrowing(address asset) external view override returns (bool) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); + } + + /// @inheritdoc IPoolDataProvider + function getLiquidationProtocolFee(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); + } + + /// @inheritdoc IPoolDataProvider + function getUnbackedMintCap(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); + } + + /// @inheritdoc IPoolDataProvider + function getDebtCeiling(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); + } + + /// @inheritdoc IPoolDataProvider + function getDebtCeilingDecimals() external pure override returns (uint256) { + return ReserveConfiguration.DEBT_CEILING_DECIMALS; + } + + /// @inheritdoc IPoolDataProvider + function getReserveData( + address asset + ) + external + view + override + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + // @notice all stable debt related parameters deprecated in v3.2.0 + return ( + reserve.unbacked, + reserve.accruedToTreasury, + IERC20Detailed(reserve.aTokenAddress).totalSupply(), + 0, + IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), + reserve.currentLiquidityRate, + reserve.currentVariableBorrowRate, + 0, + 0, + reserve.liquidityIndex, + reserve.variableBorrowIndex, + reserve.lastUpdateTimestamp + ); + } + + /// @inheritdoc IPoolDataProvider + function getATokenTotalSupply(address asset) external view override returns (uint256) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.aTokenAddress).totalSupply(); + } + + /// @inheritdoc IPoolDataProvider + function getTotalDebt(address asset) external view override returns (uint256) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); + } + + /// @inheritdoc IPoolDataProvider + function getUserReserveData( + address asset, + address user + ) + external + view + override + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) + .getUserConfiguration(user); + + currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); + currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); + + // @notice all stable debt related parameters deprecated in v3.2.0 + currentStableDebt = principalStableDebt = stableBorrowRate = stableRateLastUpdated = 0; + + scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); + liquidityRate = reserve.currentLiquidityRate; + usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); + } + + /// @inheritdoc IPoolDataProvider + function getReserveTokensAddresses( + address asset + ) + external + view + override + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + // @notice all stable debt related parameters deprecated in v3.2.0 + return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); + } + + /// @inheritdoc IPoolDataProvider + function getInterestRateStrategyAddress( + address asset + ) external view override returns (address irStrategyAddress) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + return (reserve.interestRateStrategyAddress); + } + + /// @inheritdoc IPoolDataProvider + function getFlashLoanEnabled(address asset) external view override returns (bool) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + return configuration.getFlashLoanEnabled(); + } + + /// @inheritdoc IPoolDataProvider + function getIsVirtualAccActive(address asset) external view override returns (bool) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + return configuration.getIsVirtualAccActive(); + } + + /// @inheritdoc IPoolDataProvider + function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); + } +} + +// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol + +contract UiPoolDataProviderV3 is IUiPoolDataProviderV3 { + using WadRayMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + IEACAggregatorProxy public immutable networkBaseTokenPriceInUsdProxyAggregator; + IEACAggregatorProxy public immutable marketReferenceCurrencyPriceInUsdProxyAggregator; + uint256 public constant ETH_CURRENCY_UNIT = 1 ether; + address public constant MKR_ADDRESS = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; + + constructor( + IEACAggregatorProxy _networkBaseTokenPriceInUsdProxyAggregator, + IEACAggregatorProxy _marketReferenceCurrencyPriceInUsdProxyAggregator + ) { + networkBaseTokenPriceInUsdProxyAggregator = _networkBaseTokenPriceInUsdProxyAggregator; + marketReferenceCurrencyPriceInUsdProxyAggregator = _marketReferenceCurrencyPriceInUsdProxyAggregator; + } + + function getReservesList( + IPoolAddressesProvider provider + ) external view override returns (address[] memory) { + IPool pool = IPool(provider.getPool()); + return pool.getReservesList(); + } + + function getReservesData( + IPoolAddressesProvider provider + ) external view override returns (AggregatedReserveData[] memory, BaseCurrencyInfo memory) { + IAaveOracle oracle = IAaveOracle(provider.getPriceOracle()); + IPool pool = IPool(provider.getPool()); + AaveProtocolDataProvider poolDataProvider = AaveProtocolDataProvider( + provider.getPoolDataProvider() + ); + + address[] memory reserves = pool.getReservesList(); + AggregatedReserveData[] memory reservesData = new AggregatedReserveData[](reserves.length); + + for (uint256 i = 0; i < reserves.length; i++) { + AggregatedReserveData memory reserveData = reservesData[i]; + reserveData.underlyingAsset = reserves[i]; + + // reserve current state + DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData( + reserveData.underlyingAsset + ); + //the liquidity index. Expressed in ray + reserveData.liquidityIndex = baseData.liquidityIndex; + //variable borrow index. Expressed in ray + reserveData.variableBorrowIndex = baseData.variableBorrowIndex; + //the current supply rate. Expressed in ray + reserveData.liquidityRate = baseData.currentLiquidityRate; + //the current variable borrow rate. Expressed in ray + reserveData.variableBorrowRate = baseData.currentVariableBorrowRate; + reserveData.lastUpdateTimestamp = baseData.lastUpdateTimestamp; + reserveData.aTokenAddress = baseData.aTokenAddress; + reserveData.variableDebtTokenAddress = baseData.variableDebtTokenAddress; + //address of the interest rate strategy + reserveData.interestRateStrategyAddress = baseData.interestRateStrategyAddress; + reserveData.priceInMarketReferenceCurrency = oracle.getAssetPrice( + reserveData.underlyingAsset + ); + reserveData.priceOracle = oracle.getSourceOfAsset(reserveData.underlyingAsset); + reserveData.availableLiquidity = IERC20Detailed(reserveData.underlyingAsset).balanceOf( + reserveData.aTokenAddress + ); + reserveData.totalScaledVariableDebt = IVariableDebtToken(reserveData.variableDebtTokenAddress) + .scaledTotalSupply(); + + // Due we take the symbol from underlying token we need a special case for $MKR as symbol() returns bytes32 + if (address(reserveData.underlyingAsset) == address(MKR_ADDRESS)) { + bytes32 symbol = IERC20DetailedBytes(reserveData.underlyingAsset).symbol(); + bytes32 name = IERC20DetailedBytes(reserveData.underlyingAsset).name(); + reserveData.symbol = bytes32ToString(symbol); + reserveData.name = bytes32ToString(name); + } else { + reserveData.symbol = IERC20Detailed(reserveData.underlyingAsset).symbol(); + reserveData.name = IERC20Detailed(reserveData.underlyingAsset).name(); + } + + //stores the reserve configuration + DataTypes.ReserveConfigurationMap memory reserveConfigurationMap = baseData.configuration; + ( + reserveData.baseLTVasCollateral, + reserveData.reserveLiquidationThreshold, + reserveData.reserveLiquidationBonus, + reserveData.decimals, + reserveData.reserveFactor + ) = reserveConfigurationMap.getParams(); + reserveData.usageAsCollateralEnabled = reserveData.baseLTVasCollateral != 0; + + ( + reserveData.isActive, + reserveData.isFrozen, + reserveData.borrowingEnabled, + reserveData.isPaused + ) = reserveConfigurationMap.getFlags(); + + // interest rates + try + IDefaultInterestRateStrategyV2(reserveData.interestRateStrategyAddress).getInterestRateData( + reserveData.underlyingAsset + ) + returns (IDefaultInterestRateStrategyV2.InterestRateDataRay memory res) { + reserveData.baseVariableBorrowRate = res.baseVariableBorrowRate; + reserveData.variableRateSlope1 = res.variableRateSlope1; + reserveData.variableRateSlope2 = res.variableRateSlope2; + reserveData.optimalUsageRatio = res.optimalUsageRatio; + } catch {} + + // v3 only + reserveData.debtCeiling = reserveConfigurationMap.getDebtCeiling(); + reserveData.debtCeilingDecimals = poolDataProvider.getDebtCeilingDecimals(); + (reserveData.borrowCap, reserveData.supplyCap) = reserveConfigurationMap.getCaps(); + + try poolDataProvider.getFlashLoanEnabled(reserveData.underlyingAsset) returns ( + bool flashLoanEnabled + ) { + reserveData.flashLoanEnabled = flashLoanEnabled; + } catch (bytes memory) { + reserveData.flashLoanEnabled = true; + } + + reserveData.isSiloedBorrowing = reserveConfigurationMap.getSiloedBorrowing(); + reserveData.unbacked = baseData.unbacked; + reserveData.isolationModeTotalDebt = baseData.isolationModeTotalDebt; + reserveData.accruedToTreasury = baseData.accruedToTreasury; + + reserveData.borrowableInIsolation = reserveConfigurationMap.getBorrowableInIsolation(); + + try poolDataProvider.getIsVirtualAccActive(reserveData.underlyingAsset) returns ( + bool virtualAccActive + ) { + reserveData.virtualAccActive = virtualAccActive; + } catch (bytes memory) { + reserveData.virtualAccActive = false; + } + + try pool.getVirtualUnderlyingBalance(reserveData.underlyingAsset) returns ( + uint128 virtualUnderlyingBalance + ) { + reserveData.virtualUnderlyingBalance = virtualUnderlyingBalance; + } catch (bytes memory) { + reserveData.virtualUnderlyingBalance = 0; + } + } + + BaseCurrencyInfo memory baseCurrencyInfo; + baseCurrencyInfo.networkBaseTokenPriceInUsd = networkBaseTokenPriceInUsdProxyAggregator + .latestAnswer(); + baseCurrencyInfo.networkBaseTokenPriceDecimals = networkBaseTokenPriceInUsdProxyAggregator + .decimals(); + + try oracle.BASE_CURRENCY_UNIT() returns (uint256 baseCurrencyUnit) { + baseCurrencyInfo.marketReferenceCurrencyUnit = baseCurrencyUnit; + baseCurrencyInfo.marketReferenceCurrencyPriceInUsd = int256(baseCurrencyUnit); + } catch (bytes memory /*lowLevelData*/) { + baseCurrencyInfo.marketReferenceCurrencyUnit = ETH_CURRENCY_UNIT; + baseCurrencyInfo + .marketReferenceCurrencyPriceInUsd = marketReferenceCurrencyPriceInUsdProxyAggregator + .latestAnswer(); + } + + return (reservesData, baseCurrencyInfo); + } + + /// @inheritdoc IUiPoolDataProviderV3 + function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory) { + IPool pool = IPool(provider.getPool()); + Emode[] memory tempCategories = new Emode[](256); + uint8 eModesFound = 0; + uint8 missCounter = 0; + for (uint8 i = 1; i < 256; i++) { + DataTypes.CollateralConfig memory cfg = pool.getEModeCategoryCollateralConfig(i); + if (cfg.liquidationThreshold != 0) { + tempCategories[eModesFound] = Emode({ + eMode: DataTypes.EModeCategory({ + ltv: cfg.ltv, + liquidationThreshold: cfg.liquidationThreshold, + liquidationBonus: cfg.liquidationBonus, + label: pool.getEModeCategoryLabel(i), + collateralBitmap: pool.getEModeCategoryCollateralBitmap(i), + borrowableBitmap: pool.getEModeCategoryBorrowableBitmap(i) + }), + id: i + }); + ++eModesFound; + missCounter = 0; + } else { + ++missCounter; + } + // assumes there will never be a gap > 2 when setting eModes + if (missCounter > 2) break; + } + Emode[] memory categories = new Emode[](eModesFound); + for (uint8 i = 0; i < eModesFound; i++) { + categories[i] = tempCategories[i]; + } + return categories; + } + + function getUserReservesData( + IPoolAddressesProvider provider, + address user + ) external view override returns (UserReserveData[] memory, uint8) { + IPool pool = IPool(provider.getPool()); + address[] memory reserves = pool.getReservesList(); + DataTypes.UserConfigurationMap memory userConfig = pool.getUserConfiguration(user); + + uint8 userEmodeCategoryId = uint8(pool.getUserEMode(user)); + + UserReserveData[] memory userReservesData = new UserReserveData[]( + user != address(0) ? reserves.length : 0 + ); + + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); + + // user reserve data + userReservesData[i].underlyingAsset = reserves[i]; + userReservesData[i].scaledATokenBalance = IAToken(baseData.aTokenAddress).scaledBalanceOf( + user + ); + userReservesData[i].usageAsCollateralEnabledOnUser = userConfig.isUsingAsCollateral(i); + + if (userConfig.isBorrowing(i)) { + userReservesData[i].scaledVariableDebt = IVariableDebtToken( + baseData.variableDebtTokenAddress + ).scaledBalanceOf(user); + } + } + + return (userReservesData, userEmodeCategoryId); + } + + function bytes32ToString(bytes32 _bytes32) public pure returns (string memory) { + uint8 i = 0; + while (i < 32 && _bytes32[i] != 0) { + i++; + } + bytes memory bytesArray = new bytes(i); + for (i = 0; i < 32 && _bytes32[i] != 0; i++) { + bytesArray[i] = _bytes32[i]; + } + return string(bytesArray); + } +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol new file mode 100644 index 00000000..a1d01d4f --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from './IERC20.sol'; + +interface IERC20Detailed is IERC20 { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol new file mode 100644 index 00000000..671b658b --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol @@ -0,0 +1,295 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; +import {WadRayMath} from '../protocol/libraries/math/WadRayMath.sol'; +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {IVariableDebtToken} from '../interfaces/IVariableDebtToken.sol'; +import {IPool} from '../interfaces/IPool.sol'; +import {IPoolDataProvider} from '../interfaces/IPoolDataProvider.sol'; + +/** + * @title AaveProtocolDataProvider + * @author Aave + * @notice Peripheral contract to collect and pre-process information from the Pool. + */ +contract AaveProtocolDataProvider is IPoolDataProvider { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using WadRayMath for uint256; + + address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; + address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /// @inheritdoc IPoolDataProvider + IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + + /** + * @notice Constructor + * @param addressesProvider The address of the PoolAddressesProvider contract + */ + constructor(IPoolAddressesProvider addressesProvider) { + ADDRESSES_PROVIDER = addressesProvider; + } + + /// @inheritdoc IPoolDataProvider + function getAllReservesTokens() external view override returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory reservesTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + if (reserves[i] == MKR) { + reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); + continue; + } + if (reserves[i] == ETH) { + reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); + continue; + } + reservesTokens[i] = TokenData({ + symbol: IERC20Detailed(reserves[i]).symbol(), + tokenAddress: reserves[i] + }); + } + return reservesTokens; + } + + /// @inheritdoc IPoolDataProvider + function getAllATokens() external view override returns (TokenData[] memory) { + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); + address[] memory reserves = pool.getReservesList(); + TokenData[] memory aTokens = new TokenData[](reserves.length); + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveDataLegacy memory reserveData = pool.getReserveData(reserves[i]); + aTokens[i] = TokenData({ + symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), + tokenAddress: reserveData.aTokenAddress + }); + } + return aTokens; + } + + /// @inheritdoc IPoolDataProvider + function getReserveConfigurationData( + address asset + ) + external + view + override + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ) + { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration + .getParams(); + + (isActive, isFrozen, borrowingEnabled, ) = configuration.getFlags(); + + // @notice all stable debt related parameters deprecated in v3.2.0 + stableBorrowRateEnabled = false; + + usageAsCollateralEnabled = liquidationThreshold != 0; + } + + /// @inheritdoc IPoolDataProvider + function getReserveCaps( + address asset + ) external view override returns (uint256 borrowCap, uint256 supplyCap) { + (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); + } + + /// @inheritdoc IPoolDataProvider + function getPaused(address asset) external view override returns (bool isPaused) { + (, , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); + } + + /// @inheritdoc IPoolDataProvider + function getSiloedBorrowing(address asset) external view override returns (bool) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); + } + + /// @inheritdoc IPoolDataProvider + function getLiquidationProtocolFee(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); + } + + /// @inheritdoc IPoolDataProvider + function getUnbackedMintCap(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); + } + + /// @inheritdoc IPoolDataProvider + function getDebtCeiling(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); + } + + /// @inheritdoc IPoolDataProvider + function getDebtCeilingDecimals() external pure override returns (uint256) { + return ReserveConfiguration.DEBT_CEILING_DECIMALS; + } + + /// @inheritdoc IPoolDataProvider + function getReserveData( + address asset + ) + external + view + override + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + // @notice all stable debt related parameters deprecated in v3.2.0 + return ( + reserve.unbacked, + reserve.accruedToTreasury, + IERC20Detailed(reserve.aTokenAddress).totalSupply(), + 0, + IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), + reserve.currentLiquidityRate, + reserve.currentVariableBorrowRate, + 0, + 0, + reserve.liquidityIndex, + reserve.variableBorrowIndex, + reserve.lastUpdateTimestamp + ); + } + + /// @inheritdoc IPoolDataProvider + function getATokenTotalSupply(address asset) external view override returns (uint256) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.aTokenAddress).totalSupply(); + } + + /// @inheritdoc IPoolDataProvider + function getTotalDebt(address asset) external view override returns (uint256) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + return IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); + } + + /// @inheritdoc IPoolDataProvider + function getUserReserveData( + address asset, + address user + ) + external + view + override + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) + .getUserConfiguration(user); + + currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); + currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); + + // @notice all stable debt related parameters deprecated in v3.2.0 + currentStableDebt = principalStableDebt = stableBorrowRate = stableRateLastUpdated = 0; + + scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); + liquidityRate = reserve.currentLiquidityRate; + usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); + } + + /// @inheritdoc IPoolDataProvider + function getReserveTokensAddresses( + address asset + ) + external + view + override + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ) + { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + // @notice all stable debt related parameters deprecated in v3.2.0 + return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); + } + + /// @inheritdoc IPoolDataProvider + function getInterestRateStrategyAddress( + address asset + ) external view override returns (address irStrategyAddress) { + DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( + asset + ); + + return (reserve.interestRateStrategyAddress); + } + + /// @inheritdoc IPoolDataProvider + function getFlashLoanEnabled(address asset) external view override returns (bool) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + return configuration.getFlashLoanEnabled(); + } + + /// @inheritdoc IPoolDataProvider + function getIsVirtualAccActive(address asset) external view override returns (bool) { + DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) + .getConfiguration(asset); + + return configuration.getIsVirtualAccActive(); + } + + /// @inheritdoc IPoolDataProvider + function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); + } +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol new file mode 100644 index 00000000..b079d2dd --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol @@ -0,0 +1,265 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../interfaces/IPool.sol'; +import {IAaveOracle} from '../interfaces/IAaveOracle.sol'; +import {IAToken} from '../interfaces/IAToken.sol'; +import {IVariableDebtToken} from '../interfaces/IVariableDebtToken.sol'; +import {IDefaultInterestRateStrategyV2} from '../interfaces/IDefaultInterestRateStrategyV2.sol'; +import {AaveProtocolDataProvider} from './AaveProtocolDataProvider.sol'; +import {WadRayMath} from '../protocol/libraries/math/WadRayMath.sol'; +import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; +import {IEACAggregatorProxy} from './interfaces/IEACAggregatorProxy.sol'; +import {IERC20DetailedBytes} from './interfaces/IERC20DetailedBytes.sol'; +import {IUiPoolDataProviderV3} from './interfaces/IUiPoolDataProviderV3.sol'; + +contract UiPoolDataProviderV3 is IUiPoolDataProviderV3 { + using WadRayMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + + IEACAggregatorProxy public immutable networkBaseTokenPriceInUsdProxyAggregator; + IEACAggregatorProxy public immutable marketReferenceCurrencyPriceInUsdProxyAggregator; + uint256 public constant ETH_CURRENCY_UNIT = 1 ether; + address public constant MKR_ADDRESS = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; + + constructor( + IEACAggregatorProxy _networkBaseTokenPriceInUsdProxyAggregator, + IEACAggregatorProxy _marketReferenceCurrencyPriceInUsdProxyAggregator + ) { + networkBaseTokenPriceInUsdProxyAggregator = _networkBaseTokenPriceInUsdProxyAggregator; + marketReferenceCurrencyPriceInUsdProxyAggregator = _marketReferenceCurrencyPriceInUsdProxyAggregator; + } + + function getReservesList( + IPoolAddressesProvider provider + ) external view override returns (address[] memory) { + IPool pool = IPool(provider.getPool()); + return pool.getReservesList(); + } + + function getReservesData( + IPoolAddressesProvider provider + ) external view override returns (AggregatedReserveData[] memory, BaseCurrencyInfo memory) { + IAaveOracle oracle = IAaveOracle(provider.getPriceOracle()); + IPool pool = IPool(provider.getPool()); + AaveProtocolDataProvider poolDataProvider = AaveProtocolDataProvider( + provider.getPoolDataProvider() + ); + + address[] memory reserves = pool.getReservesList(); + AggregatedReserveData[] memory reservesData = new AggregatedReserveData[](reserves.length); + + for (uint256 i = 0; i < reserves.length; i++) { + AggregatedReserveData memory reserveData = reservesData[i]; + reserveData.underlyingAsset = reserves[i]; + + // reserve current state + DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData( + reserveData.underlyingAsset + ); + //the liquidity index. Expressed in ray + reserveData.liquidityIndex = baseData.liquidityIndex; + //variable borrow index. Expressed in ray + reserveData.variableBorrowIndex = baseData.variableBorrowIndex; + //the current supply rate. Expressed in ray + reserveData.liquidityRate = baseData.currentLiquidityRate; + //the current variable borrow rate. Expressed in ray + reserveData.variableBorrowRate = baseData.currentVariableBorrowRate; + reserveData.lastUpdateTimestamp = baseData.lastUpdateTimestamp; + reserveData.aTokenAddress = baseData.aTokenAddress; + reserveData.variableDebtTokenAddress = baseData.variableDebtTokenAddress; + //address of the interest rate strategy + reserveData.interestRateStrategyAddress = baseData.interestRateStrategyAddress; + reserveData.priceInMarketReferenceCurrency = oracle.getAssetPrice( + reserveData.underlyingAsset + ); + reserveData.priceOracle = oracle.getSourceOfAsset(reserveData.underlyingAsset); + reserveData.availableLiquidity = IERC20Detailed(reserveData.underlyingAsset).balanceOf( + reserveData.aTokenAddress + ); + reserveData.totalScaledVariableDebt = IVariableDebtToken(reserveData.variableDebtTokenAddress) + .scaledTotalSupply(); + + // Due we take the symbol from underlying token we need a special case for $MKR as symbol() returns bytes32 + if (address(reserveData.underlyingAsset) == address(MKR_ADDRESS)) { + bytes32 symbol = IERC20DetailedBytes(reserveData.underlyingAsset).symbol(); + bytes32 name = IERC20DetailedBytes(reserveData.underlyingAsset).name(); + reserveData.symbol = bytes32ToString(symbol); + reserveData.name = bytes32ToString(name); + } else { + reserveData.symbol = IERC20Detailed(reserveData.underlyingAsset).symbol(); + reserveData.name = IERC20Detailed(reserveData.underlyingAsset).name(); + } + + //stores the reserve configuration + DataTypes.ReserveConfigurationMap memory reserveConfigurationMap = baseData.configuration; + ( + reserveData.baseLTVasCollateral, + reserveData.reserveLiquidationThreshold, + reserveData.reserveLiquidationBonus, + reserveData.decimals, + reserveData.reserveFactor + ) = reserveConfigurationMap.getParams(); + reserveData.usageAsCollateralEnabled = reserveData.baseLTVasCollateral != 0; + + ( + reserveData.isActive, + reserveData.isFrozen, + reserveData.borrowingEnabled, + reserveData.isPaused + ) = reserveConfigurationMap.getFlags(); + + // interest rates + try + IDefaultInterestRateStrategyV2(reserveData.interestRateStrategyAddress).getInterestRateData( + reserveData.underlyingAsset + ) + returns (IDefaultInterestRateStrategyV2.InterestRateDataRay memory res) { + reserveData.baseVariableBorrowRate = res.baseVariableBorrowRate; + reserveData.variableRateSlope1 = res.variableRateSlope1; + reserveData.variableRateSlope2 = res.variableRateSlope2; + reserveData.optimalUsageRatio = res.optimalUsageRatio; + } catch {} + + // v3 only + reserveData.debtCeiling = reserveConfigurationMap.getDebtCeiling(); + reserveData.debtCeilingDecimals = poolDataProvider.getDebtCeilingDecimals(); + (reserveData.borrowCap, reserveData.supplyCap) = reserveConfigurationMap.getCaps(); + + try poolDataProvider.getFlashLoanEnabled(reserveData.underlyingAsset) returns ( + bool flashLoanEnabled + ) { + reserveData.flashLoanEnabled = flashLoanEnabled; + } catch (bytes memory) { + reserveData.flashLoanEnabled = true; + } + + reserveData.isSiloedBorrowing = reserveConfigurationMap.getSiloedBorrowing(); + reserveData.unbacked = baseData.unbacked; + reserveData.isolationModeTotalDebt = baseData.isolationModeTotalDebt; + reserveData.accruedToTreasury = baseData.accruedToTreasury; + + reserveData.borrowableInIsolation = reserveConfigurationMap.getBorrowableInIsolation(); + + try poolDataProvider.getIsVirtualAccActive(reserveData.underlyingAsset) returns ( + bool virtualAccActive + ) { + reserveData.virtualAccActive = virtualAccActive; + } catch (bytes memory) { + reserveData.virtualAccActive = false; + } + + try pool.getVirtualUnderlyingBalance(reserveData.underlyingAsset) returns ( + uint128 virtualUnderlyingBalance + ) { + reserveData.virtualUnderlyingBalance = virtualUnderlyingBalance; + } catch (bytes memory) { + reserveData.virtualUnderlyingBalance = 0; + } + } + + BaseCurrencyInfo memory baseCurrencyInfo; + baseCurrencyInfo.networkBaseTokenPriceInUsd = networkBaseTokenPriceInUsdProxyAggregator + .latestAnswer(); + baseCurrencyInfo.networkBaseTokenPriceDecimals = networkBaseTokenPriceInUsdProxyAggregator + .decimals(); + + try oracle.BASE_CURRENCY_UNIT() returns (uint256 baseCurrencyUnit) { + baseCurrencyInfo.marketReferenceCurrencyUnit = baseCurrencyUnit; + baseCurrencyInfo.marketReferenceCurrencyPriceInUsd = int256(baseCurrencyUnit); + } catch (bytes memory /*lowLevelData*/) { + baseCurrencyInfo.marketReferenceCurrencyUnit = ETH_CURRENCY_UNIT; + baseCurrencyInfo + .marketReferenceCurrencyPriceInUsd = marketReferenceCurrencyPriceInUsdProxyAggregator + .latestAnswer(); + } + + return (reservesData, baseCurrencyInfo); + } + + /// @inheritdoc IUiPoolDataProviderV3 + function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory) { + IPool pool = IPool(provider.getPool()); + Emode[] memory tempCategories = new Emode[](256); + uint8 eModesFound = 0; + uint8 missCounter = 0; + for (uint8 i = 1; i < 256; i++) { + DataTypes.CollateralConfig memory cfg = pool.getEModeCategoryCollateralConfig(i); + if (cfg.liquidationThreshold != 0) { + tempCategories[eModesFound] = Emode({ + eMode: DataTypes.EModeCategory({ + ltv: cfg.ltv, + liquidationThreshold: cfg.liquidationThreshold, + liquidationBonus: cfg.liquidationBonus, + label: pool.getEModeCategoryLabel(i), + collateralBitmap: pool.getEModeCategoryCollateralBitmap(i), + borrowableBitmap: pool.getEModeCategoryBorrowableBitmap(i) + }), + id: i + }); + ++eModesFound; + missCounter = 0; + } else { + ++missCounter; + } + // assumes there will never be a gap > 2 when setting eModes + if (missCounter > 2) break; + } + Emode[] memory categories = new Emode[](eModesFound); + for (uint8 i = 0; i < eModesFound; i++) { + categories[i] = tempCategories[i]; + } + return categories; + } + + function getUserReservesData( + IPoolAddressesProvider provider, + address user + ) external view override returns (UserReserveData[] memory, uint8) { + IPool pool = IPool(provider.getPool()); + address[] memory reserves = pool.getReservesList(); + DataTypes.UserConfigurationMap memory userConfig = pool.getUserConfiguration(user); + + uint8 userEmodeCategoryId = uint8(pool.getUserEMode(user)); + + UserReserveData[] memory userReservesData = new UserReserveData[]( + user != address(0) ? reserves.length : 0 + ); + + for (uint256 i = 0; i < reserves.length; i++) { + DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); + + // user reserve data + userReservesData[i].underlyingAsset = reserves[i]; + userReservesData[i].scaledATokenBalance = IAToken(baseData.aTokenAddress).scaledBalanceOf( + user + ); + userReservesData[i].usageAsCollateralEnabledOnUser = userConfig.isUsingAsCollateral(i); + + if (userConfig.isBorrowing(i)) { + userReservesData[i].scaledVariableDebt = IVariableDebtToken( + baseData.variableDebtTokenAddress + ).scaledBalanceOf(user); + } + } + + return (userReservesData, userEmodeCategoryId); + } + + function bytes32ToString(bytes32 _bytes32) public pure returns (string memory) { + uint8 i = 0; + while (i < 32 && _bytes32[i] != 0) { + i++; + } + bytes memory bytesArray = new bytes(i); + for (i = 0; i < 32 && _bytes32[i] != 0; i++) { + bytesArray[i] = _bytes32[i]; + } + return string(bytesArray); + } +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol new file mode 100644 index 00000000..c89baee6 --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +interface IEACAggregatorProxy { + function decimals() external view returns (uint8); + + function latestAnswer() external view returns (int256); + + function latestTimestamp() external view returns (uint256); + + function latestRound() external view returns (uint256); + + function getAnswer(uint256 roundId) external view returns (int256); + + function getTimestamp(uint256 roundId) external view returns (uint256); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); + event NewRound(uint256 indexed roundId, address indexed startedBy); +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol new file mode 100644 index 00000000..0541f0da --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; + +interface IERC20DetailedBytes is IERC20 { + function name() external view returns (bytes32); + + function symbol() external view returns (bytes32); + + function decimals() external view returns (uint8); +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol new file mode 100644 index 00000000..3280d75b --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; +import {DataTypes} from '../../protocol/libraries/types/DataTypes.sol'; + +interface IUiPoolDataProviderV3 { + struct AggregatedReserveData { + address underlyingAsset; + string name; + string symbol; + uint256 decimals; + uint256 baseLTVasCollateral; + uint256 reserveLiquidationThreshold; + uint256 reserveLiquidationBonus; + uint256 reserveFactor; + bool usageAsCollateralEnabled; + bool borrowingEnabled; + bool isActive; + bool isFrozen; + // base data + uint128 liquidityIndex; + uint128 variableBorrowIndex; + uint128 liquidityRate; + uint128 variableBorrowRate; + uint40 lastUpdateTimestamp; + address aTokenAddress; + address variableDebtTokenAddress; + address interestRateStrategyAddress; + // + uint256 availableLiquidity; + uint256 totalScaledVariableDebt; + uint256 priceInMarketReferenceCurrency; + address priceOracle; + uint256 variableRateSlope1; + uint256 variableRateSlope2; + uint256 baseVariableBorrowRate; + uint256 optimalUsageRatio; + // v3 only + bool isPaused; + bool isSiloedBorrowing; + uint128 accruedToTreasury; + uint128 unbacked; + uint128 isolationModeTotalDebt; + bool flashLoanEnabled; + // + uint256 debtCeiling; + uint256 debtCeilingDecimals; + uint256 borrowCap; + uint256 supplyCap; + bool borrowableInIsolation; + // v3.1 + bool virtualAccActive; + uint128 virtualUnderlyingBalance; + } + + struct UserReserveData { + address underlyingAsset; + uint256 scaledATokenBalance; + bool usageAsCollateralEnabledOnUser; + uint256 scaledVariableDebt; + } + + struct BaseCurrencyInfo { + uint256 marketReferenceCurrencyUnit; + int256 marketReferenceCurrencyPriceInUsd; + int256 networkBaseTokenPriceInUsd; + uint8 networkBaseTokenPriceDecimals; + } + + struct Emode { + uint8 id; + DataTypes.EModeCategory eMode; + } + + function getReservesList( + IPoolAddressesProvider provider + ) external view returns (address[] memory); + + function getReservesData( + IPoolAddressesProvider provider + ) external view returns (AggregatedReserveData[] memory, BaseCurrencyInfo memory); + + function getUserReservesData( + IPoolAddressesProvider provider, + address user + ) external view returns (UserReserveData[] memory, uint8); + + /** + * @dev Iterates the eModes mapping and returns all eModes found + * @notice The method assumes for id gaps <= 2 within the eMode definitions + * @return an array of eModes that were found in the eMode mapping + */ + function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory); +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol new file mode 100644 index 00000000..265d2560 --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPriceOracleGetter} from './IPriceOracleGetter.sol'; +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IAaveOracle + * @author Aave + * @notice Defines the basic interface for the Aave Oracle + */ +interface IAaveOracle is IPriceOracleGetter { + /** + * @dev Emitted after the base currency is set + * @param baseCurrency The base currency of used for price quotes + * @param baseCurrencyUnit The unit of the base currency + */ + event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); + + /** + * @dev Emitted after the price source of an asset is updated + * @param asset The address of the asset + * @param source The price source of the asset + */ + event AssetSourceUpdated(address indexed asset, address indexed source); + + /** + * @dev Emitted after the address of fallback oracle is updated + * @param fallbackOracle The address of the fallback oracle + */ + event FallbackOracleUpdated(address indexed fallbackOracle); + + /** + * @notice Returns the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Sets or replaces price sources of assets + * @param assets The addresses of the assets + * @param sources The addresses of the price sources + */ + function setAssetSources(address[] calldata assets, address[] calldata sources) external; + + /** + * @notice Sets the fallback oracle + * @param fallbackOracle The address of the fallback oracle + */ + function setFallbackOracle(address fallbackOracle) external; + + /** + * @notice Returns a list of prices from a list of assets addresses + * @param assets The list of assets addresses + * @return The prices of the given assets + */ + function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); + + /** + * @notice Returns the address of the source for an asset address + * @param asset The address of the asset + * @return The address of the source + */ + function getSourceOfAsset(address asset) external view returns (address); + + /** + * @notice Returns the address of the fallback oracle + * @return The address of the fallback oracle + */ + function getFallbackOracle() external view returns (address); +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol new file mode 100644 index 00000000..938e2d8f --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IReserveInterestRateStrategy} from './IReserveInterestRateStrategy.sol'; +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IDefaultInterestRateStrategyV2 + * @author BGD Labs + * @notice Interface of the default interest rate strategy used by the Aave protocol + */ +interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { + /** + * @notice Holds the interest rate data for a given reserve + * + * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This + * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. + * + * @param optimalUsageRatio The optimal usage ratio, in bps + * @param baseVariableBorrowRate The base variable borrow rate, in bps + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps + */ + struct InterestRateData { + uint16 optimalUsageRatio; + uint32 baseVariableBorrowRate; + uint32 variableRateSlope1; + uint32 variableRateSlope2; + } + + /** + * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, + * used in in-memory calculations. + * + * @param optimalUsageRatio The optimal usage ratio + * @param baseVariableBorrowRate The base variable borrow rate + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio + */ + struct InterestRateDataRay { + uint256 optimalUsageRatio; + uint256 baseVariableBorrowRate; + uint256 variableRateSlope1; + uint256 variableRateSlope2; + } + + /** + * @notice emitted when new interest rate data is set in a reserve + * + * @param reserve address of the reserve that has new interest rate data set + * @param optimalUsageRatio The optimal usage ratio, in bps + * @param baseVariableBorrowRate The base variable borrow rate, in bps + * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps + * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps + */ + event RateDataUpdate( + address indexed reserve, + uint256 optimalUsageRatio, + uint256 baseVariableBorrowRate, + uint256 variableRateSlope1, + uint256 variableRateSlope2 + ); + + /** + * @notice Returns the address of the PoolAddressesProvider + * @return The address of the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the maximum value achievable for variable borrow rate, in bps + * @return The maximum rate + */ + function MAX_BORROW_RATE() external view returns (uint256); + + /** + * @notice Returns the minimum optimal point, in bps + * @return The optimal point + */ + function MIN_OPTIMAL_POINT() external view returns (uint256); + + /** + * @notice Returns the maximum optimal point, in bps + * @return The optimal point + */ + function MAX_OPTIMAL_POINT() external view returns (uint256); + + /** + * notice Returns the full InterestRateData object for the given reserve, in ray + * + * @param reserve The reserve to get the data of + * + * @return The InterestRateDataRay object for the given reserve + */ + function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); + + /** + * notice Returns the full InterestRateDataRay object for the given reserve, in bps + * + * @param reserve The reserve to get the data of + * + * @return The InterestRateData object for the given reserve + */ + function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); + + /** + * @notice Returns the optimal usage rate for the given reserve in ray + * + * @param reserve The reserve to get the optimal usage rate of + * + * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate + */ + function getOptimalUsageRatio(address reserve) external view returns (uint256); + + /** + * @notice Returns the variable rate slope below optimal usage ratio in ray + * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO + * + * @param reserve The reserve to get the variable rate slope 1 of + * + * @return The variable rate slope + */ + function getVariableRateSlope1(address reserve) external view returns (uint256); + + /** + * @notice Returns the variable rate slope above optimal usage ratio in ray + * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO + * + * @param reserve The reserve to get the variable rate slope 2 of + * + * @return The variable rate slope + */ + function getVariableRateSlope2(address reserve) external view returns (uint256); + + /** + * @notice Returns the base variable borrow rate, in ray + * + * @param reserve The reserve to get the base variable borrow rate of + * + * @return The base variable borrow rate + */ + function getBaseVariableBorrowRate(address reserve) external view returns (uint256); + + /** + * @notice Returns the maximum variable borrow rate, in ray + * + * @param reserve The reserve to get the maximum variable borrow rate of + * + * @return The maximum variable borrow rate + */ + function getMaxVariableBorrowRate(address reserve) external view returns (uint256); + + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The reserve interest rate data to apply to the given reserve + * Being specific to this custom implementation, with custom struct type, + * overloading the function on the generic interface + */ + function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol new file mode 100644 index 00000000..4729d25c --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableDebtToken + * @author Aave + * @notice Interface for the initialize function common between debt tokens + */ +interface IInitializableDebtToken { + /** + * @dev Emitted when a debt token is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param incentivesController The address of the incentives controller for this aToken + * @param debtTokenDecimals The decimals of the debt token + * @param debtTokenName The name of the debt token + * @param debtTokenSymbol The symbol of the debt token + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address incentivesController, + uint8 debtTokenDecimals, + string debtTokenName, + string debtTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the debt token. + * @param pool The pool contract that is initializing this contract + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's + * @param debtTokenName The name of the token + * @param debtTokenSymbol The symbol of the token + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 debtTokenDecimals, + string memory debtTokenName, + string memory debtTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol new file mode 100644 index 00000000..a9df8903 --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol @@ -0,0 +1,250 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; + +/** + * @title IPoolDataProvider + * @author Aave + * @notice Defines the basic interface of a PoolDataProvider + */ +interface IPoolDataProvider { + struct TokenData { + string symbol; + address tokenAddress; + } + + /** + * @notice Returns the address for the PoolAddressesProvider contract. + * @return The address for the PoolAddressesProvider contract + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Returns the list of the existing reserves in the pool. + * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. + * @return The list of reserves, pairs of symbols and addresses + */ + function getAllReservesTokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the list of the existing ATokens in the pool. + * @return The list of ATokens, pairs of symbols and addresses + */ + function getAllATokens() external view returns (TokenData[] memory); + + /** + * @notice Returns the configuration data of the reserve + * @dev Not returning borrow and supply caps for compatibility, nor pause flag + * @param asset The address of the underlying asset of the reserve + * @return decimals The number of decimals of the reserve + * @return ltv The ltv of the reserve + * @return liquidationThreshold The liquidationThreshold of the reserve + * @return liquidationBonus The liquidationBonus of the reserve + * @return reserveFactor The reserveFactor of the reserve + * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise + * @return borrowingEnabled True if borrowing is enabled, false otherwise + * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise + * @return isActive True if it is active, false otherwise + * @return isFrozen True if it is frozen, false otherwise + */ + function getReserveConfigurationData( + address asset + ) + external + view + returns ( + uint256 decimals, + uint256 ltv, + uint256 liquidationThreshold, + uint256 liquidationBonus, + uint256 reserveFactor, + bool usageAsCollateralEnabled, + bool borrowingEnabled, + bool stableBorrowRateEnabled, + bool isActive, + bool isFrozen + ); + + /** + * @notice Returns the caps parameters of the reserve + * @param asset The address of the underlying asset of the reserve + * @return borrowCap The borrow cap of the reserve + * @return supplyCap The supply cap of the reserve + */ + function getReserveCaps( + address asset + ) external view returns (uint256 borrowCap, uint256 supplyCap); + + /** + * @notice Returns if the pool is paused + * @param asset The address of the underlying asset of the reserve + * @return isPaused True if the pool is paused, false otherwise + */ + function getPaused(address asset) external view returns (bool isPaused); + + /** + * @notice Returns the siloed borrowing flag + * @param asset The address of the underlying asset of the reserve + * @return True if the asset is siloed for borrowing + */ + function getSiloedBorrowing(address asset) external view returns (bool); + + /** + * @notice Returns the protocol fee on the liquidation bonus + * @param asset The address of the underlying asset of the reserve + * @return The protocol fee on liquidation + */ + function getLiquidationProtocolFee(address asset) external view returns (uint256); + + /** + * @notice Returns the unbacked mint cap of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The unbacked mint cap of the reserve + */ + function getUnbackedMintCap(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The debt ceiling of the reserve + */ + function getDebtCeiling(address asset) external view returns (uint256); + + /** + * @notice Returns the debt ceiling decimals + * @return The debt ceiling decimals + */ + function getDebtCeilingDecimals() external pure returns (uint256); + + /** + * @notice Returns the reserve data + * @param asset The address of the underlying asset of the reserve + * @return unbacked The amount of unbacked tokens + * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted + * @return totalAToken The total supply of the aToken + * @return totalStableDebt The total stable debt of the reserve + * @return totalVariableDebt The total variable debt of the reserve + * @return liquidityRate The liquidity rate of the reserve + * @return variableBorrowRate The variable borrow rate of the reserve + * @return stableBorrowRate The stable borrow rate of the reserve + * @return averageStableBorrowRate The average stable borrow rate of the reserve + * @return liquidityIndex The liquidity index of the reserve + * @return variableBorrowIndex The variable borrow index of the reserve + * @return lastUpdateTimestamp The timestamp of the last update of the reserve + */ + function getReserveData( + address asset + ) + external + view + returns ( + uint256 unbacked, + uint256 accruedToTreasuryScaled, + uint256 totalAToken, + uint256 totalStableDebt, + uint256 totalVariableDebt, + uint256 liquidityRate, + uint256 variableBorrowRate, + uint256 stableBorrowRate, + uint256 averageStableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex, + uint40 lastUpdateTimestamp + ); + + /** + * @notice Returns the total supply of aTokens for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total supply of the aToken + */ + function getATokenTotalSupply(address asset) external view returns (uint256); + + /** + * @notice Returns the total debt for a given asset + * @param asset The address of the underlying asset of the reserve + * @return The total debt for asset + */ + function getTotalDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the user data in a reserve + * @param asset The address of the underlying asset of the reserve + * @param user The address of the user + * @return currentATokenBalance The current AToken balance of the user + * @return currentStableDebt The current stable debt of the user + * @return currentVariableDebt The current variable debt of the user + * @return principalStableDebt The principal stable debt of the user + * @return scaledVariableDebt The scaled variable debt of the user + * @return stableBorrowRate The stable borrow rate of the user + * @return liquidityRate The liquidity rate of the reserve + * @return stableRateLastUpdated The timestamp of the last update of the user stable rate + * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false + * otherwise + */ + function getUserReserveData( + address asset, + address user + ) + external + view + returns ( + uint256 currentATokenBalance, + uint256 currentStableDebt, + uint256 currentVariableDebt, + uint256 principalStableDebt, + uint256 scaledVariableDebt, + uint256 stableBorrowRate, + uint256 liquidityRate, + uint40 stableRateLastUpdated, + bool usageAsCollateralEnabled + ); + + /** + * @notice Returns the token addresses of the reserve + * @param asset The address of the underlying asset of the reserve + * @return aTokenAddress The AToken address of the reserve + * @return stableDebtTokenAddress DEPRECATED in v3.2.0 + * @return variableDebtTokenAddress The VariableDebtToken address of the reserve + */ + function getReserveTokensAddresses( + address asset + ) + external + view + returns ( + address aTokenAddress, + address stableDebtTokenAddress, + address variableDebtTokenAddress + ); + + /** + * @notice Returns the address of the Interest Rate strategy + * @param asset The address of the underlying asset of the reserve + * @return irStrategyAddress The address of the Interest Rate strategy + */ + function getInterestRateStrategyAddress( + address asset + ) external view returns (address irStrategyAddress); + + /** + * @notice Returns whether the reserve has FlashLoans enabled or disabled + * @param asset The address of the underlying asset of the reserve + * @return True if FlashLoans are enabled, false otherwise + */ + function getFlashLoanEnabled(address asset) external view returns (bool); + + /** + * @notice Returns whether virtual accounting is enabled/not for a reserve + * @param asset The address of the underlying asset of the reserve + * @return True if active, false otherwise + */ + function getIsVirtualAccActive(address asset) external view returns (bool); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint256); +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol new file mode 100644 index 00000000..869851a1 --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPriceOracleGetter + * @author Aave + * @notice Interface for the Aave price oracle. + */ +interface IPriceOracleGetter { + /** + * @notice Returns the base currency address + * @dev Address 0x0 is reserved for USD as base currency. + * @return Returns the base currency address. + */ + function BASE_CURRENCY() external view returns (address); + + /** + * @notice Returns the base currency unit + * @dev 1 ether for ETH, 1e8 for USD. + * @return Returns the base currency unit. + */ + function BASE_CURRENCY_UNIT() external view returns (uint256); + + /** + * @notice Returns the asset price in the base currency + * @param asset The address of the asset + * @return The price of the asset + */ + function getAssetPrice(address asset) external view returns (uint256); +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol new file mode 100644 index 00000000..e953cce5 --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IReserveInterestRateStrategy + * @author BGD Labs + * @notice Basic interface for any rate strategy used by the Aave protocol + */ +interface IReserveInterestRateStrategy { + /** + * @notice Sets interest rate data for an Aave rate strategy + * @param reserve The reserve to update + * @param rateData The abi encoded reserve interest rate data to apply to the given reserve + * Abstracted this way as rate strategies can be custom + */ + function setInterestRateParams(address reserve, bytes calldata rateData) external; + + /** + * @notice Calculates the interest rates depending on the reserve's state and configurations + * @param params The parameters needed to calculate interest rates + * @return liquidityRate The liquidity rate expressed in ray + * @return variableBorrowRate The variable borrow rate expressed in ray + */ + function calculateInterestRates( + DataTypes.CalculateInterestRatesParams memory params + ) external view returns (uint256, uint256); +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol new file mode 100644 index 00000000..625d1cb8 --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; + +/** + * @title IVariableDebtToken + * @author Aave + * @notice Defines the basic interface for a variable debt token. + */ +interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { + /** + * @notice Mints debt token to the `onBehalfOf` address + * @param user The address receiving the borrowed underlying, being the delegatee in case + * of credit delegate, or same as `onBehalfOf` otherwise + * @param onBehalfOf The address receiving the debt tokens + * @param amount The amount of debt being minted + * @param index The variable debt index of the reserve + * @return True if the previous balance of the user is 0, false otherwise + * @return The scaled total debt of the reserve + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool, uint256); + + /** + * @notice Burns user variable debt + * @dev In some instances, a burn transaction will emit a mint event + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the debt will be burned + * @param amount The amount getting burned + * @param index The variable debt index of the reserve + * @return The scaled total debt of the reserve + */ + function burn(address from, uint256 amount, uint256 index) external returns (uint256); + + /** + * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol new file mode 100644 index 00000000..f61fe87f --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +/** + * @title WadRayMath library + * @author Aave + * @notice Provides functions to perform calculations with Wad and Ray units + * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers + * with 27 digits of precision) + * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. + */ +library WadRayMath { + // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly + uint256 internal constant WAD = 1e18; + uint256 internal constant HALF_WAD = 0.5e18; + + uint256 internal constant RAY = 1e27; + uint256 internal constant HALF_RAY = 0.5e27; + + uint256 internal constant WAD_RAY_RATIO = 1e9; + + /** + * @dev Multiplies two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a*b, in wad + */ + function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_WAD), WAD) + } + } + + /** + * @dev Divides two wad, rounding half up to the nearest wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @param b Wad + * @return c = a/b, in wad + */ + function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / WAD + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { + revert(0, 0) + } + + c := div(add(mul(a, WAD), div(b, 2)), b) + } + } + + /** + * @notice Multiplies two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raymul b + */ + function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b + assembly { + if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { + revert(0, 0) + } + + c := div(add(mul(a, b), HALF_RAY), RAY) + } + } + + /** + * @notice Divides two ray, rounding half up to the nearest ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @param b Ray + * @return c = a raydiv b + */ + function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { + // to avoid overflow, a <= (type(uint256).max - halfB) / RAY + assembly { + if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { + revert(0, 0) + } + + c := div(add(mul(a, RAY), div(b, 2)), b) + } + } + + /** + * @dev Casts ray down to wad + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Ray + * @return b = a converted to wad, rounded half up to the nearest wad + */ + function rayToWad(uint256 a) internal pure returns (uint256 b) { + assembly { + b := div(a, WAD_RAY_RATIO) + let remainder := mod(a, WAD_RAY_RATIO) + if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { + b := add(b, 1) + } + } + } + + /** + * @dev Converts wad up to ray + * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 + * @param a Wad + * @return b = a converted in ray + */ + function wadToRay(uint256 a) internal pure returns (uint256 b) { + // to avoid overflow, b/WAD_RAY_RATIO == a + assembly { + b := mul(a, WAD_RAY_RATIO) + + if iszero(eq(div(b, WAD_RAY_RATIO), a)) { + revert(0, 0) + } + } + } +} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER.sol new file mode 100644 index 00000000..a31677f5 --- /dev/null +++ b/downloads/LINEA/WALLET_BALANCE_PROVIDER.sol @@ -0,0 +1,2576 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol + +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/helpers/WalletBalanceProvider.sol + +/** + * @title WalletBalanceProvider contract + * @author Aave, influenced by https://github.com/wbobeirne/eth-balance-checker/blob/master/contracts/BalanceChecker.sol + * @notice Implements a logic of getting multiple tokens balance for one user address + * @dev NOTE: THIS CONTRACT IS NOT USED WITHIN THE AAVE PROTOCOL. It's an accessory contract used to reduce the number of calls + * towards the blockchain from the Aave backend. + **/ +contract WalletBalanceProvider { + using Address for address payable; + using Address for address; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + address constant MOCK_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /** + @dev Fallback function, don't accept any ETH + **/ + receive() external payable { + //only contracts can send ETH to the core + require(msg.sender.isContract(), '22'); + } + + /** + @dev Check the token balance of a wallet in a token contract + + Returns the balance of the token for user. Avoids possible errors: + - return 0 on non-contract address + **/ + function balanceOf(address user, address token) public view returns (uint256) { + if (token == MOCK_ETH_ADDRESS) { + return user.balance; // ETH balance + // check if token is actually a contract + } else if (token.isContract()) { + return IERC20(token).balanceOf(user); + } + revert('INVALID_TOKEN'); + } + + /** + * @notice Fetches, for a list of _users and _tokens (ETH included with mock address), the balances + * @param users The list of users + * @param tokens The list of tokens + * @return And array with the concatenation of, for each user, his/her balances + **/ + function batchBalanceOf( + address[] calldata users, + address[] calldata tokens + ) external view returns (uint256[] memory) { + uint256[] memory balances = new uint256[](users.length * tokens.length); + + for (uint256 i = 0; i < users.length; i++) { + for (uint256 j = 0; j < tokens.length; j++) { + balances[i * tokens.length + j] = balanceOf(users[i], tokens[j]); + } + } + + return balances; + } + + /** + @dev provides balances of user wallet for all reserves available on the pool + */ + function getUserWalletBalances( + address provider, + address user + ) external view returns (address[] memory, uint256[] memory) { + IPool pool = IPool(IPoolAddressesProvider(provider).getPool()); + + address[] memory reserves = pool.getReservesList(); + address[] memory reservesWithEth = new address[](reserves.length + 1); + for (uint256 i = 0; i < reserves.length; i++) { + reservesWithEth[i] = reserves[i]; + } + reservesWithEth[reserves.length] = MOCK_ETH_ADDRESS; + + uint256[] memory balances = new uint256[](reservesWithEth.length); + + for (uint256 j = 0; j < reserves.length; j++) { + DataTypes.ReserveConfigurationMap memory configuration = pool.getConfiguration( + reservesWithEth[j] + ); + + (bool isActive, , , ) = configuration.getFlags(); + + if (!isActive) { + balances[j] = 0; + continue; + } + balances[j] = balanceOf(user, reservesWithEth[j]); + } + balances[reserves.length] = balanceOf(user, MOCK_ETH_ADDRESS); + + return (reservesWithEth, balances); + } +} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol new file mode 100644 index 00000000..9a6bb205 --- /dev/null +++ b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, 'Address: insufficient balance'); + + (bool success, ) = recipient.call{value: amount}(''); + require(success, 'Address: unable to send value, recipient may have reverted'); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain `call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, 'Address: low-level call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, 'Address: insufficient balance for call'); + require(isContract(target), 'Address: call to non-contract'); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data + ) internal view returns (bytes memory) { + return functionStaticCall(target, data, 'Address: low-level static call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isContract(target), 'Address: static call to non-contract'); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isContract(target), 'Address: delegate call to non-contract'); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the + * revert reason using the provided one. + * + * _Available since v4.3._ + */ + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/helpers/WalletBalanceProvider.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/helpers/WalletBalanceProvider.sol new file mode 100644 index 00000000..54efad64 --- /dev/null +++ b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/helpers/WalletBalanceProvider.sol @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {Address} from '../dependencies/openzeppelin/contracts/Address.sol'; +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; + +import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; +import {IPool} from '../interfaces/IPool.sol'; +import {GPv2SafeERC20} from '../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title WalletBalanceProvider contract + * @author Aave, influenced by https://github.com/wbobeirne/eth-balance-checker/blob/master/contracts/BalanceChecker.sol + * @notice Implements a logic of getting multiple tokens balance for one user address + * @dev NOTE: THIS CONTRACT IS NOT USED WITHIN THE AAVE PROTOCOL. It's an accessory contract used to reduce the number of calls + * towards the blockchain from the Aave backend. + **/ +contract WalletBalanceProvider { + using Address for address payable; + using Address for address; + using GPv2SafeERC20 for IERC20; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + address constant MOCK_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /** + @dev Fallback function, don't accept any ETH + **/ + receive() external payable { + //only contracts can send ETH to the core + require(msg.sender.isContract(), '22'); + } + + /** + @dev Check the token balance of a wallet in a token contract + + Returns the balance of the token for user. Avoids possible errors: + - return 0 on non-contract address + **/ + function balanceOf(address user, address token) public view returns (uint256) { + if (token == MOCK_ETH_ADDRESS) { + return user.balance; // ETH balance + // check if token is actually a contract + } else if (token.isContract()) { + return IERC20(token).balanceOf(user); + } + revert('INVALID_TOKEN'); + } + + /** + * @notice Fetches, for a list of _users and _tokens (ETH included with mock address), the balances + * @param users The list of users + * @param tokens The list of tokens + * @return And array with the concatenation of, for each user, his/her balances + **/ + function batchBalanceOf( + address[] calldata users, + address[] calldata tokens + ) external view returns (uint256[] memory) { + uint256[] memory balances = new uint256[](users.length * tokens.length); + + for (uint256 i = 0; i < users.length; i++) { + for (uint256 j = 0; j < tokens.length; j++) { + balances[i * tokens.length + j] = balanceOf(users[i], tokens[j]); + } + } + + return balances; + } + + /** + @dev provides balances of user wallet for all reserves available on the pool + */ + function getUserWalletBalances( + address provider, + address user + ) external view returns (address[] memory, uint256[] memory) { + IPool pool = IPool(IPoolAddressesProvider(provider).getPool()); + + address[] memory reserves = pool.getReservesList(); + address[] memory reservesWithEth = new address[](reserves.length + 1); + for (uint256 i = 0; i < reserves.length; i++) { + reservesWithEth[i] = reserves[i]; + } + reservesWithEth[reserves.length] = MOCK_ETH_ADDRESS; + + uint256[] memory balances = new uint256[](reservesWithEth.length); + + for (uint256 j = 0; j < reserves.length; j++) { + DataTypes.ReserveConfigurationMap memory configuration = pool.getConfiguration( + reservesWithEth[j] + ); + + (bool isActive, , , ) = configuration.getFlags(); + + if (!isActive) { + balances[j] = 0; + continue; + } + balances[j] = balanceOf(user, reservesWithEth[j]); + } + balances[reserves.length] = balanceOf(user, MOCK_ETH_ADDRESS); + + return (reservesWithEth, balances); + } +} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPool.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/downloads/LINEA/WETH_GATEWAY.sol b/downloads/LINEA/WETH_GATEWAY.sol new file mode 100644 index 00000000..cba46080 --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY.sol @@ -0,0 +1,3076 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0 ^0.8.10; + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWETH.sol + +interface IWETH { + function deposit() external payable; + + function withdraw(uint256) external; + + function approve(address guy, uint256 wad) external returns (bool); + + function transferFrom(address src, address dst, uint256 wad) external returns (bool); +} + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol + +interface IWrappedTokenGatewayV3 { + function depositETH(address pool, address onBehalfOf, uint16 referralCode) external payable; + + function withdrawETH(address pool, uint256 amount, address onBehalfOf) external; + + function repayETH(address pool, uint256 amount, address onBehalfOf) external payable; + + function borrowETH(address pool, uint256 amount, uint16 referralCode) external; + + function withdrawETHWithPermit( + address pool, + uint256 amount, + address to, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; +} + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAaveIncentivesController.sol + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPoolAddressesProvider.sol + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IScaledBalanceToken.sol + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/helpers/Errors.sol + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/types/DataTypes.sol + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPool.sol + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IInitializableAToken.sol + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAToken.sol + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} + +// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/WrappedTokenGatewayV3.sol + +/** + * @dev This contract is an upgrade of the WrappedTokenGatewayV3 contract, with immutable pool address. + * This contract keeps the same interface of the deprecated WrappedTokenGatewayV3 contract. + */ +contract WrappedTokenGatewayV3 is IWrappedTokenGatewayV3, Ownable { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using GPv2SafeERC20 for IERC20; + + IWETH internal immutable WETH; + IPool internal immutable POOL; + + /** + * @dev Sets the WETH address and the PoolAddressesProvider address. Infinite approves pool. + * @param weth Address of the Wrapped Ether contract + * @param owner Address of the owner of this contract + **/ + constructor(address weth, address owner, IPool pool) { + WETH = IWETH(weth); + POOL = pool; + transferOwnership(owner); + IWETH(weth).approve(address(pool), type(uint256).max); + } + + /** + * @dev deposits WETH into the reserve, using native ETH. A corresponding amount of the overlying asset (aTokens) + * is minted. + * @param onBehalfOf address of the user who will receive the aTokens representing the deposit + * @param referralCode integrators are assigned a referral code and can potentially receive rewards. + **/ + function depositETH(address, address onBehalfOf, uint16 referralCode) external payable override { + WETH.deposit{value: msg.value}(); + POOL.deposit(address(WETH), msg.value, onBehalfOf, referralCode); + } + + /** + * @dev withdraws the WETH _reserves of msg.sender. + * @param amount amount of aWETH to withdraw and receive native ETH + * @param to address of the user who will receive native ETH + */ + function withdrawETH(address, uint256 amount, address to) external override { + IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); + uint256 userBalance = aWETH.balanceOf(msg.sender); + uint256 amountToWithdraw = amount; + + // if amount is equal to uint(-1), the user wants to redeem everything + if (amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); + POOL.withdraw(address(WETH), amountToWithdraw, address(this)); + WETH.withdraw(amountToWithdraw); + _safeTransferETH(to, amountToWithdraw); + } + + /** + * @dev repays a borrow on the WETH reserve, for the specified amount (or for the whole amount, if uint256(-1) is specified). + * @param amount the amount to repay, or uint256(-1) if the user wants to repay everything + * @param onBehalfOf the address for which msg.sender is repaying + */ + function repayETH(address, uint256 amount, address onBehalfOf) external payable override { + uint256 paybackAmount = IERC20((POOL.getReserveData(address(WETH))).variableDebtTokenAddress) + .balanceOf(onBehalfOf); + + if (amount < paybackAmount) { + paybackAmount = amount; + } + require(msg.value >= paybackAmount, 'msg.value is less than repayment amount'); + WETH.deposit{value: paybackAmount}(); + POOL.repay( + address(WETH), + paybackAmount, + uint256(DataTypes.InterestRateMode.VARIABLE), + onBehalfOf + ); + + // refund remaining dust eth + if (msg.value > paybackAmount) _safeTransferETH(msg.sender, msg.value - paybackAmount); + } + + /** + * @dev borrow WETH, unwraps to ETH and send both the ETH and DebtTokens to msg.sender, via `approveDelegation` and onBehalf argument in `Pool.borrow`. + * @param amount the amount of ETH to borrow + * @param referralCode integrators are assigned a referral code and can potentially receive rewards + */ + function borrowETH(address, uint256 amount, uint16 referralCode) external override { + POOL.borrow( + address(WETH), + amount, + uint256(DataTypes.InterestRateMode.VARIABLE), + referralCode, + msg.sender + ); + WETH.withdraw(amount); + _safeTransferETH(msg.sender, amount); + } + + /** + * @dev withdraws the WETH _reserves of msg.sender. + * @param amount amount of aWETH to withdraw and receive native ETH + * @param to address of the user who will receive native ETH + * @param deadline validity deadline of permit and so depositWithPermit signature + * @param permitV V parameter of ERC712 permit sig + * @param permitR R parameter of ERC712 permit sig + * @param permitS S parameter of ERC712 permit sig + */ + function withdrawETHWithPermit( + address, + uint256 amount, + address to, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external override { + IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); + uint256 userBalance = aWETH.balanceOf(msg.sender); + uint256 amountToWithdraw = amount; + + // if amount is equal to type(uint256).max, the user wants to redeem everything + if (amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + // permit `amount` rather than `amountToWithdraw` to make it easier for front-ends and integrators + aWETH.permit(msg.sender, address(this), amount, deadline, permitV, permitR, permitS); + aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); + POOL.withdraw(address(WETH), amountToWithdraw, address(this)); + WETH.withdraw(amountToWithdraw); + _safeTransferETH(to, amountToWithdraw); + } + + /** + * @dev transfer ETH to an address, revert if it fails. + * @param to recipient of the transfer + * @param value the amount to send + */ + function _safeTransferETH(address to, uint256 value) internal { + (bool success, ) = to.call{value: value}(new bytes(0)); + require(success, 'ETH_TRANSFER_FAILED'); + } + + /** + * @dev transfer ERC20 from the utility contract, for ERC20 recovery in case of stuck tokens due + * direct transfers to the contract address. + * @param token token to transfer + * @param to recipient of the transfer + * @param amount amount to send + */ + function emergencyTokenTransfer(address token, address to, uint256 amount) external onlyOwner { + IERC20(token).safeTransfer(to, amount); + } + + /** + * @dev transfer native Ether from the utility contract, for native Ether recovery in case of stuck Ether + * due to selfdestructs or ether transfers to the pre-computed contract address before deployment. + * @param to recipient of the transfer + * @param amount amount to send + */ + function emergencyEtherTransfer(address to, uint256 amount) external onlyOwner { + _safeTransferETH(to, amount); + } + + /** + * @dev Get WETH address used by WrappedTokenGatewayV3 + */ + function getWETHAddress() external view returns (address) { + return address(WETH); + } + + /** + * @dev Only WETH contract is allowed to transfer ETH here. Prevent other addresses to send Ether to this contract. + */ + receive() external payable { + require(msg.sender == address(WETH), 'Receive not allowed'); + } + + /** + * @dev Revert fallback calls + */ + fallback() external payable { + revert('Fallback not allowed'); + } +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol new file mode 100644 index 00000000..d404c60d --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +pragma solidity ^0.8.10; + +import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; + +/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library +/// @author Gnosis Developers +/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. +library GPv2SafeERC20 { + /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts + /// also when the token returns `false`. + function safeTransfer(IERC20 token, address to, uint256 value) internal { + bytes4 selector_ = token.transfer.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transfer'); + } + + /// @dev Wrapper around a call to the ERC20 function `transferFrom` that + /// reverts also when the token returns `false`. + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + bytes4 selector_ = token.transferFrom.selector; + + // solhint-disable-next-line no-inline-assembly + assembly { + let freeMemoryPointer := mload(0x40) + mstore(freeMemoryPointer, selector_) + mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) + mstore(add(freeMemoryPointer, 68), value) + + if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { + returndatacopy(0, 0, returndatasize()) + revert(0, returndatasize()) + } + } + + require(getLastTransferResult(token), 'GPv2: failed transferFrom'); + } + + /// @dev Verifies that the last return was a successful `transfer*` call. + /// This is done by checking that the return data is either empty, or + /// is a valid ABI encoded boolean. + function getLastTransferResult(IERC20 token) private view returns (bool success) { + // NOTE: Inspecting previous return data requires assembly. Note that + // we write the return data to memory 0 in the case where the return + // data size is 32, this is OK since the first 64 bytes of memory are + // reserved by Solidy as a scratch space that can be used within + // assembly blocks. + // + // solhint-disable-next-line no-inline-assembly + assembly { + /// @dev Revert with an ABI encoded Solidity error with a message + /// that fits into 32-bytes. + /// + /// An ABI encoded Solidity error has the following memory layout: + /// + /// ------------+---------------------------------- + /// byte range | value + /// ------------+---------------------------------- + /// 0x00..0x04 | selector("Error(string)") + /// 0x04..0x24 | string offset (always 0x20) + /// 0x24..0x44 | string length + /// 0x44..0x64 | string value, padded to 32-bytes + function revertWithMessage(length, message) { + mstore(0x00, '\x08\xc3\x79\xa0') + mstore(0x04, 0x20) + mstore(0x24, length) + mstore(0x44, message) + revert(0x00, 0x64) + } + + switch returndatasize() + // Non-standard ERC20 transfer without return. + case 0 { + // NOTE: When the return data size is 0, verify that there + // is code at the address. This is done in order to maintain + // compatibility with Solidity calling conventions. + // + if iszero(extcodesize(token)) { + revertWithMessage(20, 'GPv2: not a contract') + } + + success := 1 + } + // Standard ERC20 transfer returning boolean success value. + case 32 { + returndatacopy(0, 0, returndatasize()) + + // NOTE: For ABI encoding v1, any non-zero value is accepted + // as `true` for a boolean. In order to stay compatible with + // OpenZeppelin's `SafeERC20` library which is known to work + // with the existing ERC20 implementation we care about, + // make sure we return success for any non-zero return value + // from the `transfer*` call. + success := iszero(iszero(mload(0))) + } + default { + revertWithMessage(31, 'GPv2: malformed transfer result') + } + } + } +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol new file mode 100644 index 00000000..93f354b0 --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol new file mode 100644 index 00000000..0554ac2b --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol new file mode 100644 index 00000000..7917b722 --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.10; + +import './Context.sol'; + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), 'Ownable: caller is not the owner'); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), 'Ownable: new owner is the zero address'); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/WrappedTokenGatewayV3.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/WrappedTokenGatewayV3.sol new file mode 100644 index 00000000..56725d5e --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/WrappedTokenGatewayV3.sol @@ -0,0 +1,197 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.10; + +import {Ownable} from '../dependencies/openzeppelin/contracts/Ownable.sol'; +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {GPv2SafeERC20} from '../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; +import {IWETH} from './interfaces/IWETH.sol'; +import {IPool} from '../interfaces/IPool.sol'; +import {IAToken} from '../interfaces/IAToken.sol'; +import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; +import {IWrappedTokenGatewayV3} from './interfaces/IWrappedTokenGatewayV3.sol'; + +/** + * @dev This contract is an upgrade of the WrappedTokenGatewayV3 contract, with immutable pool address. + * This contract keeps the same interface of the deprecated WrappedTokenGatewayV3 contract. + */ +contract WrappedTokenGatewayV3 is IWrappedTokenGatewayV3, Ownable { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using GPv2SafeERC20 for IERC20; + + IWETH internal immutable WETH; + IPool internal immutable POOL; + + /** + * @dev Sets the WETH address and the PoolAddressesProvider address. Infinite approves pool. + * @param weth Address of the Wrapped Ether contract + * @param owner Address of the owner of this contract + **/ + constructor(address weth, address owner, IPool pool) { + WETH = IWETH(weth); + POOL = pool; + transferOwnership(owner); + IWETH(weth).approve(address(pool), type(uint256).max); + } + + /** + * @dev deposits WETH into the reserve, using native ETH. A corresponding amount of the overlying asset (aTokens) + * is minted. + * @param onBehalfOf address of the user who will receive the aTokens representing the deposit + * @param referralCode integrators are assigned a referral code and can potentially receive rewards. + **/ + function depositETH(address, address onBehalfOf, uint16 referralCode) external payable override { + WETH.deposit{value: msg.value}(); + POOL.deposit(address(WETH), msg.value, onBehalfOf, referralCode); + } + + /** + * @dev withdraws the WETH _reserves of msg.sender. + * @param amount amount of aWETH to withdraw and receive native ETH + * @param to address of the user who will receive native ETH + */ + function withdrawETH(address, uint256 amount, address to) external override { + IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); + uint256 userBalance = aWETH.balanceOf(msg.sender); + uint256 amountToWithdraw = amount; + + // if amount is equal to uint(-1), the user wants to redeem everything + if (amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); + POOL.withdraw(address(WETH), amountToWithdraw, address(this)); + WETH.withdraw(amountToWithdraw); + _safeTransferETH(to, amountToWithdraw); + } + + /** + * @dev repays a borrow on the WETH reserve, for the specified amount (or for the whole amount, if uint256(-1) is specified). + * @param amount the amount to repay, or uint256(-1) if the user wants to repay everything + * @param onBehalfOf the address for which msg.sender is repaying + */ + function repayETH(address, uint256 amount, address onBehalfOf) external payable override { + uint256 paybackAmount = IERC20((POOL.getReserveData(address(WETH))).variableDebtTokenAddress) + .balanceOf(onBehalfOf); + + if (amount < paybackAmount) { + paybackAmount = amount; + } + require(msg.value >= paybackAmount, 'msg.value is less than repayment amount'); + WETH.deposit{value: paybackAmount}(); + POOL.repay( + address(WETH), + paybackAmount, + uint256(DataTypes.InterestRateMode.VARIABLE), + onBehalfOf + ); + + // refund remaining dust eth + if (msg.value > paybackAmount) _safeTransferETH(msg.sender, msg.value - paybackAmount); + } + + /** + * @dev borrow WETH, unwraps to ETH and send both the ETH and DebtTokens to msg.sender, via `approveDelegation` and onBehalf argument in `Pool.borrow`. + * @param amount the amount of ETH to borrow + * @param referralCode integrators are assigned a referral code and can potentially receive rewards + */ + function borrowETH(address, uint256 amount, uint16 referralCode) external override { + POOL.borrow( + address(WETH), + amount, + uint256(DataTypes.InterestRateMode.VARIABLE), + referralCode, + msg.sender + ); + WETH.withdraw(amount); + _safeTransferETH(msg.sender, amount); + } + + /** + * @dev withdraws the WETH _reserves of msg.sender. + * @param amount amount of aWETH to withdraw and receive native ETH + * @param to address of the user who will receive native ETH + * @param deadline validity deadline of permit and so depositWithPermit signature + * @param permitV V parameter of ERC712 permit sig + * @param permitR R parameter of ERC712 permit sig + * @param permitS S parameter of ERC712 permit sig + */ + function withdrawETHWithPermit( + address, + uint256 amount, + address to, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external override { + IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); + uint256 userBalance = aWETH.balanceOf(msg.sender); + uint256 amountToWithdraw = amount; + + // if amount is equal to type(uint256).max, the user wants to redeem everything + if (amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + // permit `amount` rather than `amountToWithdraw` to make it easier for front-ends and integrators + aWETH.permit(msg.sender, address(this), amount, deadline, permitV, permitR, permitS); + aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); + POOL.withdraw(address(WETH), amountToWithdraw, address(this)); + WETH.withdraw(amountToWithdraw); + _safeTransferETH(to, amountToWithdraw); + } + + /** + * @dev transfer ETH to an address, revert if it fails. + * @param to recipient of the transfer + * @param value the amount to send + */ + function _safeTransferETH(address to, uint256 value) internal { + (bool success, ) = to.call{value: value}(new bytes(0)); + require(success, 'ETH_TRANSFER_FAILED'); + } + + /** + * @dev transfer ERC20 from the utility contract, for ERC20 recovery in case of stuck tokens due + * direct transfers to the contract address. + * @param token token to transfer + * @param to recipient of the transfer + * @param amount amount to send + */ + function emergencyTokenTransfer(address token, address to, uint256 amount) external onlyOwner { + IERC20(token).safeTransfer(to, amount); + } + + /** + * @dev transfer native Ether from the utility contract, for native Ether recovery in case of stuck Ether + * due to selfdestructs or ether transfers to the pre-computed contract address before deployment. + * @param to recipient of the transfer + * @param amount amount to send + */ + function emergencyEtherTransfer(address to, uint256 amount) external onlyOwner { + _safeTransferETH(to, amount); + } + + /** + * @dev Get WETH address used by WrappedTokenGatewayV3 + */ + function getWETHAddress() external view returns (address) { + return address(WETH); + } + + /** + * @dev Only WETH contract is allowed to transfer ETH here. Prevent other addresses to send Ether to this contract. + */ + receive() external payable { + require(msg.sender == address(WETH), 'Receive not allowed'); + } + + /** + * @dev Revert fallback calls + */ + fallback() external payable { + revert('Fallback not allowed'); + } +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWETH.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWETH.sol new file mode 100644 index 00000000..98281d0a --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWETH.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IWETH { + function deposit() external payable; + + function withdraw(uint256) external; + + function approve(address guy, uint256 wad) external returns (bool); + + function transferFrom(address src, address dst, uint256 wad) external returns (bool); +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol new file mode 100644 index 00000000..ae8f5980 --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +interface IWrappedTokenGatewayV3 { + function depositETH(address pool, address onBehalfOf, uint16 referralCode) external payable; + + function withdrawETH(address pool, uint256 amount, address onBehalfOf) external; + + function repayETH(address pool, uint256 amount, address onBehalfOf) external payable; + + function borrowETH(address pool, uint256 amount, uint16 referralCode) external; + + function withdrawETHWithPermit( + address pool, + uint256 amount, + address to, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAToken.sol new file mode 100644 index 00000000..9078c626 --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAToken.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; +import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; +import {IInitializableAToken} from './IInitializableAToken.sol'; + +/** + * @title IAToken + * @author Aave + * @notice Defines the basic interface for an AToken. + */ +interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { + /** + * @dev Emitted during the transfer action + * @param from The user whose tokens are being transferred + * @param to The recipient + * @param value The scaled amount being transferred + * @param index The next liquidity index of the reserve + */ + event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); + + /** + * @notice Mints `amount` aTokens to `user` + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted aTokens + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + * @return `true` if the the previous balance of the user was 0 + */ + function mint( + address caller, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + + /** + * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` + * @dev In some instances, the mint event could be emitted from a burn transaction + * if the amount to burn is less than the interest that the user accrued + * @param from The address from which the aTokens will be burned + * @param receiverOfUnderlying The address that will receive the underlying + * @param amount The amount being burned + * @param index The next liquidity index of the reserve + */ + function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; + + /** + * @notice Mints aTokens to the reserve treasury + * @param amount The amount of tokens getting minted + * @param index The next liquidity index of the reserve + */ + function mintToTreasury(uint256 amount, uint256 index) external; + + /** + * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken + * @param from The address getting liquidated, current owner of the aTokens + * @param to The recipient + * @param value The amount of tokens getting transferred + */ + function transferOnLiquidation(address from, address to, uint256 value) external; + + /** + * @notice Transfers the underlying asset to `target`. + * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() + * @param target The recipient of the underlying + * @param amount The amount getting transferred + */ + function transferUnderlyingTo(address target, uint256 amount) external; + + /** + * @notice Handles the underlying received by the aToken after the transfer has been completed. + * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the + * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying + * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. + * @param user The user executing the repayment + * @param onBehalfOf The address of the user who will get his debt reduced/removed + * @param amount The amount getting repaid + */ + function handleRepayment(address user, address onBehalfOf, uint256 amount) external; + + /** + * @notice Allow passing a signed message to approve spending + * @dev implements the permit function as for + * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md + * @param owner The owner of the funds + * @param spender The spender + * @param value The amount + * @param deadline The deadline timestamp, type(uint256).max for max deadline + * @param v Signature param + * @param s Signature param + * @param r Signature param + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @return The address of the underlying asset + */ + function UNDERLYING_ASSET_ADDRESS() external view returns (address); + + /** + * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. + * @return Address of the Aave treasury + */ + function RESERVE_TREASURY_ADDRESS() external view returns (address); + + /** + * @notice Get the domain separator for the token + * @dev Return cached value if chainId matches cache, otherwise recomputes separator + * @return The domain separator of the token at current chain + */ + function DOMAIN_SEPARATOR() external view returns (bytes32); + + /** + * @notice Returns the nonce for owner. + * @param owner The address of the owner + * @return The nonce of the owner + */ + function nonces(address owner) external view returns (uint256); + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAaveIncentivesController.sol new file mode 100644 index 00000000..7cc84212 --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAaveIncentivesController.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveIncentivesController + * @author Aave + * @notice Defines the basic interface for an Aave Incentives Controller. + * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. + */ +interface IAaveIncentivesController { + /** + * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. + * @dev The units of `totalSupply` and `userBalance` should be the same. + * @param user The address of the user whose asset balance has changed + * @param totalSupply The total supply of the asset prior to user balance change + * @param userBalance The previous user balance prior to balance change + */ + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IInitializableAToken.sol new file mode 100644 index 00000000..fdc18588 --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IInitializableAToken.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; +import {IPool} from './IPool.sol'; + +/** + * @title IInitializableAToken + * @author Aave + * @notice Interface for the initialize function on AToken + */ +interface IInitializableAToken { + /** + * @dev Emitted when an aToken is initialized + * @param underlyingAsset The address of the underlying asset + * @param pool The address of the associated pool + * @param treasury The address of the treasury + * @param incentivesController The address of the incentives controller for this aToken + * @param aTokenDecimals The decimals of the underlying + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + event Initialized( + address indexed underlyingAsset, + address indexed pool, + address treasury, + address incentivesController, + uint8 aTokenDecimals, + string aTokenName, + string aTokenSymbol, + bytes params + ); + + /** + * @notice Initializes the aToken + * @param pool The pool contract that is initializing this contract + * @param treasury The address of the Aave treasury, receiving the fees on this aToken + * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) + * @param incentivesController The smart contract managing potential incentives distribution + * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's + * @param aTokenName The name of the aToken + * @param aTokenSymbol The symbol of the aToken + * @param params A set of encoded parameters for additional initialization + */ + function initialize( + IPool pool, + address treasury, + address underlyingAsset, + IAaveIncentivesController incentivesController, + uint8 aTokenDecimals, + string calldata aTokenName, + string calldata aTokenSymbol, + bytes calldata params + ) external; +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPool.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPool.sol new file mode 100644 index 00000000..4ed19d05 --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPool.sol @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; +import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; + +/** + * @title IPool + * @author Aave + * @notice Defines the basic interface for an Aave Pool. + */ +interface IPool { + /** + * @dev Emitted on mintUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens + * @param amount The amount of supplied assets + * @param referralCode The referral code used + */ + event MintUnbacked( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on backUnbacked() + * @param reserve The address of the underlying asset of the reserve + * @param backer The address paying for the backing + * @param amount The amount added as backing + * @param fee The amount paid in fees + */ + event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); + + /** + * @dev Emitted on supply() + * @param reserve The address of the underlying asset of the reserve + * @param user The address initiating the supply + * @param onBehalfOf The beneficiary of the supply, receiving the aTokens + * @param amount The amount supplied + * @param referralCode The referral code used + */ + event Supply( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on withdraw() + * @param reserve The address of the underlying asset being withdrawn + * @param user The address initiating the withdrawal, owner of aTokens + * @param to The address that will receive the underlying + * @param amount The amount to be withdrawn + */ + event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); + + /** + * @dev Emitted on borrow() and flashLoan() when debt needs to be opened + * @param reserve The address of the underlying asset being borrowed + * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just + * initiator of the transaction on flashLoan() + * @param onBehalfOf The address that will be getting the debt + * @param amount The amount borrowed out + * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) + * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray + * @param referralCode The referral code used + */ + event Borrow( + address indexed reserve, + address user, + address indexed onBehalfOf, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 borrowRate, + uint16 indexed referralCode + ); + + /** + * @dev Emitted on repay() + * @param reserve The address of the underlying asset of the reserve + * @param user The beneficiary of the repayment, getting his debt reduced + * @param repayer The address of the user initiating the repay(), providing the funds + * @param amount The amount repaid + * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly + */ + event Repay( + address indexed reserve, + address indexed user, + address indexed repayer, + uint256 amount, + bool useATokens + ); + + /** + * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets + * @param asset The address of the underlying asset of the reserve + * @param totalDebt The total isolation mode debt for the reserve + */ + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + /** + * @dev Emitted when the user selects a certain asset category for eMode + * @param user The address of the user + * @param categoryId The category id + */ + event UserEModeSet(address indexed user, uint8 categoryId); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on setUserUseReserveAsCollateral() + * @param reserve The address of the underlying asset of the reserve + * @param user The address of the user enabling the usage as collateral + */ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + + /** + * @dev Emitted on flashLoan() + * @param target The address of the flash loan receiver contract + * @param initiator The address initiating the flash loan + * @param asset The address of the asset being flash borrowed + * @param amount The amount flash borrowed + * @param interestRateMode The flashloan mode: 0 for regular flashloan, + * 1 for Stable (Deprecated on v3.2.0), 2 for Variable + * @param premium The fee flash borrowed + * @param referralCode The referral code used + */ + event FlashLoan( + address indexed target, + address initiator, + address indexed asset, + uint256 amount, + DataTypes.InterestRateMode interestRateMode, + uint256 premium, + uint16 indexed referralCode + ); + + /** + * @dev Emitted when a borrower is liquidated. + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param liquidatedCollateralAmount The amount of collateral received by the liquidator + * @param liquidator The address of the liquidator + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + event LiquidationCall( + address indexed collateralAsset, + address indexed debtAsset, + address indexed user, + uint256 debtToCover, + uint256 liquidatedCollateralAmount, + address liquidator, + bool receiveAToken + ); + + /** + * @dev Emitted when the state of a reserve is updated. + * @param reserve The address of the underlying asset of the reserve + * @param liquidityRate The next liquidity rate + * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 + * @param variableBorrowRate The next variable borrow rate + * @param liquidityIndex The next liquidity index + * @param variableBorrowIndex The next variable borrow index + */ + event ReserveDataUpdated( + address indexed reserve, + uint256 liquidityRate, + uint256 stableBorrowRate, + uint256 variableBorrowRate, + uint256 liquidityIndex, + uint256 variableBorrowIndex + ); + + /** + * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. + * @param reserve The address of the reserve + * @param amountMinted The amount minted to the treasury + */ + event MintedToTreasury(address indexed reserve, uint256 amountMinted); + + /** + * @notice Mints an `amount` of aTokens to the `onBehalfOf` + * @param asset The address of the underlying asset to mint + * @param amount The amount to mint + * @param onBehalfOf The address that will receive the aTokens + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function mintUnbacked( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @notice Back the current unbacked underlying with `amount` and pay `fee`. + * @param asset The address of the underlying asset to back + * @param amount The amount to back + * @param fee The amount paid in fees + * @return The backed amount + */ + function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Supply with transfer approval of asset to be supplied done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param deadline The deadline timestamp that the permit is valid + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + */ + function supplyWithPermit( + address asset, + uint256 amount, + address onBehalfOf, + uint16 referralCode, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); + + /** + * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower + * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken + * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet + * and 100 variable debt tokens + * @param asset The address of the underlying asset to borrow + * @param amount The amount to be borrowed + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself + * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator + * if he has been given credit delegation allowance + */ + function borrow( + address asset, + uint256 amount, + uint256 interestRateMode, + uint16 referralCode, + address onBehalfOf + ) external; + + /** + * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned + * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @return The final amount repaid + */ + function repay( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf + ) external returns (uint256); + + /** + * @notice Repay with transfer approval of asset to be repaid done via permit function + * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 + * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the + * user calling the function if he wants to reduce/remove his own debt, or the address of any other + * other borrower whose debt should be removed + * @param deadline The deadline timestamp that the permit is valid + * @param permitV The V parameter of ERC712 permit sig + * @param permitR The R parameter of ERC712 permit sig + * @param permitS The S parameter of ERC712 permit sig + * @return The final amount repaid + */ + function repayWithPermit( + address asset, + uint256 amount, + uint256 interestRateMode, + address onBehalfOf, + uint256 deadline, + uint8 permitV, + bytes32 permitR, + bytes32 permitS + ) external returns (uint256); + + /** + * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the + * equivalent debt tokens + * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens + * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken + * balance is not enough to cover the whole debt + * @param asset The address of the borrowed underlying asset previously borrowed + * @param amount The amount to repay + * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` + * @param interestRateMode DEPRECATED in v3.2.0 + * @return The final amount repaid + */ + function repayWithATokens( + address asset, + uint256 amount, + uint256 interestRateMode + ) external returns (uint256); + + /** + * @notice Allows suppliers to enable/disable a specific supplied asset as collateral + * @param asset The address of the underlying asset supplied + * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise + */ + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; + + /** + * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 + * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives + * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk + * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation + * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation + * @param user The address of the borrower getting liquidated + * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover + * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants + * to receive the underlying collateral asset directly + */ + function liquidationCall( + address collateralAsset, + address debtAsset, + address user, + uint256 debtToCover, + bool receiveAToken + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface + * @param assets The addresses of the assets being flash-borrowed + * @param amounts The amounts of the assets being flash-borrowed + * @param interestRateModes Types of the debt to open if the flash loan is not returned: + * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver + * 1 -> Deprecated on v3.2.0 + * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address + * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoan( + address receiverAddress, + address[] calldata assets, + uint256[] calldata amounts, + uint256[] calldata interestRateModes, + address onBehalfOf, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, + * as long as the amount taken plus a fee is returned. + * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept + * into consideration. For further details please visit https://docs.aave.com/developers/ + * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface + * @param asset The address of the asset being flash-borrowed + * @param amount The amount of the asset being flash-borrowed + * @param params Variadic packed params to pass to the receiver as extra information + * @param referralCode The code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function flashLoanSimple( + address receiverAddress, + address asset, + uint256 amount, + bytes calldata params, + uint16 referralCode + ) external; + + /** + * @notice Returns the user account data across all the reserves + * @param user The address of the user + * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed + * @return totalDebtBase The total debt of the user in the base currency used by the price feed + * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed + * @return currentLiquidationThreshold The liquidation threshold of the user + * @return ltv The loan to value of The user + * @return healthFactor The current health factor of the user + */ + function getUserAccountData( + address user + ) + external + view + returns ( + uint256 totalCollateralBase, + uint256 totalDebtBase, + uint256 availableBorrowsBase, + uint256 currentLiquidationThreshold, + uint256 ltv, + uint256 healthFactor + ); + + /** + * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an + * interest rate strategy + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param aTokenAddress The address of the aToken that will be assigned to the reserve + * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve + * @param interestRateStrategyAddress The address of the interest rate strategy contract + */ + function initReserve( + address asset, + address aTokenAddress, + address variableDebtAddress, + address interestRateStrategyAddress + ) external; + + /** + * @notice Drop a reserve + * @dev Only callable by the PoolConfigurator contract + * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. + * @param asset The address of the underlying asset of the reserve + */ + function dropReserve(address asset) external; + + /** + * @notice Updates the address of the interest rate strategy contract + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param rateStrategyAddress The address of the interest rate strategy contract + */ + function setReserveInterestRateStrategyAddress( + address asset, + address rateStrategyAddress + ) external; + + /** + * @notice Accumulates interest to all indexes of the reserve + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncIndexesState(address asset) external; + + /** + * @notice Updates interest rates on the reserve data + * @dev Only callable by the PoolConfigurator contract + * @dev To be used when required by the configurator, for example when updating interest rates strategy data + * @param asset The address of the underlying asset of the reserve + */ + function syncRatesState(address asset) external; + + /** + * @notice Sets the configuration bitmap of the reserve as a whole + * @dev Only callable by the PoolConfigurator contract + * @param asset The address of the underlying asset of the reserve + * @param configuration The new configuration bitmap + */ + function setConfiguration( + address asset, + DataTypes.ReserveConfigurationMap calldata configuration + ) external; + + /** + * @notice Returns the configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The configuration of the reserve + */ + function getConfiguration( + address asset + ) external view returns (DataTypes.ReserveConfigurationMap memory); + + /** + * @notice Returns the configuration of the user across all the reserves + * @param user The user address + * @return The configuration of the user + */ + function getUserConfiguration( + address user + ) external view returns (DataTypes.UserConfigurationMap memory); + + /** + * @notice Returns the normalized income of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve's normalized income + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); + + /** + * @notice Returns the normalized variable debt per unit of asset + * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a + * "dynamic" variable index based on time, current stored index and virtual rate at the current + * moment (approx. a borrower would get if opening a position). This means that is always used in + * combination with variable debt supply/balances. + * If using this function externally, consider that is possible to have an increasing normalized + * variable debt that is not equivalent to how the variable debt index would be updated in storage + * (e.g. only updates with non-zero variable debt supply) + * @param asset The address of the underlying asset of the reserve + * @return The reserve normalized variable debt + */ + function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); + + /** + * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 + * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve with virtual accounting + */ + function getReserveDataExtended( + address asset + ) external view returns (DataTypes.ReserveData memory); + + /** + * @notice Returns the virtual underlying balance of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve virtual underlying balance + */ + function getVirtualUnderlyingBalance(address asset) external view returns (uint128); + + /** + * @notice Validates and finalizes an aToken transfer + * @dev Only callable by the overlying aToken of the `asset` + * @param asset The address of the underlying asset of the aToken + * @param from The user from which the aTokens are transferred + * @param to The user receiving the aTokens + * @param amount The amount being transferred/withdrawn + * @param balanceFromBefore The aToken balance of the `from` user before the transfer + * @param balanceToBefore The aToken balance of the `to` user before the transfer + */ + function finalizeTransfer( + address asset, + address from, + address to, + uint256 amount, + uint256 balanceFromBefore, + uint256 balanceToBefore + ) external; + + /** + * @notice Returns the list of the underlying assets of all the initialized reserves + * @dev It does not include dropped reserves + * @return The addresses of the underlying assets of the initialized reserves + */ + function getReservesList() external view returns (address[] memory); + + /** + * @notice Returns the number of initialized reserves + * @dev It includes dropped reserves + * @return The count + */ + function getReservesCount() external view returns (uint256); + + /** + * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct + * @param id The id of the reserve as stored in the DataTypes.ReserveData struct + * @return The address of the reserve associated with id + */ + function getReserveAddressById(uint16 id) external view returns (address); + + /** + * @notice Returns the PoolAddressesProvider connected to this contract + * @return The address of the PoolAddressesProvider + */ + function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); + + /** + * @notice Updates the protocol fee on the bridging + * @param bridgeProtocolFee The part of the premium sent to the protocol treasury + */ + function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; + + /** + * @notice Updates flash loan premiums. Flash loan premium consists of two parts: + * - A part is sent to aToken holders as extra, one time accumulated interest + * - A part is collected by the protocol treasury + * @dev The total premium is calculated on the total borrowed amount + * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` + * @dev Only callable by the PoolConfigurator contract + * @param flashLoanPremiumTotal The total premium, expressed in bps + * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps + */ + function updateFlashloanPremiums( + uint128 flashLoanPremiumTotal, + uint128 flashLoanPremiumToProtocol + ) external; + + /** + * @notice Configures a new or alters an existing collateral configuration of an eMode. + * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. + * The category 0 is reserved as it's the default for volatile assets + * @param id The id of the category + * @param config The configuration of the category + */ + function configureEModeCategory( + uint8 id, + DataTypes.EModeCategoryBaseConfiguration memory config + ) external; + + /** + * @notice Replaces the current eMode collateralBitmap. + * @param id The id of the category + * @param collateralBitmap The collateralBitmap of the category + */ + function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; + + /** + * @notice Replaces the current eMode borrowableBitmap. + * @param id The id of the category + * @param borrowableBitmap The borrowableBitmap of the category + */ + function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; + + /** + * @notice Returns the data of an eMode category + * @dev DEPRECATED use independent getters instead + * @param id The id of the category + * @return The configuration data of the category + */ + function getEModeCategoryData( + uint8 id + ) external view returns (DataTypes.EModeCategoryLegacy memory); + + /** + * @notice Returns the label of an eMode category + * @param id The id of the category + * @return The label of the category + */ + function getEModeCategoryLabel(uint8 id) external view returns (string memory); + + /** + * @notice Returns the collateral config of an eMode category + * @param id The id of the category + * @return The ltv,lt,lb of the category + */ + function getEModeCategoryCollateralConfig( + uint8 id + ) external view returns (DataTypes.CollateralConfig memory); + + /** + * @notice Returns the collateralBitmap of an eMode category + * @param id The id of the category + * @return The collateralBitmap of the category + */ + function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Returns the borrowableBitmap of an eMode category + * @param id The id of the category + * @return The borrowableBitmap of the category + */ + function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); + + /** + * @notice Allows a user to use the protocol in eMode + * @param categoryId The id of the category + */ + function setUserEMode(uint8 categoryId) external; + + /** + * @notice Returns the eMode the user is using + * @param user The address of the user + * @return The eMode id + */ + function getUserEMode(address user) external view returns (uint256); + + /** + * @notice Resets the isolation mode total debt of the given asset to zero + * @dev It requires the given asset has zero debt ceiling + * @param asset The address of the underlying asset to reset the isolationModeTotalDebt + */ + function resetIsolationModeTotalDebt(address asset) external; + + /** + * @notice Sets the liquidation grace period of the given asset + * @dev To enable a liquidation grace period, a timestamp in the future should be set, + * To disable a liquidation grace period, any timestamp in the past works, like 0 + * @param asset The address of the underlying asset to set the liquidationGracePeriod + * @param until Timestamp when the liquidation grace period will end + **/ + function setLiquidationGracePeriod(address asset, uint40 until) external; + + /** + * @notice Returns the liquidation grace period of the given asset + * @param asset The address of the underlying asset + * @return Timestamp when the liquidation grace period will end + **/ + function getLiquidationGracePeriod(address asset) external returns (uint40); + + /** + * @notice Returns the total fee on flash loans + * @return The total fee on flashloans + */ + function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); + + /** + * @notice Returns the part of the bridge fees sent to protocol + * @return The bridge fee sent to the protocol treasury + */ + function BRIDGE_PROTOCOL_FEE() external view returns (uint256); + + /** + * @notice Returns the part of the flashloan fees sent to protocol + * @return The flashloan fee sent to the protocol treasury + */ + function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); + + /** + * @notice Returns the maximum number of reserves supported to be listed in this Pool + * @return The maximum number of reserves supported + */ + function MAX_NUMBER_RESERVES() external view returns (uint16); + + /** + * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens + * @param assets The list of reserves for which the minting needs to be executed + */ + function mintToTreasury(address[] calldata assets) external; + + /** + * @notice Rescue and transfer tokens locked in this contract + * @param token The address of the token + * @param to The address of the recipient + * @param amount The amount of token to transfer + */ + function rescueTokens(address token, address to, uint256 amount) external; + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @dev Deprecated: Use the `supply` function instead + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Gets the address of the external FlashLoanLogic + */ + function getFlashLoanLogic() external view returns (address); + + /** + * @notice Gets the address of the external BorrowLogic + */ + function getBorrowLogic() external view returns (address); + + /** + * @notice Gets the address of the external BridgeLogic + */ + function getBridgeLogic() external view returns (address); + + /** + * @notice Gets the address of the external EModeLogic + */ + function getEModeLogic() external view returns (address); + + /** + * @notice Gets the address of the external LiquidationLogic + */ + function getLiquidationLogic() external view returns (address); + + /** + * @notice Gets the address of the external PoolLogic + */ + function getPoolLogic() external view returns (address); + + /** + * @notice Gets the address of the external SupplyLogic + */ + function getSupplyLogic() external view returns (address); +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPoolAddressesProvider.sol new file mode 100644 index 00000000..c2c2a83d --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPoolAddressesProvider.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IPoolAddressesProvider + * @author Aave + * @notice Defines the basic interface for a Pool Addresses Provider. + */ +interface IPoolAddressesProvider { + /** + * @dev Emitted when the market identifier is updated. + * @param oldMarketId The old id of the market + * @param newMarketId The new id of the market + */ + event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); + + /** + * @dev Emitted when the pool is updated. + * @param oldAddress The old address of the Pool + * @param newAddress The new address of the Pool + */ + event PoolUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool configurator is updated. + * @param oldAddress The old address of the PoolConfigurator + * @param newAddress The new address of the PoolConfigurator + */ + event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle is updated. + * @param oldAddress The old address of the PriceOracle + * @param newAddress The new address of the PriceOracle + */ + event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL manager is updated. + * @param oldAddress The old address of the ACLManager + * @param newAddress The new address of the ACLManager + */ + event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the ACL admin is updated. + * @param oldAddress The old address of the ACLAdmin + * @param newAddress The new address of the ACLAdmin + */ + event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the price oracle sentinel is updated. + * @param oldAddress The old address of the PriceOracleSentinel + * @param newAddress The new address of the PriceOracleSentinel + */ + event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the pool data provider is updated. + * @param oldAddress The old address of the PoolDataProvider + * @param newAddress The new address of the PoolDataProvider + */ + event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when a new proxy is created. + * @param id The identifier of the proxy + * @param proxyAddress The address of the created proxy contract + * @param implementationAddress The address of the implementation contract + */ + event ProxyCreated( + bytes32 indexed id, + address indexed proxyAddress, + address indexed implementationAddress + ); + + /** + * @dev Emitted when a new non-proxied contract address is registered. + * @param id The identifier of the contract + * @param oldAddress The address of the old contract + * @param newAddress The address of the new contract + */ + event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); + + /** + * @dev Emitted when the implementation of the proxy registered with id is updated + * @param id The identifier of the contract + * @param proxyAddress The address of the proxy contract + * @param oldImplementationAddress The address of the old implementation contract + * @param newImplementationAddress The address of the new implementation contract + */ + event AddressSetAsProxy( + bytes32 indexed id, + address indexed proxyAddress, + address oldImplementationAddress, + address indexed newImplementationAddress + ); + + /** + * @notice Returns the id of the Aave market to which this contract points to. + * @return The market id + */ + function getMarketId() external view returns (string memory); + + /** + * @notice Associates an id with a specific PoolAddressesProvider. + * @dev This can be used to create an onchain registry of PoolAddressesProviders to + * identify and validate multiple Aave markets. + * @param newMarketId The market id + */ + function setMarketId(string calldata newMarketId) external; + + /** + * @notice Returns an address by its identifier. + * @dev The returned address might be an EOA or a contract, potentially proxied + * @dev It returns ZERO if there is no registered address with the given id + * @param id The id + * @return The address of the registered for the specified id + */ + function getAddress(bytes32 id) external view returns (address); + + /** + * @notice General function to update the implementation of a proxy registered with + * certain `id`. If there is no proxy registered, it will instantiate one and + * set as implementation the `newImplementationAddress`. + * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit + * setter function, in order to avoid unexpected consequences + * @param id The id + * @param newImplementationAddress The address of the new implementation + */ + function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; + + /** + * @notice Sets an address for an id replacing the address saved in the addresses map. + * @dev IMPORTANT Use this function carefully, as it will do a hard replacement + * @param id The id + * @param newAddress The address to set + */ + function setAddress(bytes32 id, address newAddress) external; + + /** + * @notice Returns the address of the Pool proxy. + * @return The Pool proxy address + */ + function getPool() external view returns (address); + + /** + * @notice Updates the implementation of the Pool, or creates a proxy + * setting the new `pool` implementation when the function is called for the first time. + * @param newPoolImpl The new Pool implementation + */ + function setPoolImpl(address newPoolImpl) external; + + /** + * @notice Returns the address of the PoolConfigurator proxy. + * @return The PoolConfigurator proxy address + */ + function getPoolConfigurator() external view returns (address); + + /** + * @notice Updates the implementation of the PoolConfigurator, or creates a proxy + * setting the new `PoolConfigurator` implementation when the function is called for the first time. + * @param newPoolConfiguratorImpl The new PoolConfigurator implementation + */ + function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; + + /** + * @notice Returns the address of the price oracle. + * @return The address of the PriceOracle + */ + function getPriceOracle() external view returns (address); + + /** + * @notice Updates the address of the price oracle. + * @param newPriceOracle The address of the new PriceOracle + */ + function setPriceOracle(address newPriceOracle) external; + + /** + * @notice Returns the address of the ACL manager. + * @return The address of the ACLManager + */ + function getACLManager() external view returns (address); + + /** + * @notice Updates the address of the ACL manager. + * @param newAclManager The address of the new ACLManager + */ + function setACLManager(address newAclManager) external; + + /** + * @notice Returns the address of the ACL admin. + * @return The address of the ACL admin + */ + function getACLAdmin() external view returns (address); + + /** + * @notice Updates the address of the ACL admin. + * @param newAclAdmin The address of the new ACL admin + */ + function setACLAdmin(address newAclAdmin) external; + + /** + * @notice Returns the address of the price oracle sentinel. + * @return The address of the PriceOracleSentinel + */ + function getPriceOracleSentinel() external view returns (address); + + /** + * @notice Updates the address of the price oracle sentinel. + * @param newPriceOracleSentinel The address of the new PriceOracleSentinel + */ + function setPriceOracleSentinel(address newPriceOracleSentinel) external; + + /** + * @notice Returns the address of the data provider. + * @return The address of the DataProvider + */ + function getPoolDataProvider() external view returns (address); + + /** + * @notice Updates the address of the data provider. + * @param newDataProvider The address of the new DataProvider + */ + function setPoolDataProvider(address newDataProvider) external; +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IScaledBalanceToken.sol new file mode 100644 index 00000000..006fbb41 --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IScaledBalanceToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IScaledBalanceToken + * @author Aave + * @notice Defines the basic interface for a scaled-balance token. + */ +interface IScaledBalanceToken { + /** + * @dev Emitted after the mint action + * @param caller The address performing the mint + * @param onBehalfOf The address of the user that will receive the minted tokens + * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' + * @param index The next liquidity index of the reserve + */ + event Mint( + address indexed caller, + address indexed onBehalfOf, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @dev Emitted after the burn action + * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address + * @param from The address from which the tokens will be burned + * @param target The address that will receive the underlying, if any + * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) + * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' + * @param index The next liquidity index of the reserve + */ + event Burn( + address indexed from, + address indexed target, + uint256 value, + uint256 balanceIncrease, + uint256 index + ); + + /** + * @notice Returns the scaled balance of the user. + * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index + * at the moment of the update + * @param user The user whose balance is calculated + * @return The scaled balance of the user + */ + function scaledBalanceOf(address user) external view returns (uint256); + + /** + * @notice Returns the scaled balance of the user and the scaled total supply. + * @param user The address of the user + * @return The scaled balance of the user + * @return The scaled total supply + */ + function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); + + /** + * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) + * @return The scaled total supply + */ + function scaledTotalSupply() external view returns (uint256); + + /** + * @notice Returns last index interest was accrued to the user's balance + * @param user The address of the user + * @return The last index interest was accrued to the user's balance, expressed in ray + */ + function getPreviousIndex(address user) external view returns (uint256); +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol new file mode 100644 index 00000000..2008acb6 --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the reserve configuration + */ +library ReserveConfiguration { + uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled + uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore + + /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed + uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; + uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; + uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; + uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; + uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; + uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; + uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; + uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; + uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; + uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; + uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; + uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; + uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; + //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory + uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; + uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; + uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; + + uint256 internal constant MAX_VALID_LTV = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; + uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; + uint256 internal constant MAX_VALID_DECIMALS = 255; + uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; + uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; + uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; + uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; + uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; + uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; + + uint256 public constant DEBT_CEILING_DECIMALS = 2; + uint16 public constant MAX_RESERVES_COUNT = 128; + + /** + * @notice Sets the Loan to Value of the reserve + * @param self The reserve configuration + * @param ltv The new ltv + */ + function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { + require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); + + self.data = (self.data & LTV_MASK) | ltv; + } + + /** + * @notice Gets the Loan to Value of the reserve + * @param self The reserve configuration + * @return The loan to value + */ + function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { + return self.data & ~LTV_MASK; + } + + /** + * @notice Sets the liquidation threshold of the reserve + * @param self The reserve configuration + * @param threshold The new liquidation threshold + */ + function setLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self, + uint256 threshold + ) internal pure { + require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); + + self.data = + (self.data & LIQUIDATION_THRESHOLD_MASK) | + (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation threshold of the reserve + * @param self The reserve configuration + * @return The liquidation threshold + */ + function getLiquidationThreshold( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation bonus of the reserve + * @param self The reserve configuration + * @param bonus The new liquidation bonus + */ + function setLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self, + uint256 bonus + ) internal pure { + require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); + + self.data = + (self.data & LIQUIDATION_BONUS_MASK) | + (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); + } + + /** + * @notice Gets the liquidation bonus of the reserve + * @param self The reserve configuration + * @return The liquidation bonus + */ + function getLiquidationBonus( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + } + + /** + * @notice Sets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @param decimals The decimals + */ + function setDecimals( + DataTypes.ReserveConfigurationMap memory self, + uint256 decimals + ) internal pure { + require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); + + self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + } + + /** + * @notice Gets the decimals of the underlying asset of the reserve + * @param self The reserve configuration + * @return The decimals of the asset + */ + function getDecimals( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + } + + /** + * @notice Sets the active state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { + self.data = + (self.data & ACTIVE_MASK) | + (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); + } + + /** + * @notice Gets the active state of the reserve + * @param self The reserve configuration + * @return The active state + */ + function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~ACTIVE_MASK) != 0; + } + + /** + * @notice Sets the frozen state of the reserve + * @param self The reserve configuration + * @param frozen The frozen state + */ + function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { + self.data = + (self.data & FROZEN_MASK) | + (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); + } + + /** + * @notice Gets the frozen state of the reserve + * @param self The reserve configuration + * @return The frozen state + */ + function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~FROZEN_MASK) != 0; + } + + /** + * @notice Sets the paused state of the reserve + * @param self The reserve configuration + * @param paused The paused state + */ + function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { + self.data = + (self.data & PAUSED_MASK) | + (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); + } + + /** + * @notice Gets the paused state of the reserve + * @param self The reserve configuration + * @return The paused state + */ + function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { + return (self.data & ~PAUSED_MASK) != 0; + } + + /** + * @notice Sets the borrowable in isolation flag for the reserve. + * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed + * amount will be accumulated in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @param borrowable True if the asset is borrowable + */ + function setBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self, + bool borrowable + ) internal pure { + self.data = + (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowable in isolation flag for the reserve. + * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with + * isolated collateral is accounted for in the isolated collateral's total debt exposure. + * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep + * consistency in the debt ceiling calculations. + * @param self The reserve configuration + * @return The borrowable in isolation flag + */ + function getBorrowableInIsolation( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + } + + /** + * @notice Sets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @param siloed True if the asset is siloed + */ + function setSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self, + bool siloed + ) internal pure { + self.data = + (self.data & SILOED_BORROWING_MASK) | + (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); + } + + /** + * @notice Gets the siloed borrowing flag for the reserve. + * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. + * @param self The reserve configuration + * @return The siloed borrowing flag + */ + function getSiloedBorrowing( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~SILOED_BORROWING_MASK) != 0; + } + + /** + * @notice Enables or disables borrowing on the reserve + * @param self The reserve configuration + * @param enabled True if the borrowing needs to be enabled, false otherwise + */ + function setBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool enabled + ) internal pure { + self.data = + (self.data & BORROWING_MASK) | + (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the borrowing state of the reserve + * @param self The reserve configuration + * @return The borrowing state + */ + function getBorrowingEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~BORROWING_MASK) != 0; + } + + /** + * @notice Sets the reserve factor of the reserve + * @param self The reserve configuration + * @param reserveFactor The reserve factor + */ + function setReserveFactor( + DataTypes.ReserveConfigurationMap memory self, + uint256 reserveFactor + ) internal pure { + require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); + + self.data = + (self.data & RESERVE_FACTOR_MASK) | + (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); + } + + /** + * @notice Gets the reserve factor of the reserve + * @param self The reserve configuration + * @return The reserve factor + */ + function getReserveFactor( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + } + + /** + * @notice Sets the borrow cap of the reserve + * @param self The reserve configuration + * @param borrowCap The borrow cap + */ + function setBorrowCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 borrowCap + ) internal pure { + require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); + + self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the borrow cap of the reserve + * @param self The reserve configuration + * @return The borrow cap + */ + function getBorrowCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the supply cap of the reserve + * @param self The reserve configuration + * @param supplyCap The supply cap + */ + function setSupplyCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 supplyCap + ) internal pure { + require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); + + self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); + } + + /** + * @notice Gets the supply cap of the reserve + * @param self The reserve configuration + * @return The supply cap + */ + function getSupplyCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the debt ceiling in isolation mode for the asset + * @param self The reserve configuration + * @param ceiling The maximum debt ceiling for the asset + */ + function setDebtCeiling( + DataTypes.ReserveConfigurationMap memory self, + uint256 ceiling + ) internal pure { + require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); + + self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); + } + + /** + * @notice Gets the debt ceiling for the asset if the asset is in isolation mode + * @param self The reserve configuration + * @return The debt ceiling (0 = isolation mode disabled) + */ + function getDebtCeiling( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + } + + /** + * @notice Sets the liquidation protocol fee of the reserve + * @param self The reserve configuration + * @param liquidationProtocolFee The liquidation protocol fee + */ + function setLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self, + uint256 liquidationProtocolFee + ) internal pure { + require( + liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, + Errors.INVALID_LIQUIDATION_PROTOCOL_FEE + ); + + self.data = + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); + } + + /** + * @dev Gets the liquidation protocol fee + * @param self The reserve configuration + * @return The liquidation protocol fee + */ + function getLiquidationProtocolFee( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + } + + /** + * @notice Sets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @param unbackedMintCap The unbacked mint cap + */ + function setUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self, + uint256 unbackedMintCap + ) internal pure { + require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); + + self.data = + (self.data & UNBACKED_MINT_CAP_MASK) | + (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); + } + + /** + * @dev Gets the unbacked mint cap of the reserve + * @param self The reserve configuration + * @return The unbacked mint cap + */ + function getUnbackedMintCap( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256) { + return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + } + + /** + * @notice Sets the flashloanable flag for the reserve + * @param self The reserve configuration + * @param flashLoanEnabled True if the asset is flashloanable, false otherwise + */ + function setFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self, + bool flashLoanEnabled + ) internal pure { + self.data = + (self.data & FLASHLOAN_ENABLED_MASK) | + (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); + } + + /** + * @notice Gets the flashloanable flag for the reserve + * @param self The reserve configuration + * @return The flashloanable flag + */ + function getFlashLoanEnabled( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + } + + /** + * @notice Sets the virtual account active/not state of the reserve + * @param self The reserve configuration + * @param active The active state + */ + function setVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self, + bool active + ) internal pure { + self.data = + (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); + } + + /** + * @notice Gets the virtual account active/not state of the reserve + * @dev The state should be true for all normal assets and should be false + * only in special cases (ex. GHO) where an asset is minted instead of supplied. + * @param self The reserve configuration + * @return The active state + */ + function getIsVirtualAccActive( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool) { + return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + } + + /** + * @notice Gets the configuration flags of the reserve + * @param self The reserve configuration + * @return The state flag representing active + * @return The state flag representing frozen + * @return The state flag representing borrowing enabled + * @return The state flag representing paused + */ + function getFlags( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (bool, bool, bool, bool) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~ACTIVE_MASK) != 0, + (dataLocal & ~FROZEN_MASK) != 0, + (dataLocal & ~BORROWING_MASK) != 0, + (dataLocal & ~PAUSED_MASK) != 0 + ); + } + + /** + * @notice Gets the configuration parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing ltv + * @return The state param representing liquidation threshold + * @return The state param representing liquidation bonus + * @return The state param representing reserve decimals + * @return The state param representing reserve factor + */ + function getParams( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + dataLocal & ~LTV_MASK, + (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, + (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, + (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, + (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION + ); + } + + /** + * @notice Gets the caps parameters of the reserve from storage + * @param self The reserve configuration + * @return The state param representing borrow cap + * @return The state param representing supply cap. + */ + function getCaps( + DataTypes.ReserveConfigurationMap memory self + ) internal pure returns (uint256, uint256) { + uint256 dataLocal = self.data; + + return ( + (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + ); + } +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol new file mode 100644 index 00000000..c66ca6d1 --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Errors} from '../helpers/Errors.sol'; +import {DataTypes} from '../types/DataTypes.sol'; +import {ReserveConfiguration} from './ReserveConfiguration.sol'; + +/** + * @title UserConfiguration library + * @author Aave + * @notice Implements the bitmap logic to handle the user configuration + */ +library UserConfiguration { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + uint256 internal constant BORROWING_MASK = + 0x5555555555555555555555555555555555555555555555555555555555555555; + uint256 internal constant COLLATERAL_MASK = + 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; + + /** + * @notice Sets if the user is borrowing the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param borrowing True if the user is borrowing the reserve, false otherwise + */ + function setBorrowing( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool borrowing + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << (reserveIndex << 1); + if (borrowing) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Sets if the user is using as collateral the reserve identified by reserveIndex + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise + */ + function setUsingAsCollateral( + DataTypes.UserConfigurationMap storage self, + uint256 reserveIndex, + bool usingAsCollateral + ) internal { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + uint256 bit = 1 << ((reserveIndex << 1) + 1); + if (usingAsCollateral) { + self.data |= bit; + } else { + self.data &= ~bit; + } + } + } + + /** + * @notice Returns if a user has been using the reserve for borrowing or as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise + */ + function isUsingAsCollateralOrBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 3 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve for borrowing + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve for borrowing, false otherwise + */ + function isBorrowing( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> (reserveIndex << 1)) & 1 != 0; + } + } + + /** + * @notice Validate a user has been using the reserve as collateral + * @param self The configuration object + * @param reserveIndex The index of the reserve in the bitmap + * @return True if the user has been using a reserve as collateral, false otherwise + */ + function isUsingAsCollateral( + DataTypes.UserConfigurationMap memory self, + uint256 reserveIndex + ) internal pure returns (bool) { + unchecked { + require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); + return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; + } + } + + /** + * @notice Checks if a user has been supplying only one reserve as collateral + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isUsingAsCollateralOne( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + uint256 collateralData = self.data & COLLATERAL_MASK; + return collateralData != 0 && (collateralData & (collateralData - 1) == 0); + } + + /** + * @notice Checks if a user has been supplying any reserve as collateral + * @param self The configuration object + * @return True if the user has been supplying as collateral any reserve, false otherwise + */ + function isUsingAsCollateralAny( + DataTypes.UserConfigurationMap memory self + ) internal pure returns (bool) { + return self.data & COLLATERAL_MASK != 0; + } + + /** + * @notice Checks if a user has been borrowing only one asset + * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 + * @param self The configuration object + * @return True if the user has been supplying as collateral one reserve, false otherwise + */ + function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + uint256 borrowingData = self.data & BORROWING_MASK; + return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); + } + + /** + * @notice Checks if a user has been borrowing from any reserve + * @param self The configuration object + * @return True if the user has been borrowing any reserve, false otherwise + */ + function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data & BORROWING_MASK != 0; + } + + /** + * @notice Checks if a user has not been using any reserve for borrowing or supply + * @param self The configuration object + * @return True if the user has not been borrowing or supplying any reserve, false otherwise + */ + function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { + return self.data == 0; + } + + /** + * @notice Returns the Isolation Mode state of the user + * @param self The configuration object + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @return True if the user is in isolation mode, false otherwise + * @return The address of the only asset used as collateral + * @return The debt ceiling of the reserve + */ + function getIsolationModeState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address, uint256) { + if (isUsingAsCollateralOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); + + address assetAddress = reservesList[assetId]; + uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); + if (ceiling != 0) { + return (true, assetAddress, ceiling); + } + } + return (false, address(0), 0); + } + + /** + * @notice Returns the siloed borrowing state for the user + * @param self The configuration object + * @param reservesData The data of all the reserves + * @param reservesList The reserve list + * @return True if the user has borrowed a siloed asset, false otherwise + * @return The address of the only borrowed asset + */ + function getSiloedBorrowingState( + DataTypes.UserConfigurationMap memory self, + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList + ) internal view returns (bool, address) { + if (isBorrowingOne(self)) { + uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); + address assetAddress = reservesList[assetId]; + if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { + return (true, assetAddress); + } + } + + return (false, address(0)); + } + + /** + * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask + * @param self The configuration object + * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied + */ + function _getFirstAssetIdByMask( + DataTypes.UserConfigurationMap memory self, + uint256 mask + ) internal pure returns (uint256) { + unchecked { + uint256 bitmapData = self.data & mask; + uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); + uint256 id; + + while ((firstAssetPosition >>= 2) != 0) { + id += 1; + } + return id; + } + } +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/helpers/Errors.sol new file mode 100644 index 00000000..d3f564cb --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/helpers/Errors.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Errors library + * @author Aave + * @notice Defines the error messages emitted by the different contracts of the Aave protocol + */ +library Errors { + string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' + string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' + string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' + string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' + string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' + string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' + string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' + string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' + string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' + string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' + string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' + string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' + string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' + string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' + string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' + string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' + string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' + string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' + string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' + string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' + string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' + string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' + string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' + string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' + string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' + string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' + string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' + string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' + string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' + string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' + string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' + string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' + string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' + string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' + string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' + string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' + string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' + string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' + string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' + string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' + string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' + string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' + string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' + string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' + string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' + string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' + string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' + string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' + string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' + string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' + string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' + string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' + string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' + string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' + string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' + string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' + string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' + string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' + string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' + string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' + string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' + string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' + string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' + string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' + string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' + string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' + string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' + string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve + string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' + string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' + string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' + string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' + string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' + string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' + string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' + string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' + string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' + string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' + string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' + string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' + string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' + string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' + string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 + string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled + string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid + string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed + string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed + string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 + string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' + string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' + string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range + string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state + string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode +} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/types/DataTypes.sol new file mode 100644 index 00000000..13c12c99 --- /dev/null +++ b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/types/DataTypes.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library DataTypes { + /** + * This exists specifically to maintain the `getReserveData()` interface, since the new, internal + * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. + */ + struct ReserveDataLegacy { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + // DEPRECATED on v3.2.0 + uint128 __deprecatedStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed + uint40 liquidationGracePeriodUntil; + //aToken address + address aTokenAddress; + // DEPRECATED on v3.2.0 + address __deprecatedStableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + //the amount of underlying accounted for by the protocol + uint128 virtualUnderlyingBalance; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: DEPRECATED: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167: liquidation protocol fee + //bit 168-175: DEPRECATED: eMode category + //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252: virtual accounting is enabled for the reserve + //bit 253-255 unused + + uint256 data; + } + + struct UserConfigurationMap { + /** + * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. + * The first bit indicates if an asset is used as collateral by the user, the second whether an + * asset is borrowed by the user. + */ + uint256 data; + } + + // DEPRECATED: kept for backwards compatibility, might be removed in a future version + struct EModeCategoryLegacy { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + // DEPRECATED + address priceSource; + string label; + } + + struct CollateralConfig { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + } + + struct EModeCategoryBaseConfiguration { + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + string label; + } + + struct EModeCategory { + // each eMode category has a custom ltv and liquidation threshold + uint16 ltv; + uint16 liquidationThreshold; + uint16 liquidationBonus; + uint128 collateralBitmap; + string label; + uint128 borrowableBitmap; + } + + enum InterestRateMode { + NONE, + __DEPRECATED, + VARIABLE + } + + struct ReserveCache { + uint256 currScaledVariableDebt; + uint256 nextScaledVariableDebt; + uint256 currLiquidityIndex; + uint256 nextLiquidityIndex; + uint256 currVariableBorrowIndex; + uint256 nextVariableBorrowIndex; + uint256 currLiquidityRate; + uint256 currVariableBorrowRate; + uint256 reserveFactor; + ReserveConfigurationMap reserveConfiguration; + address aTokenAddress; + address variableDebtTokenAddress; + uint40 reserveLastUpdateTimestamp; + } + + struct ExecuteLiquidationCallParams { + uint256 reservesCount; + uint256 debtToCover; + address collateralAsset; + address debtAsset; + address user; + bool receiveAToken; + address priceOracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteSupplyParams { + address asset; + uint256 amount; + address onBehalfOf; + uint16 referralCode; + } + + struct ExecuteBorrowParams { + address asset; + address user; + address onBehalfOf; + uint256 amount; + InterestRateMode interestRateMode; + uint16 referralCode; + bool releaseUnderlying; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + } + + struct ExecuteRepayParams { + address asset; + uint256 amount; + InterestRateMode interestRateMode; + address onBehalfOf; + bool useATokens; + } + + struct ExecuteWithdrawParams { + address asset; + uint256 amount; + address to; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + } + + struct ExecuteSetUserEModeParams { + uint256 reservesCount; + address oracle; + uint8 categoryId; + } + + struct FinalizeTransferParams { + address asset; + address from; + address to; + uint256 amount; + uint256 balanceFromBefore; + uint256 balanceToBefore; + uint256 reservesCount; + address oracle; + uint8 fromEModeCategory; + } + + struct FlashloanParams { + address receiverAddress; + address[] assets; + uint256[] amounts; + uint256[] interestRateModes; + address onBehalfOf; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + uint256 reservesCount; + address addressesProvider; + address pool; + uint8 userEModeCategory; + bool isAuthorizedFlashBorrower; + } + + struct FlashloanSimpleParams { + address receiverAddress; + address asset; + uint256 amount; + bytes params; + uint16 referralCode; + uint256 flashLoanPremiumToProtocol; + uint256 flashLoanPremiumTotal; + } + + struct FlashLoanRepaymentParams { + uint256 amount; + uint256 totalPremium; + uint256 flashLoanPremiumToProtocol; + address asset; + address receiverAddress; + uint16 referralCode; + } + + struct CalculateUserAccountDataParams { + UserConfigurationMap userConfig; + uint256 reservesCount; + address user; + address oracle; + uint8 userEModeCategory; + } + + struct ValidateBorrowParams { + ReserveCache reserveCache; + UserConfigurationMap userConfig; + address asset; + address userAddress; + uint256 amount; + InterestRateMode interestRateMode; + uint256 reservesCount; + address oracle; + uint8 userEModeCategory; + address priceOracleSentinel; + bool isolationModeActive; + address isolationModeCollateralAddress; + uint256 isolationModeDebtCeiling; + } + + struct ValidateLiquidationCallParams { + ReserveCache debtReserveCache; + uint256 totalDebt; + uint256 healthFactor; + address priceOracleSentinel; + } + + struct CalculateInterestRatesParams { + uint256 unbacked; + uint256 liquidityAdded; + uint256 liquidityTaken; + uint256 totalDebt; + uint256 reserveFactor; + address reserve; + bool usingVirtualBalance; + uint256 virtualUnderlyingBalance; + } + + struct InitReserveParams { + address asset; + address aTokenAddress; + address variableDebtAddress; + address interestRateStrategyAddress; + uint16 reservesCount; + uint16 maxNumberReserves; + } +} diff --git a/package-lock.json b/package-lock.json index 55d45dea..6d78d1dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,17 @@ "version": "1.0.0", "license": "BUSL1.1", "dependencies": { + "@bgd-labs/aave-address-book": "4.7.1-55059af528eaf322fca91f3b0c59ce8c94019549.0", "@bgd-labs/aave-cli": "^1.1.12", - "catapulta-verify": "^1.2.1" + "catapulta-verify": "^1.1.1", + "ts-command-line-args": "^2.5.0", + "ts-node": "^10.9.1" }, "devDependencies": { + "@types/bluebird": "^3.5.38", + "@types/node-fetch": "^2.6.3", + "bluebird": "^3.7.2", + "ethers": "^6.6.2", "prettier": "^2.8.3", "prettier-plugin-solidity": "^1.1.1" } @@ -27,9 +34,9 @@ "license": "Apache-2.0" }, "node_modules/@bgd-labs/aave-address-book": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@bgd-labs/aave-address-book/-/aave-address-book-4.5.1.tgz", - "integrity": "sha512-ttmk5qPrrZfEYY4vZ+UO/V7lYU5934ONN9kJmU44lCpB+fhVagmDLrBgLq44etQeaHZXHKggOHRA8mts4eN4Ug==" + "version": "4.7.1-55059af528eaf322fca91f3b0c59ce8c94019549.0", + "resolved": "https://registry.npmjs.org/@bgd-labs/aave-address-book/-/aave-address-book-4.7.1-55059af528eaf322fca91f3b0c59ce8c94019549.0.tgz", + "integrity": "sha512-FCQVKBtlPD8HtGBkylmgpUgQS/vBXa08NUKZ3zMRk4IHD+3kh2XyGV0Ct7B4Kf+wwMPyNj3mxdKqIFHajnCUwQ==" }, "node_modules/@bgd-labs/aave-cli": { "version": "1.1.12", @@ -58,7 +65,12 @@ "aave-cli": "dist/cli.js" } }, - "node_modules/@bgd-labs/aave-v3-governance-cache": { + "node_modules/@bgd-labs/aave-cli/node_modules/@bgd-labs/aave-address-book": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/@bgd-labs/aave-address-book/-/aave-address-book-4.7.1.tgz", + "integrity": "sha512-MGJb+QfQPK5YtNXlc82D+0g1BPfYCKfUQ8UGw7EJgVgHV3atCsp1V94q06fW6n4t59D9rcCHcvlUGrKhMx/aDw==" + }, + "node_modules/@bgd-labs/aave-cli/node_modules/@bgd-labs/aave-v3-governance-cache": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@bgd-labs/aave-v3-governance-cache/-/aave-v3-governance-cache-1.0.8.tgz", "integrity": "sha512-niaJafgxLQcuzZ13Wo1rO5tJ8f5pE5AdWs+5/PoHMrk5Z+bm5kE59oHbIO2xpg1pCQ7IZmsxXEIIlC2c0+v/Jg==", @@ -113,6 +125,17 @@ "commander": "~12.1.0" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.23.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", @@ -707,6 +730,28 @@ "npm": ">=7.0.0" } }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", @@ -847,6 +892,32 @@ "node": ">=8" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@types/bluebird": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.42.tgz", + "integrity": "sha512-Jhy+MWRlro6UjVi578V/4ZGNfeCOcNCp0YaFNIUGFKlImowqwb1O/22wDVk3FDGMLqxdpOV3qQHD5fPEH4hK6A==", + "dev": true + }, "node_modules/@types/dns-packet": { "version": "5.6.5", "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", @@ -863,6 +934,16 @@ "undici-types": "~6.19.8" } }, + "node_modules/@types/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, "node_modules/abitype": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.6.tgz", @@ -883,6 +964,34 @@ } } }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "dev": true + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -919,6 +1028,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -927,6 +1041,20 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "node_modules/base-x": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", @@ -981,6 +1109,12 @@ "multiformats": "^13.2.3" } }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, "node_modules/bs58": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", @@ -1066,6 +1200,118 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "dependencies": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/command-line-usage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/command-line-usage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/command-line-usage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "engines": { + "node": ">=8" + } + }, "node_modules/commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", @@ -1074,6 +1320,11 @@ "node": ">=18" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, "node_modules/debug": { "version": "4.3.4", "license": "MIT", @@ -1089,6 +1340,14 @@ } } }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deepmerge": { "version": "4.3.1", "license": "MIT", @@ -1096,6 +1355,23 @@ "node": ">=0.10.0" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -1160,6 +1436,14 @@ "@esbuild/win32-x64": "0.23.1" } }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -1172,6 +1456,94 @@ "node": ">=4" } }, + "node_modules/ethers": { + "version": "6.13.4", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.4.tgz", + "integrity": "sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "dev": true + }, + "node_modules/ethers/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethers/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "dev": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/ethers/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", @@ -1205,6 +1577,31 @@ "version": "1.1.0", "license": "GPL-3.0-or-later" }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1462,6 +1859,11 @@ "node": ">=0.10.0" } }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, "node_modules/lru-cache": { "version": "6.0.0", "dev": true, @@ -1473,6 +1875,32 @@ "node": ">=10" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimist": { "version": "1.2.8", "license": "MIT", @@ -1664,6 +2092,14 @@ "node": ">= 6" } }, + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "engines": { + "node": ">=6" + } + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -1753,6 +2189,11 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -1796,6 +2237,36 @@ "node": ">=8" } }, + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "dependencies": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "engines": { + "node": ">=8" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -1811,6 +2282,68 @@ "version": "0.0.3", "license": "MIT" }, + "node_modules/ts-command-line-args": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", + "dependencies": { + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" + }, + "bin": { + "write-markdown": "dist/write-markdown.js" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true + }, "node_modules/tsx": { "version": "4.19.2", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", @@ -1843,7 +2376,6 @@ "node_modules/typescript": { "version": "5.4.4", "license": "Apache-2.0", - "optional": true, "peer": true, "bin": { "tsc": "bin/tsc", @@ -1853,6 +2385,14 @@ "node": ">=14.17" } }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "engines": { + "node": ">=8" + } + }, "node_modules/uint8-varint": { "version": "2.0.4", "license": "Apache-2.0 OR MIT", @@ -1884,6 +2424,11 @@ "version": "1.0.2", "license": "MIT" }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, "node_modules/viem": { "version": "2.21.48", "resolved": "https://registry.npmjs.org/viem/-/viem-2.21.48.tgz", @@ -1969,6 +2514,26 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -2007,6 +2572,14 @@ "dev": true, "license": "ISC" }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/yoctocolors-cjs": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", diff --git a/package.json b/package.json index 0252e056..e84f0a8d 100644 --- a/package.json +++ b/package.json @@ -19,10 +19,17 @@ "type": "module", "devDependencies": { "prettier": "^2.8.3", - "prettier-plugin-solidity": "^1.1.1" + "prettier-plugin-solidity": "^1.1.1", + "@types/bluebird": "^3.5.38", + "@types/node-fetch": "^2.6.3", + "bluebird": "^3.7.2", + "ethers": "^6.6.2" }, "dependencies": { + "@bgd-labs/aave-address-book": "4.7.1-55059af528eaf322fca91f3b0c59ce8c94019549.0", "@bgd-labs/aave-cli": "^1.1.12", - "catapulta-verify": "^1.2.1" + "catapulta-verify": "^1.1.1", + "ts-command-line-args": "^2.5.0", + "ts-node": "^10.9.1" } } From 88d9fbe388e4ea96b98e49c83cf3911001073bc7 Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Fri, 17 Jan 2025 16:30:14 +0530 Subject: [PATCH 2/4] chore: cleanup diffs --- .../AAVE_PROTOCOL_DATA_PROVIDER_DIFF.md | 161 +- diffs/ARBITRUM_LINEA/ACL_MANAGER_DIFF.md | 239 +-- diffs/ARBITRUM_LINEA/BORROW_LOGIC_DIFF.md | 332 +-- diffs/ARBITRUM_LINEA/BRIDGE_LOGIC_DIFF.md | 323 +-- diffs/ARBITRUM_LINEA/COLLECTOR_IMPL_DIFF.md | 600 +----- .../ARBITRUM_LINEA/CONFIGURATOR_LOGIC_DIFF.md | 887 +------- .../DEFAULT_A_TOKEN_IMPL_DIFF.md | 830 +------- ...DEFAULT_INCENTIVES_CONTROLLER_IMPL_DIFF.md | 223 +- .../DEFAULT_VARIABLE_DEBT_TOKEN_IMPL_DIFF.md | 842 +------- diffs/ARBITRUM_LINEA/EMISSION_MANAGER_DIFF.md | 114 +- diffs/ARBITRUM_LINEA/EMODE_LOGIC_DIFF.md | 314 +-- diffs/ARBITRUM_LINEA/FLASHLOAN_LOGIC_DIFF.md | 359 +--- diffs/ARBITRUM_LINEA/L2_ENCODER_DIFF.md | 1048 +--------- diffs/ARBITRUM_LINEA/L2_POOL_IMPL_DIFF.md | 446 +--- .../ARBITRUM_LINEA/LIQUIDATION_LOGIC_DIFF.md | 332 +-- diffs/ARBITRUM_LINEA/ORACLE_DIFF.md | 238 +-- .../POOL_ADDRESSES_PROVIDER_DIFF.md | 347 +--- .../POOL_ADDRESSES_PROVIDER_REGISTRY_DIFF.md | 132 +- .../POOL_CONFIGURATOR_IMPL_DIFF.md | 253 +-- diffs/ARBITRUM_LINEA/POOL_LOGIC_DIFF.md | 323 +-- diffs/ARBITRUM_LINEA/SUPPLY_LOGIC_DIFF.md | 323 +-- .../UI_INCENTIVE_DATA_PROVIDER_DIFF.md | 190 +- .../UI_POOL_DATA_PROVIDER_DIFF.md | 226 +- .../WALLET_BALANCE_PROVIDER_DIFF.md | 1814 +---------------- diffs/ARBITRUM_LINEA/WETH_GATEWAY_DIFF.md | 154 +- 25 files changed, 96 insertions(+), 10954 deletions(-) diff --git a/diffs/ARBITRUM_LINEA/AAVE_PROTOCOL_DATA_PROVIDER_DIFF.md b/diffs/ARBITRUM_LINEA/AAVE_PROTOCOL_DATA_PROVIDER_DIFF.md index bda958fa..912418ef 100644 --- a/diffs/ARBITRUM_LINEA/AAVE_PROTOCOL_DATA_PROVIDER_DIFF.md +++ b/diffs/ARBITRUM_LINEA/AAVE_PROTOCOL_DATA_PROVIDER_DIFF.md @@ -3,164 +3,5 @@ diff --git a/./downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER.sol b/./downloads/ index 8142191..9b34753 100644 --- a/./downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER.sol +++ b/./downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: MIT - pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -77,7 +77,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol -+// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IAaveIncentivesController.sol - - /** - * @title IAaveIncentivesController -@@ -96,7 +96,7 @@ interface IAaveIncentivesController { - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - } - --// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider -@@ -323,7 +323,7 @@ interface IPoolAddressesProvider { - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol -+// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IScaledBalanceToken.sol - - /** - * @title IScaledBalanceToken -@@ -395,7 +395,7 @@ interface IScaledBalanceToken { - function getPreviousIndex(address user) external view returns (uint256); - } - --// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -498,7 +498,7 @@ library Errors { - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol -+// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/math/WadRayMath.sol - - /** - * @title WadRayMath library -@@ -624,7 +624,7 @@ library WadRayMath { - } - } - --// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { - /** -@@ -948,7 +948,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol -+// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - - interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); -@@ -958,7 +958,7 @@ interface IERC20Detailed is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol -+// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolDataProvider.sol - - /** - * @title IPoolDataProvider -@@ -1206,7 +1206,7 @@ interface IPoolDataProvider { - function getVirtualUnderlyingBalance(address asset) external view returns (uint256); - } - --// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol -+// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPool.sol - - /** - * @title IPool -@@ -1765,6 +1765,7 @@ interface IPool { - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 -+ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ -@@ -2036,7 +2037,7 @@ interface IPool { - function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol -+// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - - /** - * @title ReserveConfiguration library -@@ -2051,6 +2052,7 @@ library ReserveConfiguration { - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore -+ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore -@@ -2059,7 +2061,7 @@ library ReserveConfiguration { - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -- //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory -+ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -@@ -2616,7 +2618,7 @@ library ReserveConfiguration { - } - } - --// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol -+// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - - /** - * @title UserConfiguration library -@@ -2848,7 +2850,7 @@ library UserConfiguration { - } - } - --// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol -+// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IInitializableDebtToken.sol - - /** - * @title IInitializableDebtToken -@@ -2897,7 +2899,7 @@ interface IInitializableDebtToken { - ) external; - } - --// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol -+// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IVariableDebtToken.sol - - /** - * @title IVariableDebtToken -@@ -2940,7 +2942,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - } - --// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/AaveProtocolDataProvider.sol -+// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/helpers/AaveProtocolDataProvider.sol - - /** - * @title AaveProtocolDataProvider + ``` diff --git a/diffs/ARBITRUM_LINEA/ACL_MANAGER_DIFF.md b/diffs/ARBITRUM_LINEA/ACL_MANAGER_DIFF.md index 2318cd76..d527142e 100644 --- a/diffs/ARBITRUM_LINEA/ACL_MANAGER_DIFF.md +++ b/diffs/ARBITRUM_LINEA/ACL_MANAGER_DIFF.md @@ -3,242 +3,5 @@ diff --git a/./downloads/ARBITRUM/ACL_MANAGER.sol b/./downloads/LINEA/ACL_MANAGE index 9ff4476..c45f49c 100644 --- a/./downloads/ARBITRUM/ACL_MANAGER.sol +++ b/./downloads/LINEA/ACL_MANAGER.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 --pragma solidity =0.8.10; -+pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol -+// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol - - /* - * @dev Provides information about the current execution context, including the -@@ -24,7 +24,7 @@ abstract contract Context { - } - } - --// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol -+// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - - /** - * @dev External interface of AccessControl declared to support ERC165 detection. -@@ -114,7 +114,7 @@ interface IAccessControl { - function renounceRole(bytes32 role, address account) external; - } - --// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol -+// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IERC165.sol - - /** - * @dev Interface of the ERC165 standard, as defined in the -@@ -137,7 +137,7 @@ interface IERC165 { - function supportsInterface(bytes4 interfaceId) external view returns (bool); - } - --// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol -+// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Strings.sol - - /** - * @dev String operations. -@@ -202,13 +202,13 @@ library Strings { - } - } - --// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. -- **/ -+ */ - interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. -@@ -303,7 +303,7 @@ interface IPoolAddressesProvider { - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id -- **/ -+ */ - function getMarketId() external view returns (string memory); - - /** -@@ -345,27 +345,27 @@ interface IPoolAddressesProvider { - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address -- **/ -+ */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation -- **/ -+ */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address -- **/ -+ */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation -- **/ -+ */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** -@@ -389,7 +389,7 @@ interface IPoolAddressesProvider { - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager -- **/ -+ */ - function setACLManager(address newAclManager) external; - - /** -@@ -413,7 +413,7 @@ interface IPoolAddressesProvider { - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel -- **/ -+ */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** -@@ -425,11 +425,11 @@ interface IPoolAddressesProvider { - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider -- **/ -+ */ - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -467,38 +467,33 @@ library Errors { - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' -- string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' -- string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' -- string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' -- string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' -- string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' -- string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' -+ string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' -- string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' -+ string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' -@@ -520,16 +515,24 @@ library Errors { - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' -- string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' -- string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 -+ string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled -+ string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid -+ string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed -+ string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed -+ string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 -+ string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' -+ string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' -+ string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range -+ string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state -+ string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol -+// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/ERC165.sol - - /** - * @dev Implementation of the {IERC165} interface. -@@ -554,13 +557,13 @@ abstract contract ERC165 is IERC165 { - } - } - --// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IACLManager.sol -+// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IACLManager.sol - - /** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager -- **/ -+ */ - interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider -@@ -676,7 +679,7 @@ interface IACLManager { - function addFlashBorrower(address borrower) external; - - /** -- * @notice Removes an admin as FlashBorrower -+ * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; -@@ -727,7 +730,7 @@ interface IACLManager { - function isAssetListingAdmin(address admin) external view returns (bool); - } - --// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol -+// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/AccessControl.sol - - /** - * @dev Contract module that allows children to implement role-based access -@@ -937,7 +940,7 @@ abstract contract AccessControl is Context, IAccessControl, ERC165 { - } - } - --// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol -+// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/configuration/ACLManager.sol - - /** - * @title ACLManager + ``` diff --git a/diffs/ARBITRUM_LINEA/BORROW_LOGIC_DIFF.md b/diffs/ARBITRUM_LINEA/BORROW_LOGIC_DIFF.md index 9b70e3f0..cf366471 100644 --- a/diffs/ARBITRUM_LINEA/BORROW_LOGIC_DIFF.md +++ b/diffs/ARBITRUM_LINEA/BORROW_LOGIC_DIFF.md @@ -3,335 +3,5 @@ diff --git a/./downloads/ARBITRUM/BORROW_LOGIC.sol b/./downloads/LINEA/BORROW_LO index 58a8929..9ef522e 100644 --- a/./downloads/ARBITRUM/BORROW_LOGIC.sol +++ b/./downloads/LINEA/BORROW_LOGIC.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 - pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - - // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -@@ -221,7 +221,7 @@ library Address { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - - /* - * @dev Provides information about the current execution context, including the -@@ -244,7 +244,7 @@ abstract contract Context { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - - /** - * @dev External interface of AccessControl declared to support ERC165 detection. -@@ -334,7 +334,7 @@ interface IAccessControl { - function renounceRole(bytes32 role, address account) external; - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -410,7 +410,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - - // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -@@ -666,7 +666,7 @@ library SafeCast { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol - - /** - * @title IAaveIncentivesController -@@ -685,7 +685,7 @@ interface IAaveIncentivesController { - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider -@@ -912,7 +912,7 @@ interface IPoolAddressesProvider { - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol - - /** - * @title IPriceOracleGetter -@@ -942,7 +942,7 @@ interface IPriceOracleGetter { - function getAssetPrice(address asset) external view returns (uint256); - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol - - /** - * @title IScaledBalanceToken -@@ -1014,7 +1014,7 @@ interface IScaledBalanceToken { - function getPreviousIndex(address user) external view returns (uint256); - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -1117,7 +1117,7 @@ library Errors { - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - - /** - * @title PercentageMath library -@@ -1178,7 +1178,7 @@ library PercentageMath { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - - /** - * @title WadRayMath library -@@ -1304,7 +1304,7 @@ library WadRayMath { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { - /** -@@ -1628,7 +1628,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - - /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library - /// @author Gnosis Developers -@@ -1741,7 +1741,7 @@ library GPv2SafeERC20 { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - - interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); -@@ -1751,7 +1751,7 @@ interface IERC20Detailed is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol - - /** - * @title IACLManager -@@ -1924,7 +1924,7 @@ interface IACLManager { - function isAssetListingAdmin(address admin) external view returns (bool); - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - - /** - * @title IPriceOracleSentinel -@@ -1989,7 +1989,7 @@ interface IPriceOracleSentinel { - function getGracePeriod() external view returns (uint256); - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - - /** - * @title IReserveInterestRateStrategy -@@ -2016,7 +2016,7 @@ interface IReserveInterestRateStrategy { - ) external view returns (uint256, uint256); - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol - - /** - * @title MathUtils library -@@ -2113,7 +2113,7 @@ library MathUtils { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol - - /** - * @title IPool -@@ -2672,6 +2672,7 @@ interface IPool { - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 -+ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ -@@ -2943,7 +2944,7 @@ interface IPool { - function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - - /** - * @title ReserveConfiguration library -@@ -2958,6 +2959,7 @@ library ReserveConfiguration { - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore -+ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore -@@ -2966,7 +2968,7 @@ library ReserveConfiguration { - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -- //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory -+ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -@@ -3523,7 +3525,7 @@ library ReserveConfiguration { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - - /** - * @title EModeConfiguration library -@@ -3572,7 +3574,7 @@ library EModeConfiguration { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - - /** - * @title UserConfiguration library -@@ -3804,7 +3806,7 @@ library UserConfiguration { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol - - /** - * @title IInitializableAToken -@@ -3857,7 +3859,7 @@ interface IInitializableAToken { - ) external; - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol - - /** - * @title IInitializableDebtToken -@@ -3906,7 +3908,7 @@ interface IInitializableDebtToken { - ) external; - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol - - /** - * @title IsolationModeLogic library -@@ -3965,7 +3967,7 @@ library IsolationModeLogic { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol - - /** - * @title IVariableDebtToken -@@ -4008,7 +4010,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol - - /** - * @title IAToken -@@ -4142,7 +4144,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - function rescueTokens(address token, address to, uint256 amount) external; - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - - /** - * @title IncentivizedERC20 -@@ -4365,7 +4367,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - - /** - * @title ReserveLogic library -@@ -4666,7 +4668,7 @@ library ReserveLogic { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - - /** - * @title EModeLogic library -@@ -4728,7 +4730,7 @@ library EModeLogic { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - - /** - * @title GenericLogic library -@@ -4972,7 +4974,7 @@ library GenericLogic { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - - /** - * @title ReserveLogic library -@@ -5592,7 +5594,7 @@ library ValidationLogic { - } - } - --// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol -+// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol - - /** - * @title BorrowLogic library + ``` diff --git a/diffs/ARBITRUM_LINEA/BRIDGE_LOGIC_DIFF.md b/diffs/ARBITRUM_LINEA/BRIDGE_LOGIC_DIFF.md index a63fcd68..6d75b125 100644 --- a/diffs/ARBITRUM_LINEA/BRIDGE_LOGIC_DIFF.md +++ b/diffs/ARBITRUM_LINEA/BRIDGE_LOGIC_DIFF.md @@ -3,326 +3,5 @@ diff --git a/./downloads/ARBITRUM/BRIDGE_LOGIC.sol b/./downloads/LINEA/BRIDGE_LO index 9220f63..ffa3a45 100644 --- a/./downloads/ARBITRUM/BRIDGE_LOGIC.sol +++ b/./downloads/LINEA/BRIDGE_LOGIC.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 - pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - - // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -@@ -221,7 +221,7 @@ library Address { - } - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - - /* - * @dev Provides information about the current execution context, including the -@@ -244,7 +244,7 @@ abstract contract Context { - } - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - - /** - * @dev External interface of AccessControl declared to support ERC165 detection. -@@ -334,7 +334,7 @@ interface IAccessControl { - function renounceRole(bytes32 role, address account) external; - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -410,7 +410,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - - // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -@@ -666,7 +666,7 @@ library SafeCast { - } - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol - - /** - * @title IAaveIncentivesController -@@ -685,7 +685,7 @@ interface IAaveIncentivesController { - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider -@@ -912,7 +912,7 @@ interface IPoolAddressesProvider { - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol - - /** - * @title IPriceOracleGetter -@@ -942,7 +942,7 @@ interface IPriceOracleGetter { - function getAssetPrice(address asset) external view returns (uint256); - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol - - /** - * @title IScaledBalanceToken -@@ -1014,7 +1014,7 @@ interface IScaledBalanceToken { - function getPreviousIndex(address user) external view returns (uint256); - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -1117,7 +1117,7 @@ library Errors { - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - - /** - * @title PercentageMath library -@@ -1178,7 +1178,7 @@ library PercentageMath { - } - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - - /** - * @title WadRayMath library -@@ -1304,7 +1304,7 @@ library WadRayMath { - } - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { - /** -@@ -1628,7 +1628,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - - /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library - /// @author Gnosis Developers -@@ -1741,7 +1741,7 @@ library GPv2SafeERC20 { - } - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - - interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); -@@ -1751,7 +1751,7 @@ interface IERC20Detailed is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol - - /** - * @title IACLManager -@@ -1924,7 +1924,7 @@ interface IACLManager { - function isAssetListingAdmin(address admin) external view returns (bool); - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - - /** - * @title IPriceOracleSentinel -@@ -1989,7 +1989,7 @@ interface IPriceOracleSentinel { - function getGracePeriod() external view returns (uint256); - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - - /** - * @title IReserveInterestRateStrategy -@@ -2016,7 +2016,7 @@ interface IReserveInterestRateStrategy { - ) external view returns (uint256, uint256); - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol - - /** - * @title MathUtils library -@@ -2113,7 +2113,7 @@ library MathUtils { - } - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol - - /** - * @title IPool -@@ -2672,6 +2672,7 @@ interface IPool { - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 -+ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ -@@ -2943,7 +2944,7 @@ interface IPool { - function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - - /** - * @title ReserveConfiguration library -@@ -2958,6 +2959,7 @@ library ReserveConfiguration { - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore -+ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore -@@ -2966,7 +2968,7 @@ library ReserveConfiguration { - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -- //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory -+ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -@@ -3523,7 +3525,7 @@ library ReserveConfiguration { - } - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - - /** - * @title EModeConfiguration library -@@ -3572,7 +3574,7 @@ library EModeConfiguration { - } - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - - /** - * @title UserConfiguration library -@@ -3804,7 +3806,7 @@ library UserConfiguration { - } - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol - - /** - * @title IInitializableAToken -@@ -3857,7 +3859,7 @@ interface IInitializableAToken { - ) external; - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol - - /** - * @title IInitializableDebtToken -@@ -3906,7 +3908,7 @@ interface IInitializableDebtToken { - ) external; - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol - - /** - * @title IVariableDebtToken -@@ -3949,7 +3951,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol - - /** - * @title IAToken -@@ -4083,7 +4085,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - function rescueTokens(address token, address to, uint256 amount) external; - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - - /** - * @title IncentivizedERC20 -@@ -4306,7 +4308,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { - } - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - - /** - * @title ReserveLogic library -@@ -4607,7 +4609,7 @@ library ReserveLogic { - } - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - - /** - * @title EModeLogic library -@@ -4669,7 +4671,7 @@ library EModeLogic { - } - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - - /** - * @title GenericLogic library -@@ -4913,7 +4915,7 @@ library GenericLogic { - } - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - - /** - * @title ReserveLogic library -@@ -5533,7 +5535,7 @@ library ValidationLogic { - } - } - --// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol -+// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol - - library BridgeLogic { - using ReserveLogic for DataTypes.ReserveCache; + ``` diff --git a/diffs/ARBITRUM_LINEA/COLLECTOR_IMPL_DIFF.md b/diffs/ARBITRUM_LINEA/COLLECTOR_IMPL_DIFF.md index 724ff5b2..eb8e30eb 100644 --- a/diffs/ARBITRUM_LINEA/COLLECTOR_IMPL_DIFF.md +++ b/diffs/ARBITRUM_LINEA/COLLECTOR_IMPL_DIFF.md @@ -3,615 +3,25 @@ diff --git a/./downloads/ARBITRUM/COLLECTOR_IMPL.sol b/./downloads/LINEA/COLLECT index 752e048..80c907f 100644 --- a/./downloads/ARBITRUM/COLLECTOR_IMPL.sol +++ b/./downloads/LINEA/COLLECTOR_IMPL.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: MIT --pragma solidity >=0.6.0 ^0.8.0 ^0.8.1; -+pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/ReentrancyGuard.sol -+// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/ReentrancyGuard.sol - - // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) - -@@ -71,52 +71,9 @@ abstract contract ReentrancyGuard { - } - } - --// downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/VersionedInitializable.sol -+// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/Address.sol - --/** -- * @title VersionedInitializable -- * -- * @dev Helper contract to support initializer functions. To use it, replace -- * the constructor with a function that has the `initializer` modifier. -- * WARNING: Unlike constructors, initializer functions must be manually -- * invoked. This applies both to deploying an Initializable contract, as well -- * as extending an Initializable contract via inheritance. -- * WARNING: When used with inheritance, manual care must be taken to not invoke -- * a parent initializer twice, or ensure that all initializers are idempotent, -- * because this is not dealt with automatically as with constructors. -- * -- * @author Aave, inspired by the OpenZeppelin Initializable contract -- */ --abstract contract VersionedInitializable { -- /** -- * @dev Indicates that the contract has been initialized. -- */ -- uint256 internal lastInitializedRevision = 0; -- -- /** -- * @dev Modifier to use in the initializer function of a contract. -- */ -- modifier initializer() { -- uint256 revision = getRevision(); -- require(revision > lastInitializedRevision, 'Contract instance has already been initialized'); -- -- lastInitializedRevision = revision; -- -- _; -- } -- -- /// @dev returns the revision number of the contract. -- /// Needs to be defined in the inherited class as a constant. -- function getRevision() internal pure virtual returns (uint256); -- -- // Reserved storage space to allow for layout changes in the future. -- uint256[50] private ______gap; --} -- --// lib/solidity-utils/src/contracts/oz-common/Address.sol -- --// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) --// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/8b778fa20d6d76340c5fac1ed66c80273f05b95a -+// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - - /** - * @dev Collection of functions related to the address type -@@ -138,22 +95,17 @@ library Address { - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== -- * -- * [IMPORTANT] -- * ==== -- * You shouldn't rely on `isContract` to protect against flash loan attacks! -- * -- * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets -- * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract -- * constructor. -- * ==== - */ - function isContract(address account) internal view returns (bool) { -- // This method relies on extcodesize/address.code.length, which returns 0 -- // for contracts in construction, since the code is only stored at the end -- // of the constructor execution. -+ // This method relies on extcodesize, which returns 0 for contracts in -+ // construction, since the code is only stored at the end of the -+ // constructor execution. - -- return account.code.length > 0; -+ uint256 size; -+ assembly { -+ size := extcodesize(account) -+ } -+ return size > 0; - } - - /** -@@ -198,7 +150,7 @@ library Address { - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { -- return functionCallWithValue(target, data, 0, 'Address: low-level call failed'); -+ return functionCall(target, data, 'Address: low-level call failed'); - } - - /** -@@ -247,8 +199,10 @@ library Address { - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); -+ require(isContract(target), 'Address: call to non-contract'); -+ - (bool success, bytes memory returndata) = target.call{value: value}(data); -- return verifyCallResultFromTarget(target, success, returndata, errorMessage); -+ return verifyCallResult(success, returndata, errorMessage); - } - - /** -@@ -275,8 +229,10 @@ library Address { - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { -+ require(isContract(target), 'Address: static call to non-contract'); -+ - (bool success, bytes memory returndata) = target.staticcall(data); -- return verifyCallResultFromTarget(target, success, returndata, errorMessage); -+ return verifyCallResult(success, returndata, errorMessage); - } - - /** -@@ -300,37 +256,15 @@ library Address { - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { -+ require(isContract(target), 'Address: delegate call to non-contract'); -+ - (bool success, bytes memory returndata) = target.delegatecall(data); -- return verifyCallResultFromTarget(target, success, returndata, errorMessage); -+ return verifyCallResult(success, returndata, errorMessage); - } - - /** -- * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling -- * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. -- * -- * _Available since v4.8._ -- */ -- function verifyCallResultFromTarget( -- address target, -- bool success, -- bytes memory returndata, -- string memory errorMessage -- ) internal view returns (bytes memory) { -- if (success) { -- if (returndata.length == 0) { -- // only check isContract if the call was successful and the return data is empty -- // otherwise we already know that it was a contract -- require(isContract(target), 'Address: call to non-contract'); -- } -- return returndata; -- } else { -- _revert(returndata, errorMessage); -- } -- } -- -- /** -- * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the -- * revert reason or using the provided one. -+ * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the -+ * revert reason using the provided one. - * - * _Available since v4.3._ - */ -@@ -342,48 +276,27 @@ library Address { - if (success) { - return returndata; - } else { -- _revert(returndata, errorMessage); -- } -- } -+ // Look for revert reason and bubble it up if present -+ if (returndata.length > 0) { -+ // The easiest way to bubble the revert reason is using memory via assembly - -- function _revert(bytes memory returndata, string memory errorMessage) private pure { -- // Look for revert reason and bubble it up if present -- if (returndata.length > 0) { -- // The easiest way to bubble the revert reason is using memory via assembly -- /// @solidity memory-safe-assembly -- assembly { -- let returndata_size := mload(returndata) -- revert(add(32, returndata), returndata_size) -+ assembly { -+ let returndata_size := mload(returndata) -+ revert(add(32, returndata), returndata_size) -+ } -+ } else { -+ revert(errorMessage); - } -- } else { -- revert(errorMessage); - } - } - } - --// lib/solidity-utils/src/contracts/oz-common/interfaces/IERC20.sol -- --// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) --// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/a035b235b4f2c9af4ba88edc4447f02e37f8d124 -+// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ - interface IERC20 { -- /** -- * @dev Emitted when `value` tokens are moved from one account (`from`) to -- * another (`to`). -- * -- * Note that `value` may be zero. -- */ -- event Transfer(address indexed from, address indexed to, uint256 value); -- -- /** -- * @dev Emitted when the allowance of a `spender` for an `owner` is set by -- * a call to {approve}. `value` is the new allowance. -- */ -- event Approval(address indexed owner, address indexed spender, uint256 value); -- - /** - * @dev Returns the amount of tokens in existence. - */ -@@ -395,13 +308,13 @@ interface IERC20 { - function balanceOf(address account) external view returns (uint256); - - /** -- * @dev Moves `amount` tokens from the caller's account to `to`. -+ * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ -- function transfer(address to, uint256 amount) external returns (bool); -+ function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be -@@ -429,7 +342,7 @@ interface IERC20 { - function approve(address spender, uint256 amount) external returns (bool); - - /** -- * @dev Moves `amount` tokens from `from` to `to` using the -+ * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * -@@ -437,71 +350,101 @@ interface IERC20 { - * - * Emits a {Transfer} event. - */ -- function transferFrom(address from, address to, uint256 amount) external returns (bool); -+ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); -+ -+ /** -+ * @dev Emitted when `value` tokens are moved from one account (`from`) to -+ * another (`to`). -+ * -+ * Note that `value` may be zero. -+ */ -+ event Transfer(address indexed from, address indexed to, uint256 value); -+ -+ /** -+ * @dev Emitted when the allowance of a `spender` for an `owner` is set by -+ * a call to {approve}. `value` is the new allowance. -+ */ -+ event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// lib/solidity-utils/src/contracts/oz-common/interfaces/IERC20Permit.sol -- --// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) --// Modified from https://github.com/OpenZeppelin/openzeppelin-contracts/commit/00cbf5a236564c3b7aacdad1f378cae22d890ca6 -+// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol - - /** -- * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in -- * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. -- * -- * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by -- * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't -- * need to send a transaction, and thus is not required to hold Ether at all. -+ * @title VersionedInitializable -+ * @author Aave, inspired by the OpenZeppelin Initializable contract -+ * @notice Helper contract to implement initializer functions. To use it, replace -+ * the constructor with a function that has the `initializer` modifier. -+ * @dev WARNING: Unlike constructors, initializer functions must be manually -+ * invoked. This applies both to deploying an Initializable contract, as well -+ * as extending an Initializable contract via inheritance. -+ * WARNING: When used with inheritance, manual care must be taken to not invoke -+ * a parent initializer twice, or ensure that all initializers are idempotent, -+ * because this is not dealt with automatically as with constructors. - */ --interface IERC20Permit { -+abstract contract VersionedInitializable { - /** -- * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, -- * given ``owner``'s signed approval. -- * -- * IMPORTANT: The same issues {IERC20-approve} has related to transaction -- * ordering also apply here. -- * -- * Emits an {Approval} event. -- * -- * Requirements: -- * -- * - `spender` cannot be the zero address. -- * - `deadline` must be a timestamp in the future. -- * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` -- * over the EIP712-formatted function arguments. -- * - the signature must use ``owner``'s current nonce (see {nonces}). -- * -- * For more information on the signature format, see the -- * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP -- * section]. -+ * @dev Indicates that the contract has been initialized. - */ -- function permit( -- address owner, -- address spender, -- uint256 value, -- uint256 deadline, -- uint8 v, -- bytes32 r, -- bytes32 s -- ) external; -+ uint256 private lastInitializedRevision = 0; - - /** -- * @dev Returns the current nonce for `owner`. This value must be -- * included whenever a signature is generated for {permit}. -- * -- * Every successful call to {permit} increases ``owner``'s nonce by one. This -- * prevents a signature from being used multiple times. -+ * @dev Indicates that the contract is in the process of being initialized. - */ -- function nonces(address owner) external view returns (uint256); -+ bool private initializing; - - /** -- * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. -+ * @dev Modifier to use in the initializer function of a contract. - */ -- // solhint-disable-next-line func-name-mixedcase -- function DOMAIN_SEPARATOR() external view returns (bytes32); -+ modifier initializer() { -+ uint256 revision = getRevision(); -+ require( -+ initializing || isConstructor() || revision > lastInitializedRevision, -+ 'Contract instance has already been initialized' -+ ); -+ -+ bool isTopLevelCall = !initializing; -+ if (isTopLevelCall) { -+ initializing = true; -+ lastInitializedRevision = revision; -+ } -+ -+ _; -+ -+ if (isTopLevelCall) { -+ initializing = false; -+ } -+ } -+ -+ /** -+ * @notice Returns the revision number of the contract -+ * @dev Needs to be defined in the inherited class as a constant. -+ * @return The revision number -+ */ -+ function getRevision() internal pure virtual returns (uint256); -+ -+ /** -+ * @notice Returns true if and only if the function is running in the constructor -+ * @return True if the function is running in the constructor -+ */ -+ function isConstructor() private view returns (bool) { -+ // extcodesize checks the size of the code stored in an address, and -+ // address returns the current address. Since the code is still not -+ // deployed when running a constructor, any checks on its code size will -+ // yield zero, making it an effective way to detect if a contract is -+ // under construction or not. -+ uint256 cs; -+ //solium-disable-next-line -+ assembly { -+ cs := extcodesize(address()) -+ } -+ return cs == 0; -+ } -+ -+ // Reserved storage space to allow for layout changes in the future. -+ uint256[50] private ______gap; - } - --// downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/interfaces/ICollector.sol -+// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/ICollector.sol - - interface ICollector { - struct Stream { -@@ -673,10 +616,9 @@ interface ICollector { - function getNextStreamId() external view returns (uint256); - } - --// lib/solidity-utils/src/contracts/oz-common/SafeERC20.sol -+// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/SafeERC20.sol - --// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol) --// Modified From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/00cbf5a236564c3b7aacdad1f378cae22d890ca6 -+// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) - - /** - * @title SafeERC20 -@@ -690,96 +632,52 @@ interface ICollector { - library SafeERC20 { - using Address for address; - -- /** -- * @dev An operation with an ERC20 token failed. -- */ -- error SafeERC20FailedOperation(address token); -- -- /** -- * @dev Indicates a failed `decreaseAllowance` request. -- */ -- error SafeERC20FailedDecreaseAllowance( -- address spender, -- uint256 currentAllowance, -- uint256 requestedDecrease -- ); -- -- /** -- * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, -- * non-reverting calls are assumed to be successful. -- */ - function safeTransfer(IERC20 token, address to, uint256 value) internal { -- _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); -+ _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); - } - -- /** -- * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the -- * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. -- */ - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { -- _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); -+ _callOptionalReturn( -+ token, -+ abi.encodeWithSelector(token.transferFrom.selector, from, to, value) -+ ); - } - - /** -- * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, -- * non-reverting calls are assumed to be successful. -+ * @dev Deprecated. This function has issues similar to the ones found in -+ * {IERC20-approve}, and its usage is discouraged. -+ * -+ * Whenever possible, use {safeIncreaseAllowance} and -+ * {safeDecreaseAllowance} instead. - */ -+ function safeApprove(IERC20 token, address spender, uint256 value) internal { -+ // safeApprove should only be called when setting an initial allowance, -+ // or when resetting it to zero. To increase and decrease it, use -+ // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' -+ require( -+ (value == 0) || (token.allowance(address(this), spender) == 0), -+ 'SafeERC20: approve from non-zero to non-zero allowance' -+ ); -+ _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); -+ } -+ - function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { -- uint256 oldAllowance = token.allowance(address(this), spender); -- forceApprove(token, spender, oldAllowance + value); -+ uint256 newAllowance = token.allowance(address(this), spender) + value; -+ _callOptionalReturn( -+ token, -+ abi.encodeWithSelector(token.approve.selector, spender, newAllowance) -+ ); - } - -- /** -- * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no value, -- * non-reverting calls are assumed to be successful. -- */ -- function safeDecreaseAllowance( -- IERC20 token, -- address spender, -- uint256 requestedDecrease -- ) internal { -+ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { - unchecked { -- uint256 currentAllowance = token.allowance(address(this), spender); -- if (currentAllowance < requestedDecrease) { -- revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); -- } -- forceApprove(token, spender, currentAllowance - requestedDecrease); -- } -- } -- -- /** -- * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, -- * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval -- * to be set to zero before setting it to a non-zero value, such as USDT. -- */ -- function forceApprove(IERC20 token, address spender, uint256 value) internal { -- bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); -- -- if (!_callOptionalReturnBool(token, approvalCall)) { -- _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); -- _callOptionalReturn(token, approvalCall); -- } -- } -- -- /** -- * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. -- * Revert on invalid signature. -- */ -- function safePermit( -- IERC20Permit token, -- address owner, -- address spender, -- uint256 value, -- uint256 deadline, -- uint8 v, -- bytes32 r, -- bytes32 s -- ) internal { -- uint256 nonceBefore = token.nonces(owner); -- token.permit(owner, spender, value, deadline, v, r, s); -- uint256 nonceAfter = token.nonces(owner); -- if (nonceAfter != nonceBefore + 1) { -- revert SafeERC20FailedOperation(address(token)); -+ uint256 oldAllowance = token.allowance(address(this), spender); -+ require(oldAllowance >= value, 'SafeERC20: decreased allowance below zero'); -+ uint256 newAllowance = oldAllowance - value; -+ _callOptionalReturn( -+ token, -+ abi.encodeWithSelector(token.approve.selector, spender, newAllowance) -+ ); - } - } - -@@ -791,37 +689,18 @@ library SafeERC20 { - */ - function _callOptionalReturn(IERC20 token, bytes memory data) private { - // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since -- // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that -+ // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that - // the target address contains contract code and also asserts for success in the low-level call. - -- bytes memory returndata = address(token).functionCall(data); -- if (returndata.length != 0 && !abi.decode(returndata, (bool))) { -- revert SafeERC20FailedOperation(address(token)); -+ bytes memory returndata = address(token).functionCall(data, 'SafeERC20: low-level call failed'); -+ if (returndata.length > 0) { -+ // Return data is optional -+ require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed'); - } - } -- -- /** -- * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement -- * on the return value: the return value is optional (but if data is returned, it must not be false). -- * @param token The token targeted by the call. -- * @param data The call data (encoded using abi.encode or one of its variants). -- * -- * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. -- */ -- function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { -- // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since -- // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false -- // and not revert is the subcall reverts. -- -- (bool success, bytes memory returndata) = address(token).call(data); -- return -- success && -- (returndata.length == 0 || abi.decode(returndata, (bool))) && -- address(token).code.length > 0; -- } - } - + -// downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/contracts/Collector.sol +// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/Collector.sol - + /** * @title Collector @@ -903,8 +782,6 @@ contract Collector is VersionedInitializable, ICollector, ReentrancyGuard { _nextStreamId = nextStreamId; } - + - // can be removed after first deployment - _initGuard(); _setFundsAdmin(fundsAdmin); } - + @@ -1021,9 +898,6 @@ contract Collector is VersionedInitializable, ICollector, ReentrancyGuard { } } - + - /// @dev needed in order to receive ETH from the Aave v1 ecosystem reserve - receive() external payable {} - diff --git a/diffs/ARBITRUM_LINEA/CONFIGURATOR_LOGIC_DIFF.md b/diffs/ARBITRUM_LINEA/CONFIGURATOR_LOGIC_DIFF.md index 4203b8a0..5a33f407 100644 --- a/diffs/ARBITRUM_LINEA/CONFIGURATOR_LOGIC_DIFF.md +++ b/diffs/ARBITRUM_LINEA/CONFIGURATOR_LOGIC_DIFF.md @@ -3,879 +3,10 @@ diff --git a/./downloads/ARBITRUM/CONFIGURATOR_LOGIC.sol b/./downloads/LINEA/CON index b92a1a1..22e067d 100644 --- a/./downloads/ARBITRUM/CONFIGURATOR_LOGIC.sol +++ b/./downloads/LINEA/CONFIGURATOR_LOGIC.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 - pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/Address.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - - // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -@@ -221,7 +221,7 @@ library Address { - } - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -297,7 +297,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol - - /** - * @title Proxy -@@ -378,7 +378,7 @@ abstract contract Proxy { - } - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IAaveIncentivesController.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IAaveIncentivesController.sol - - /** - * @title IAaveIncentivesController -@@ -397,7 +397,7 @@ interface IAaveIncentivesController { - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider -@@ -624,7 +624,7 @@ interface IPoolAddressesProvider { - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -662,17 +662,14 @@ library Errors { - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' -- string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' -- string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' -- string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' -@@ -685,7 +682,6 @@ library Errors { - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' -- string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' -@@ -714,11 +710,9 @@ library Errors { - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' -- string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' -- string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled -@@ -730,14 +724,14 @@ library Errors { - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state -+ string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol - - library ConfiguratorInputTypes { - struct InitReserveInput { - address aTokenImpl; -- address stableDebtTokenImpl; - address variableDebtTokenImpl; - bool useVirtualBalance; - address interestRateStrategyAddress; -@@ -748,8 +742,6 @@ library ConfiguratorInputTypes { - string aTokenSymbol; - string variableDebtTokenName; - string variableDebtTokenSymbol; -- string stableDebtTokenName; -- string stableDebtTokenSymbol; - bytes params; - bytes interestRateData; - } -@@ -774,7 +766,7 @@ library ConfiguratorInputTypes { - } - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { - /** -@@ -792,7 +784,7 @@ library DataTypes { - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; -- //the current stable borrow rate. Expressed in ray -+ // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; -@@ -800,7 +792,7 @@ library DataTypes { - uint16 id; - //aToken address - address aTokenAddress; -- //stableDebtToken address -+ // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; -@@ -825,8 +817,8 @@ library DataTypes { - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; -- //the current stable borrow rate. Expressed in ray -- uint128 currentStableBorrowRate; -+ // DEPRECATED on v3.2.0 -+ uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves -@@ -835,8 +827,8 @@ library DataTypes { - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; -- //stableDebtToken address -- address stableDebtTokenAddress; -+ // DEPRECATED on v3.2.0 -+ address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy -@@ -859,7 +851,7 @@ library DataTypes { - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled -- //bit 59: stable rate borrowing enabled -+ //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled -@@ -868,7 +860,7 @@ library DataTypes { - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee -- //bit 168-175: eMode category -+ //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve -@@ -886,30 +878,49 @@ library DataTypes { - uint256 data; - } - -- struct EModeCategory { -+ // DEPRECATED: kept for backwards compatibility, might be removed in a future version -+ struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; -- // each eMode category may or may not have a custom oracle to override the individual assets price oracles -+ // DEPRECATED - address priceSource; - string label; - } - -+ struct CollateralConfig { -+ uint16 ltv; -+ uint16 liquidationThreshold; -+ uint16 liquidationBonus; -+ } -+ -+ struct EModeCategoryBaseConfiguration { -+ uint16 ltv; -+ uint16 liquidationThreshold; -+ uint16 liquidationBonus; -+ string label; -+ } -+ -+ struct EModeCategory { -+ // each eMode category has a custom ltv and liquidation threshold -+ uint16 ltv; -+ uint16 liquidationThreshold; -+ uint16 liquidationBonus; -+ uint128 collateralBitmap; -+ string label; -+ uint128 borrowableBitmap; -+ } -+ - enum InterestRateMode { - NONE, -- STABLE, -+ __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; -- uint256 currPrincipalStableDebt; -- uint256 currAvgStableBorrowRate; -- uint256 currTotalStableDebt; -- uint256 nextAvgStableBorrowRate; -- uint256 nextTotalStableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; -@@ -919,10 +930,8 @@ library DataTypes { - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; -- address stableDebtTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; -- uint40 stableDebtLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { -@@ -952,7 +961,6 @@ library DataTypes { - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; -- uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; -@@ -1004,7 +1012,6 @@ library DataTypes { - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; -- uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address addressesProvider; - address pool; -@@ -1046,7 +1053,6 @@ library DataTypes { - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; -- uint256 maxStableLoanPercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; -@@ -1067,9 +1073,7 @@ library DataTypes { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; -- uint256 totalStableDebt; -- uint256 totalVariableDebt; -- uint256 averageStableBorrowRate; -+ uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; -@@ -1079,7 +1083,6 @@ library DataTypes { - struct InitReserveParams { - address asset; - address aTokenAddress; -- address stableDebtAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; -@@ -1087,7 +1090,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - - interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); -@@ -1097,7 +1100,7 @@ interface IERC20Detailed is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IReserveInterestRateStrategy.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - - /** - * @title IReserveInterestRateStrategy -@@ -1117,15 +1120,14 @@ interface IReserveInterestRateStrategy { - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray -- * @return stableBorrowRate The stable borrow rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params -- ) external view returns (uint256, uint256, uint256); -+ ) external view returns (uint256, uint256); - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol - - /** - * @title BaseUpgradeabilityProxy -@@ -1188,7 +1190,7 @@ contract BaseUpgradeabilityProxy is Proxy { - } - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPool.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPool.sol - - /** - * @title IPool -@@ -1253,7 +1255,7 @@ interface IPool { - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out -- * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable -+ * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ -@@ -1283,18 +1285,6 @@ interface IPool { - bool useATokens - ); - -- /** -- * @dev Emitted on swapBorrowRateMode() -- * @param reserve The address of the underlying asset of the reserve -- * @param user The address of the user swapping his rate mode -- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable -- */ -- event SwapBorrowRateMode( -- address indexed reserve, -- address indexed user, -- DataTypes.InterestRateMode interestRateMode -- ); -- - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve -@@ -1323,20 +1313,14 @@ interface IPool { - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - -- /** -- * @dev Emitted on rebalanceStableBorrowRate() -- * @param reserve The address of the underlying asset of the reserve -- * @param user The address of the user for which the rebalance has been executed -- */ -- event RebalanceStableBorrowRate(address indexed reserve, address indexed user); -- - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed -- * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt -+ * @param interestRateMode The flashloan mode: 0 for regular flashloan, -+ * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ -@@ -1375,7 +1359,7 @@ interface IPool { - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate -- * @param stableBorrowRate The next stable borrow rate -+ * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index -@@ -1474,13 +1458,12 @@ interface IPool { - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower -- * already supplied enough collateral, or he was given enough allowance by a credit delegator on the -- * corresponding debt token (StableDebtToken or VariableDebtToken) -+ * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet -- * and 100 stable/variable debt tokens, depending on the `interestRateMode` -+ * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed -- * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable -+ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself -@@ -1497,11 +1480,11 @@ interface IPool { - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned -- * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address -+ * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` -- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable -+ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed -@@ -1520,7 +1503,7 @@ interface IPool { - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` -- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable -+ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed -@@ -1544,13 +1527,13 @@ interface IPool { - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens -- * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens -+ * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` -- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable -+ * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( -@@ -1559,32 +1542,6 @@ interface IPool { - uint256 interestRateMode - ) external returns (uint256); - -- /** -- * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa -- * @param asset The address of the underlying asset borrowed -- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable -- */ -- function swapBorrowRateMode(address asset, uint256 interestRateMode) external; -- -- /** -- * @notice Permissionless method which allows anyone to swap a users stable debt to variable debt -- * @dev Introduced in favor of stable rate deprecation -- * @param asset The address of the underlying asset borrowed -- * @param user The address of the user whose debt will be swapped from stable to variable -- */ -- function swapToVariable(address asset, address user) external; -- -- /** -- * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. -- * - Users can be rebalanced if the following conditions are satisfied: -- * 1. Usage ratio is above 95% -- * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too -- * much has been borrowed at a stable rate and suppliers are not earning enough -- * @param asset The address of the underlying asset borrowed -- * @param user The address of the user to be rebalanced -- */ -- function rebalanceStableBorrowRate(address asset, address user) external; -- - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied -@@ -1621,9 +1578,9 @@ interface IPool { - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver -- * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address -+ * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address -- * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 -+ * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man -@@ -1688,14 +1645,12 @@ interface IPool { - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve -- * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, -- address stableDebtAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; -@@ -1703,6 +1658,7 @@ interface IPool { - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract -+ * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; -@@ -1793,6 +1749,7 @@ interface IPool { - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 -+ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ -@@ -1875,20 +1832,70 @@ interface IPool { - ) external; - - /** -- * @notice Configures a new category for the eMode. -+ * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ -- function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; -+ function configureEModeCategory( -+ uint8 id, -+ DataTypes.EModeCategoryBaseConfiguration memory config -+ ) external; -+ -+ /** -+ * @notice Replaces the current eMode collateralBitmap. -+ * @param id The id of the category -+ * @param collateralBitmap The collateralBitmap of the category -+ */ -+ function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; -+ -+ /** -+ * @notice Replaces the current eMode borrowableBitmap. -+ * @param id The id of the category -+ * @param borrowableBitmap The borrowableBitmap of the category -+ */ -+ function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category -+ * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ -- function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); -+ function getEModeCategoryData( -+ uint8 id -+ ) external view returns (DataTypes.EModeCategoryLegacy memory); -+ -+ /** -+ * @notice Returns the label of an eMode category -+ * @param id The id of the category -+ * @return The label of the category -+ */ -+ function getEModeCategoryLabel(uint8 id) external view returns (string memory); -+ -+ /** -+ * @notice Returns the collateral config of an eMode category -+ * @param id The id of the category -+ * @return The ltv,lt,lb of the category -+ */ -+ function getEModeCategoryCollateralConfig( -+ uint8 id -+ ) external view returns (DataTypes.CollateralConfig memory); -+ -+ /** -+ * @notice Returns the collateralBitmap of an eMode category -+ * @param id The id of the category -+ * @return The collateralBitmap of the category -+ */ -+ function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); -+ -+ /** -+ * @notice Returns the borrowableBitmap of an eMode category -+ * @param id The id of the category -+ * @return The borrowableBitmap of the category -+ */ -+ function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode -@@ -1926,12 +1933,6 @@ interface IPool { - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - -- /** -- * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate -- * @return The percentage of available liquidity to borrow, expressed in bps -- */ -- function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); -- - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans -@@ -1987,40 +1988,40 @@ interface IPool { - /** - * @notice Gets the address of the external FlashLoanLogic - */ -- function getFlashLoanLogic() external returns (address); -+ function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ -- function getBorrowLogic() external returns (address); -+ function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ -- function getBridgeLogic() external returns (address); -+ function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ -- function getEModeLogic() external returns (address); -+ function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ -- function getLiquidationLogic() external returns (address); -+ function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ -- function getPoolLogic() external returns (address); -+ function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ -- function getSupplyLogic() external returns (address); -+ function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/configuration/ReserveConfiguration.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - - /** - * @title ReserveConfiguration library -@@ -2035,7 +2036,7 @@ library ReserveConfiguration { - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore -- uint256 internal constant STABLE_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFF; // prettier-ignore -+ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore -@@ -2044,7 +2045,7 @@ library ReserveConfiguration { - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -- uint256 internal constant EMODE_CATEGORY_MASK = 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -+ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -@@ -2056,7 +2057,6 @@ library ReserveConfiguration { - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; -- uint256 internal constant STABLE_BORROWING_ENABLED_START_BIT_POSITION = 59; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; -@@ -2065,7 +2065,7 @@ library ReserveConfiguration { - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; -- uint256 internal constant EMODE_CATEGORY_START_BIT_POSITION = 168; -+ //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; -@@ -2078,7 +2078,6 @@ library ReserveConfiguration { - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; -- uint256 internal constant MAX_VALID_EMODE_CATEGORY = 255; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - -@@ -2329,31 +2328,6 @@ library ReserveConfiguration { - return (self.data & ~BORROWING_MASK) != 0; - } - -- /** -- * @notice Enables or disables stable rate borrowing on the reserve -- * @param self The reserve configuration -- * @param enabled True if the stable rate borrowing needs to be enabled, false otherwise -- */ -- function setStableRateBorrowingEnabled( -- DataTypes.ReserveConfigurationMap memory self, -- bool enabled -- ) internal pure { -- self.data = -- (self.data & STABLE_BORROWING_MASK) | -- (uint256(enabled ? 1 : 0) << STABLE_BORROWING_ENABLED_START_BIT_POSITION); -- } -- -- /** -- * @notice Gets the stable rate borrowing state of the reserve -- * @param self The reserve configuration -- * @return The stable rate borrowing state -- */ -- function getStableRateBorrowingEnabled( -- DataTypes.ReserveConfigurationMap memory self -- ) internal pure returns (bool) { -- return (self.data & ~STABLE_BORROWING_MASK) != 0; -- } -- - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration -@@ -2514,31 +2488,6 @@ library ReserveConfiguration { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - -- /** -- * @notice Sets the eMode asset category -- * @param self The reserve configuration -- * @param category The asset category when the user selects the eMode -- */ -- function setEModeCategory( -- DataTypes.ReserveConfigurationMap memory self, -- uint256 category -- ) internal pure { -- require(category <= MAX_VALID_EMODE_CATEGORY, Errors.INVALID_EMODE_CATEGORY); -- -- self.data = (self.data & EMODE_CATEGORY_MASK) | (category << EMODE_CATEGORY_START_BIT_POSITION); -- } -- -- /** -- * @dev Gets the eMode asset category -- * @param self The reserve configuration -- * @return The eMode category for the asset -- */ -- function getEModeCategory( -- DataTypes.ReserveConfigurationMap memory self -- ) internal pure returns (uint256) { -- return (self.data & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION; -- } -- - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration -@@ -2597,19 +2546,17 @@ library ReserveConfiguration { - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled -- * @return The state flag representing stableRateBorrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self -- ) internal pure returns (bool, bool, bool, bool, bool) { -+ ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, -- (dataLocal & ~STABLE_BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } -@@ -2622,11 +2569,10 @@ library ReserveConfiguration { - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor -- * @return The state param representing eMode category - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self -- ) internal pure returns (uint256, uint256, uint256, uint256, uint256, uint256) { -+ ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( -@@ -2634,8 +2580,7 @@ library ReserveConfiguration { - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, -- (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION, -- (dataLocal & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION -+ (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - -@@ -2657,7 +2602,7 @@ library ReserveConfiguration { - } - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol - - /** - * @title InitializableUpgradeabilityProxy -@@ -2684,7 +2629,7 @@ contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { - } - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol - - /** - * @title BaseImmutableAdminUpgradeabilityProxy -@@ -2767,7 +2712,7 @@ contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - } - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableAToken.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableAToken.sol - - /** - * @title IInitializableAToken -@@ -2820,7 +2765,7 @@ interface IInitializableAToken { - ) external; - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableDebtToken.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableDebtToken.sol - - /** - * @title IInitializableDebtToken -@@ -2869,7 +2814,7 @@ interface IInitializableDebtToken { - ) external; - } - --// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol -+// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol - - /** - * @title InitializableAdminUpgradeabilityProxy -@@ -2894,7 +2839,7 @@ contract InitializableImmutableAdminUpgradeabilityProxy is - } - } - + -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/logic/ConfiguratorLogic.sol +// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol - + /** * @title ConfiguratorLogic library @@ -2917,11 +2862,6 @@ library ConfiguratorLogic { @@ -892,7 +23,7 @@ index b92a1a1..22e067d 100644 address indexed proxy, @@ -2929,7 +2869,7 @@ library ConfiguratorLogic { ); - + /** - * @notice Initialize a reserve by creating and initializing aToken, stable debt token and variable debt token + * @notice Initialize a reserve by creating and initializing aToken and variable debt token @@ -902,7 +33,7 @@ index b92a1a1..22e067d 100644 @@ -2957,20 +2897,6 @@ library ConfiguratorLogic { ) ); - + - address stableDebtTokenProxyAddress = _initTokenWithProxy( - input.stableDebtTokenImpl, - abi.encodeWithSelector( @@ -940,16 +71,16 @@ index b92a1a1..22e067d 100644 @@ -3030,7 +2955,7 @@ library ConfiguratorLogic { ) external { DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - + - (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); + (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); - + bytes memory encodedCall = abi.encodeWithSelector( IInitializableAToken.initialize.selector, @@ -3049,44 +2974,6 @@ library ConfiguratorLogic { emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); } - + - /** - * @notice Updates the stable debt token implementation and initializes it - * @dev Emits the `StableDebtTokenUpgraded` event @@ -994,10 +125,10 @@ index b92a1a1..22e067d 100644 @@ -3099,7 +2986,7 @@ library ConfiguratorLogic { ) external { DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - + - (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); + (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); - + bytes memory encodedCall = abi.encodeWithSelector( IInitializableDebtToken.initialize.selector, ``` diff --git a/diffs/ARBITRUM_LINEA/DEFAULT_A_TOKEN_IMPL_DIFF.md b/diffs/ARBITRUM_LINEA/DEFAULT_A_TOKEN_IMPL_DIFF.md index 8e5b155c..93c64bc9 100644 --- a/diffs/ARBITRUM_LINEA/DEFAULT_A_TOKEN_IMPL_DIFF.md +++ b/diffs/ARBITRUM_LINEA/DEFAULT_A_TOKEN_IMPL_DIFF.md @@ -3,805 +3,10 @@ diff --git a/./downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL.sol b/./downloads/LINEA/D index efb0fd4..fd9dc66 100644 --- a/./downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL.sol +++ b/./downloads/LINEA/DEFAULT_A_TOKEN_IMPL.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 --pragma solidity =0.8.10 ^0.8.0; -+pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol - - /* - * @dev Provides information about the current execution context, including the -@@ -24,7 +24,7 @@ abstract contract Context { - } - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -100,7 +100,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - - // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -@@ -356,7 +356,7 @@ library SafeCast { - } - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol - - /** - * @title IAaveIncentivesController -@@ -375,7 +375,7 @@ interface IAaveIncentivesController { - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider -@@ -602,7 +602,7 @@ interface IPoolAddressesProvider { - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol - - /** - * @title IScaledBalanceToken -@@ -674,7 +674,7 @@ interface IScaledBalanceToken { - function getPreviousIndex(address user) external view returns (uint256); - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol - - /** - * @title VersionedInitializable -@@ -751,7 +751,7 @@ abstract contract VersionedInitializable { - uint256[50] private ______gap; - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -789,17 +789,14 @@ library Errors { - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' -- string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' -- string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' -- string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' -@@ -812,7 +809,6 @@ library Errors { - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' -- string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' -@@ -841,17 +837,24 @@ library Errors { - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' -- string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' -- string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled -+ string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid -+ string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed -+ string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed -+ string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 -+ string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' -+ string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' -+ string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range -+ string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state -+ string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol - - /** - * @title WadRayMath library -@@ -977,10 +980,14 @@ library WadRayMath { - } - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { -- struct ReserveData { -+ /** -+ * This exists specifically to maintain the `getReserveData()` interface, since the new, internal -+ * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. -+ */ -+ struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray -@@ -991,7 +998,7 @@ library DataTypes { - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; -- //the current stable borrow rate. Expressed in ray -+ // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; -@@ -999,7 +1006,7 @@ library DataTypes { - uint16 id; - //aToken address - address aTokenAddress; -- //stableDebtToken address -+ // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; -@@ -1013,6 +1020,43 @@ library DataTypes { - uint128 isolationModeTotalDebt; - } - -+ struct ReserveData { -+ //stores the reserve configuration -+ ReserveConfigurationMap configuration; -+ //the liquidity index. Expressed in ray -+ uint128 liquidityIndex; -+ //the current supply rate. Expressed in ray -+ uint128 currentLiquidityRate; -+ //variable borrow index. Expressed in ray -+ uint128 variableBorrowIndex; -+ //the current variable borrow rate. Expressed in ray -+ uint128 currentVariableBorrowRate; -+ // DEPRECATED on v3.2.0 -+ uint128 __deprecatedStableBorrowRate; -+ //timestamp of last update -+ uint40 lastUpdateTimestamp; -+ //the id of the reserve. Represents the position in the list of the active reserves -+ uint16 id; -+ //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed -+ uint40 liquidationGracePeriodUntil; -+ //aToken address -+ address aTokenAddress; -+ // DEPRECATED on v3.2.0 -+ address __deprecatedStableDebtTokenAddress; -+ //variableDebtToken address -+ address variableDebtTokenAddress; -+ //address of the interest rate strategy -+ address interestRateStrategyAddress; -+ //the current treasury balance, scaled -+ uint128 accruedToTreasury; -+ //the outstanding unbacked aTokens minted through the bridging feature -+ uint128 unbacked; -+ //the outstanding debt borrowed against this asset in isolation mode -+ uint128 isolationModeTotalDebt; -+ //the amount of underlying accounted for by the protocol -+ uint128 virtualUnderlyingBalance; -+ } -+ - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold -@@ -1021,18 +1065,20 @@ library DataTypes { - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled -- //bit 59: stable rate borrowing enabled -+ //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled -- //bit 62-63: reserved -+ //bit 62: siloed borrowing enabled -+ //bit 63: flashloaning enabled - //bit 64-79: reserve factor -- //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap -- //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap -- //bit 152-167 liquidation protocol fee -- //bit 168-175 eMode category -- //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled -- //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals -- //bit 252-255 unused -+ //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap -+ //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap -+ //bit 152-167: liquidation protocol fee -+ //bit 168-175: DEPRECATED: eMode category -+ //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled -+ //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals -+ //bit 252: virtual accounting is enabled for the reserve -+ //bit 253-255 unused - - uint256 data; - } -@@ -1046,30 +1092,49 @@ library DataTypes { - uint256 data; - } - -- struct EModeCategory { -+ // DEPRECATED: kept for backwards compatibility, might be removed in a future version -+ struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; -- // each eMode category may or may not have a custom oracle to override the individual assets price oracles -+ // DEPRECATED - address priceSource; - string label; - } - -+ struct CollateralConfig { -+ uint16 ltv; -+ uint16 liquidationThreshold; -+ uint16 liquidationBonus; -+ } -+ -+ struct EModeCategoryBaseConfiguration { -+ uint16 ltv; -+ uint16 liquidationThreshold; -+ uint16 liquidationBonus; -+ string label; -+ } -+ -+ struct EModeCategory { -+ // each eMode category has a custom ltv and liquidation threshold -+ uint16 ltv; -+ uint16 liquidationThreshold; -+ uint16 liquidationBonus; -+ uint128 collateralBitmap; -+ string label; -+ uint128 borrowableBitmap; -+ } -+ - enum InterestRateMode { - NONE, -- STABLE, -+ __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; -- uint256 currPrincipalStableDebt; -- uint256 currAvgStableBorrowRate; -- uint256 currTotalStableDebt; -- uint256 nextAvgStableBorrowRate; -- uint256 nextTotalStableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; -@@ -1079,10 +1144,8 @@ library DataTypes { - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; -- address stableDebtTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; -- uint40 stableDebtLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { -@@ -1112,7 +1175,6 @@ library DataTypes { - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; -- uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; -@@ -1164,9 +1226,9 @@ library DataTypes { - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; -- uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address addressesProvider; -+ address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } -@@ -1205,7 +1267,6 @@ library DataTypes { - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; -- uint256 maxStableLoanPercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; -@@ -1226,18 +1287,16 @@ library DataTypes { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; -- uint256 totalStableDebt; -- uint256 totalVariableDebt; -- uint256 averageStableBorrowRate; -+ uint256 totalDebt; - uint256 reserveFactor; - address reserve; -- address aToken; -+ bool usingVirtualBalance; -+ uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; -- address stableDebtAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; -@@ -1245,7 +1304,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol - - /** - * @title EIP712Base -@@ -1315,7 +1374,7 @@ abstract contract EIP712Base { - function _EIP712BaseId() internal view virtual returns (string memory); - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - - /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library - /// @author Gnosis Developers -@@ -1428,7 +1487,7 @@ library GPv2SafeERC20 { - } - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - - interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); -@@ -1438,7 +1497,7 @@ interface IERC20Detailed is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IACLManager.sol - - /** - * @title IACLManager -@@ -1611,7 +1670,7 @@ interface IACLManager { - function isAssetListingAdmin(address admin) external view returns (bool); - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPool.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPool.sol - - /** - * @title IPool -@@ -1676,7 +1735,7 @@ interface IPool { - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out -- * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable -+ * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ -@@ -1706,18 +1765,6 @@ interface IPool { - bool useATokens - ); - -- /** -- * @dev Emitted on swapBorrowRateMode() -- * @param reserve The address of the underlying asset of the reserve -- * @param user The address of the user swapping his rate mode -- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable -- */ -- event SwapBorrowRateMode( -- address indexed reserve, -- address indexed user, -- DataTypes.InterestRateMode interestRateMode -- ); -- - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve -@@ -1746,20 +1793,14 @@ interface IPool { - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - -- /** -- * @dev Emitted on rebalanceStableBorrowRate() -- * @param reserve The address of the underlying asset of the reserve -- * @param user The address of the user for which the rebalance has been executed -- */ -- event RebalanceStableBorrowRate(address indexed reserve, address indexed user); -- - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed -- * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt -+ * @param interestRateMode The flashloan mode: 0 for regular flashloan, -+ * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ -@@ -1798,7 +1839,7 @@ interface IPool { - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate -- * @param stableBorrowRate The next stable borrow rate -+ * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index -@@ -1897,13 +1938,12 @@ interface IPool { - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower -- * already supplied enough collateral, or he was given enough allowance by a credit delegator on the -- * corresponding debt token (StableDebtToken or VariableDebtToken) -+ * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet -- * and 100 stable/variable debt tokens, depending on the `interestRateMode` -+ * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed -- * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable -+ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself -@@ -1920,11 +1960,11 @@ interface IPool { - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned -- * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address -+ * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` -- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable -+ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed -@@ -1943,7 +1983,7 @@ interface IPool { - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` -- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable -+ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed -@@ -1967,13 +2007,13 @@ interface IPool { - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens -- * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens -+ * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` -- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable -+ * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( -@@ -1982,24 +2022,6 @@ interface IPool { - uint256 interestRateMode - ) external returns (uint256); - -- /** -- * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa -- * @param asset The address of the underlying asset borrowed -- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable -- */ -- function swapBorrowRateMode(address asset, uint256 interestRateMode) external; -- -- /** -- * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. -- * - Users can be rebalanced if the following conditions are satisfied: -- * 1. Usage ratio is above 95% -- * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too -- * much has been borrowed at a stable rate and suppliers are not earning enough -- * @param asset The address of the underlying asset borrowed -- * @param user The address of the user to be rebalanced -- */ -- function rebalanceStableBorrowRate(address asset, address user) external; -- - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied -@@ -2036,9 +2058,9 @@ interface IPool { - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver -- * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address -+ * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address -- * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 -+ * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man -@@ -2103,14 +2125,12 @@ interface IPool { - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve -- * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, -- address stableDebtAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; -@@ -2118,6 +2138,7 @@ interface IPool { - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract -+ * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; -@@ -2133,6 +2154,22 @@ interface IPool { - address rateStrategyAddress - ) external; - -+ /** -+ * @notice Accumulates interest to all indexes of the reserve -+ * @dev Only callable by the PoolConfigurator contract -+ * @dev To be used when required by the configurator, for example when updating interest rates strategy data -+ * @param asset The address of the underlying asset of the reserve -+ */ -+ function syncIndexesState(address asset) external; -+ -+ /** -+ * @notice Updates interest rates on the reserve data -+ * @dev Only callable by the PoolConfigurator contract -+ * @dev To be used when required by the configurator, for example when updating interest rates strategy data -+ * @param asset The address of the underlying asset of the reserve -+ */ -+ function syncRatesState(address asset) external; -+ - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract -@@ -2188,7 +2225,24 @@ interface IPool { - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ -- function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); -+ function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); -+ -+ /** -+ * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 -+ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) -+ * @param asset The address of the underlying asset of the reserve -+ * @return The state and configuration data of the reserve with virtual accounting -+ */ -+ function getReserveDataExtended( -+ address asset -+ ) external view returns (DataTypes.ReserveData memory); -+ -+ /** -+ * @notice Returns the virtual underlying balance of the reserve -+ * @param asset The address of the underlying asset of the reserve -+ * @return The reserve virtual underlying balance -+ */ -+ function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer -@@ -2216,6 +2270,13 @@ interface IPool { - */ - function getReservesList() external view returns (address[] memory); - -+ /** -+ * @notice Returns the number of initialized reserves -+ * @dev It includes dropped reserves -+ * @return The count -+ */ -+ function getReservesCount() external view returns (uint256); -+ - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct -@@ -2251,20 +2312,70 @@ interface IPool { - ) external; - - /** -- * @notice Configures a new category for the eMode. -+ * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ -- function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; -+ function configureEModeCategory( -+ uint8 id, -+ DataTypes.EModeCategoryBaseConfiguration memory config -+ ) external; -+ -+ /** -+ * @notice Replaces the current eMode collateralBitmap. -+ * @param id The id of the category -+ * @param collateralBitmap The collateralBitmap of the category -+ */ -+ function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; -+ -+ /** -+ * @notice Replaces the current eMode borrowableBitmap. -+ * @param id The id of the category -+ * @param borrowableBitmap The borrowableBitmap of the category -+ */ -+ function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category -+ * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ -- function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); -+ function getEModeCategoryData( -+ uint8 id -+ ) external view returns (DataTypes.EModeCategoryLegacy memory); -+ -+ /** -+ * @notice Returns the label of an eMode category -+ * @param id The id of the category -+ * @return The label of the category -+ */ -+ function getEModeCategoryLabel(uint8 id) external view returns (string memory); -+ -+ /** -+ * @notice Returns the collateral config of an eMode category -+ * @param id The id of the category -+ * @return The ltv,lt,lb of the category -+ */ -+ function getEModeCategoryCollateralConfig( -+ uint8 id -+ ) external view returns (DataTypes.CollateralConfig memory); -+ -+ /** -+ * @notice Returns the collateralBitmap of an eMode category -+ * @param id The id of the category -+ * @return The collateralBitmap of the category -+ */ -+ function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); -+ -+ /** -+ * @notice Returns the borrowableBitmap of an eMode category -+ * @param id The id of the category -+ * @return The borrowableBitmap of the category -+ */ -+ function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode -@@ -2287,10 +2398,20 @@ interface IPool { - function resetIsolationModeTotalDebt(address asset) external; - - /** -- * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate -- * @return The percentage of available liquidity to borrow, expressed in bps -- */ -- function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); -+ * @notice Sets the liquidation grace period of the given asset -+ * @dev To enable a liquidation grace period, a timestamp in the future should be set, -+ * To disable a liquidation grace period, any timestamp in the past works, like 0 -+ * @param asset The address of the underlying asset to set the liquidationGracePeriod -+ * @param until Timestamp when the liquidation grace period will end -+ **/ -+ function setLiquidationGracePeriod(address asset, uint40 until) external; -+ -+ /** -+ * @notice Returns the liquidation grace period of the given asset -+ * @param asset The address of the underlying asset -+ * @return Timestamp when the liquidation grace period will end -+ **/ -+ function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans -@@ -2343,9 +2464,44 @@ interface IPool { - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; -+ -+ /** -+ * @notice Gets the address of the external FlashLoanLogic -+ */ -+ function getFlashLoanLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external BorrowLogic -+ */ -+ function getBorrowLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external BridgeLogic -+ */ -+ function getBridgeLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external EModeLogic -+ */ -+ function getEModeLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external LiquidationLogic -+ */ -+ function getLiquidationLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external PoolLogic -+ */ -+ function getPoolLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external SupplyLogic -+ */ -+ function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IInitializableAToken.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IInitializableAToken.sol - - /** - * @title IInitializableAToken -@@ -2398,7 +2554,7 @@ interface IInitializableAToken { - ) external; - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAToken.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAToken.sol - - /** - * @title IAToken -@@ -2532,7 +2688,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - function rescueTokens(address token, address to, uint256 amount) external; - } - + -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol +// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - + /** * @title IncentivizedERC20 @@ -2563,8 +2719,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { @@ -836,32 +41,11 @@ index efb0fd4..fd9dc66 100644 + _decimals = decimals_; POOL = pool; } - + @@ -2756,7 +2911,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { } } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol - - /** - * @title MintableIncentivizedERC20 -@@ -2818,7 +2973,7 @@ abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { - } - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol - - /** - * @title ScaledBalanceTokenBase -@@ -2967,14 +3122,14 @@ abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBa - } - } - --// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol -+// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/AToken.sol - + /** * @title Aave ERC20 AToken * @author Aave @@ -875,12 +59,12 @@ index efb0fd4..fd9dc66 100644 @@ -2982,16 +3137,9 @@ contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, I bytes32 public constant PERMIT_TYPEHASH = keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); - + - uint256 public constant ATOKEN_REVISION = 0x2; - address internal _treasury; address internal _underlyingAsset; - + - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return ATOKEN_REVISION; @@ -917,7 +101,7 @@ index efb0fd4..fd9dc66 100644 - ); - } + ) public virtual; - + /// @inheritdoc IAToken function mint( @@ -3208,3 +3334,50 @@ contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, I diff --git a/diffs/ARBITRUM_LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL_DIFF.md b/diffs/ARBITRUM_LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL_DIFF.md index 8f77fa6a..5ecc63cd 100644 --- a/diffs/ARBITRUM_LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL_DIFF.md +++ b/diffs/ARBITRUM_LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL_DIFF.md @@ -3,219 +3,10 @@ diff --git a/./downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol b/./dow index 8c00995..8226df6 100644 --- a/./downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol +++ b/./downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 --pragma solidity =0.8.10 ^0.8.0 ^0.8.10; -+pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -77,7 +77,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol -+// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - - // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -@@ -333,22 +333,41 @@ library SafeCast { - } - } - --// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol -+// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol -+ -+interface IEACAggregatorProxy { -+ function decimals() external view returns (uint8); -+ -+ function latestAnswer() external view returns (int256); -+ -+ function latestTimestamp() external view returns (uint256); -+ -+ function latestRound() external view returns (uint256); -+ -+ function getAnswer(uint256 roundId) external view returns (int256); -+ -+ function getTimestamp(uint256 roundId) external view returns (uint256); -+ -+ event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); -+ event NewRound(uint256 indexed roundId, address indexed startedBy); -+} -+ -+// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/interfaces/IScaledBalanceToken.sol - - /** - * @title IScaledBalanceToken - * @author Aave -- * @notice Defines the basic interface for a scaledbalance token. -- **/ -+ * @notice Defines the basic interface for a scaled-balance token. -+ */ - interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint -- * @param onBehalfOf The address of the user that will receive the minted scaled balance tokens -- * @param value The amount being minted (user entered amount + balance increase from interest) -- * @param balanceIncrease The increase in balance since the last action of the user -+ * @param onBehalfOf The address of the user that will receive the minted tokens -+ * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) -+ * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve -- **/ -+ */ - event Mint( - address indexed caller, - address indexed onBehalfOf, -@@ -358,13 +377,14 @@ interface IScaledBalanceToken { - ); - - /** -- * @dev Emitted after scaled balance tokens are burned -- * @param from The address from which the scaled tokens will be burned -+ * @dev Emitted after the burn action -+ * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address -+ * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any -- * @param value The amount being burned (user entered amount - balance increase from interest) -- * @param balanceIncrease The increase in balance since the last action of the user -+ * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) -+ * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve -- **/ -+ */ - event Burn( - address indexed from, - address indexed target, -@@ -379,7 +399,7 @@ interface IScaledBalanceToken { - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user -- **/ -+ */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** -@@ -387,24 +407,24 @@ interface IScaledBalanceToken { - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply -- **/ -+ */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply -- **/ -+ */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray -- **/ -+ */ - function getPreviousIndex(address user) external view returns (uint256); - } - --// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol -+// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol - - /** - * @title VersionedInitializable -@@ -456,13 +476,13 @@ abstract contract VersionedInitializable { - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number -- **/ -+ */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor -- **/ -+ */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not -@@ -481,26 +501,7 @@ abstract contract VersionedInitializable { - uint256[50] private ______gap; - } - --// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/misc/interfaces/IEACAggregatorProxy.sol -- --interface IEACAggregatorProxy { -- function decimals() external view returns (uint8); -- -- function latestAnswer() external view returns (int256); -- -- function latestTimestamp() external view returns (uint256); -- -- function latestRound() external view returns (uint256); -- -- function getAnswer(uint256 roundId) external view returns (int256); -- -- function getTimestamp(uint256 roundId) external view returns (uint256); -- -- event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); -- event NewRound(uint256 indexed roundId, address indexed startedBy); --} -- --// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsDistributor.sol -+// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsDistributor.sol - - /** - * @title IRewardsDistributor -@@ -677,7 +678,7 @@ interface IRewardsDistributor { - function getEmissionManager() external view returns (address); - } - --// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/ITransferStrategyBase.sol -+// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/ITransferStrategyBase.sol - - interface ITransferStrategyBase { - event EmergencyWithdrawal( -@@ -715,7 +716,7 @@ interface ITransferStrategyBase { - function emergencyWithdrawal(address token, address to, uint256 amount) external; - } - --// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol -+// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - - interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); -@@ -725,7 +726,7 @@ interface IERC20Detailed is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/libraries/RewardsDataTypes.sol -+// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/libraries/RewardsDataTypes.sol - - library RewardsDataTypes { - struct RewardsConfigInput { -@@ -776,7 +777,7 @@ library RewardsDataTypes { - } - } - --// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsController.sol -+// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsController.sol - - /** - * @title IRewardsController -@@ -974,7 +975,7 @@ interface IRewardsController is IRewardsDistributor { - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - } - + -// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsDistributor.sol +// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsDistributor.sol - + /** * @title RewardsDistributor @@ -1014,7 +1015,7 @@ abstract contract RewardsDistributor is IRewardsDistributor { @@ -235,23 +26,23 @@ index 8c00995..8226df6 100644 + ) external view override returns (uint256) { return _assets[asset].rewards[reward].usersData[user].index; } - + @@ -1505,7 +1506,7 @@ abstract contract RewardsDistributor is IRewardsDistributor { } } - + -// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsController.sol +// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsController.sol - + /** * @title RewardsController @@ -1515,7 +1516,7 @@ abstract contract RewardsDistributor is IRewardsDistributor { contract RewardsController is RewardsDistributor, VersionedInitializable, IRewardsController { using SafeCast for uint256; - + - uint256 public constant REVISION = 2; + uint256 public constant REVISION = 1; - + // This mapping allows whitelisted addresses to claim on behalf of others // useful for contracts that hold tokens to be rewarded but don't have any native logic to claim Liquidity Mining rewards ``` diff --git a/diffs/ARBITRUM_LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL_DIFF.md b/diffs/ARBITRUM_LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL_DIFF.md index dcc6d057..3b6ed003 100644 --- a/diffs/ARBITRUM_LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL_DIFF.md +++ b/diffs/ARBITRUM_LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL_DIFF.md @@ -3,820 +3,10 @@ diff --git a/./downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol b/./downl index d6d70f1..1be027a 100644 --- a/./downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol +++ b/./downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 --pragma solidity =0.8.10 ^0.8.0; -+pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol - - /* - * @dev Provides information about the current execution context, including the -@@ -24,7 +24,7 @@ abstract contract Context { - } - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -100,7 +100,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - - // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -@@ -356,7 +356,7 @@ library SafeCast { - } - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol - - /** - * @title IAaveIncentivesController -@@ -375,7 +375,7 @@ interface IAaveIncentivesController { - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/ICreditDelegationToken.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/ICreditDelegationToken.sol - - /** - * @title ICreditDelegationToken -@@ -435,7 +435,7 @@ interface ICreditDelegationToken { - ) external; - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider -@@ -662,7 +662,7 @@ interface IPoolAddressesProvider { - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol - - /** - * @title IScaledBalanceToken -@@ -734,7 +734,7 @@ interface IScaledBalanceToken { - function getPreviousIndex(address user) external view returns (uint256); - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol - - /** - * @title VersionedInitializable -@@ -811,7 +811,7 @@ abstract contract VersionedInitializable { - uint256[50] private ______gap; - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -849,17 +849,14 @@ library Errors { - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' -- string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' -- string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' -- string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' -@@ -872,7 +869,6 @@ library Errors { - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' -- string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' -@@ -901,17 +897,24 @@ library Errors { - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' -- string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' -- string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled -+ string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid -+ string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed -+ string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed -+ string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 -+ string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' -+ string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' -+ string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range -+ string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state -+ string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol - - /** - * @title WadRayMath library -@@ -1037,10 +1040,14 @@ library WadRayMath { - } - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { -- struct ReserveData { -+ /** -+ * This exists specifically to maintain the `getReserveData()` interface, since the new, internal -+ * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. -+ */ -+ struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray -@@ -1051,7 +1058,7 @@ library DataTypes { - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; -- //the current stable borrow rate. Expressed in ray -+ // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; -@@ -1059,7 +1066,7 @@ library DataTypes { - uint16 id; - //aToken address - address aTokenAddress; -- //stableDebtToken address -+ // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; -@@ -1073,6 +1080,43 @@ library DataTypes { - uint128 isolationModeTotalDebt; - } - -+ struct ReserveData { -+ //stores the reserve configuration -+ ReserveConfigurationMap configuration; -+ //the liquidity index. Expressed in ray -+ uint128 liquidityIndex; -+ //the current supply rate. Expressed in ray -+ uint128 currentLiquidityRate; -+ //variable borrow index. Expressed in ray -+ uint128 variableBorrowIndex; -+ //the current variable borrow rate. Expressed in ray -+ uint128 currentVariableBorrowRate; -+ // DEPRECATED on v3.2.0 -+ uint128 __deprecatedStableBorrowRate; -+ //timestamp of last update -+ uint40 lastUpdateTimestamp; -+ //the id of the reserve. Represents the position in the list of the active reserves -+ uint16 id; -+ //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed -+ uint40 liquidationGracePeriodUntil; -+ //aToken address -+ address aTokenAddress; -+ // DEPRECATED on v3.2.0 -+ address __deprecatedStableDebtTokenAddress; -+ //variableDebtToken address -+ address variableDebtTokenAddress; -+ //address of the interest rate strategy -+ address interestRateStrategyAddress; -+ //the current treasury balance, scaled -+ uint128 accruedToTreasury; -+ //the outstanding unbacked aTokens minted through the bridging feature -+ uint128 unbacked; -+ //the outstanding debt borrowed against this asset in isolation mode -+ uint128 isolationModeTotalDebt; -+ //the amount of underlying accounted for by the protocol -+ uint128 virtualUnderlyingBalance; -+ } -+ - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold -@@ -1081,18 +1125,20 @@ library DataTypes { - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled -- //bit 59: stable rate borrowing enabled -+ //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled -- //bit 62-63: reserved -+ //bit 62: siloed borrowing enabled -+ //bit 63: flashloaning enabled - //bit 64-79: reserve factor -- //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap -- //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap -- //bit 152-167 liquidation protocol fee -- //bit 168-175 eMode category -- //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled -- //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals -- //bit 252-255 unused -+ //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap -+ //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap -+ //bit 152-167: liquidation protocol fee -+ //bit 168-175: DEPRECATED: eMode category -+ //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled -+ //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals -+ //bit 252: virtual accounting is enabled for the reserve -+ //bit 253-255 unused - - uint256 data; - } -@@ -1106,30 +1152,49 @@ library DataTypes { - uint256 data; - } - -- struct EModeCategory { -+ // DEPRECATED: kept for backwards compatibility, might be removed in a future version -+ struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; -- // each eMode category may or may not have a custom oracle to override the individual assets price oracles -+ // DEPRECATED - address priceSource; - string label; - } - -+ struct CollateralConfig { -+ uint16 ltv; -+ uint16 liquidationThreshold; -+ uint16 liquidationBonus; -+ } -+ -+ struct EModeCategoryBaseConfiguration { -+ uint16 ltv; -+ uint16 liquidationThreshold; -+ uint16 liquidationBonus; -+ string label; -+ } -+ -+ struct EModeCategory { -+ // each eMode category has a custom ltv and liquidation threshold -+ uint16 ltv; -+ uint16 liquidationThreshold; -+ uint16 liquidationBonus; -+ uint128 collateralBitmap; -+ string label; -+ uint128 borrowableBitmap; -+ } -+ - enum InterestRateMode { - NONE, -- STABLE, -+ __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; -- uint256 currPrincipalStableDebt; -- uint256 currAvgStableBorrowRate; -- uint256 currTotalStableDebt; -- uint256 nextAvgStableBorrowRate; -- uint256 nextTotalStableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; -@@ -1139,10 +1204,8 @@ library DataTypes { - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; -- address stableDebtTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; -- uint40 stableDebtLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { -@@ -1172,7 +1235,6 @@ library DataTypes { - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; -- uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; -@@ -1224,9 +1286,9 @@ library DataTypes { - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; -- uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address addressesProvider; -+ address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } -@@ -1265,7 +1327,6 @@ library DataTypes { - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; -- uint256 maxStableLoanPercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; -@@ -1286,18 +1347,16 @@ library DataTypes { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; -- uint256 totalStableDebt; -- uint256 totalVariableDebt; -- uint256 averageStableBorrowRate; -+ uint256 totalDebt; - uint256 reserveFactor; - address reserve; -- address aToken; -+ bool usingVirtualBalance; -+ uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; -- address stableDebtAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; -@@ -1305,7 +1364,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol - - /** - * @title EIP712Base -@@ -1375,7 +1434,7 @@ abstract contract EIP712Base { - function _EIP712BaseId() internal view virtual returns (string memory); - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - - interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); -@@ -1385,7 +1444,7 @@ interface IERC20Detailed is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IACLManager.sol - - /** - * @title IACLManager -@@ -1558,7 +1617,7 @@ interface IACLManager { - function isAssetListingAdmin(address admin) external view returns (bool); - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPool.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPool.sol - - /** - * @title IPool -@@ -1623,7 +1682,7 @@ interface IPool { - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out -- * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable -+ * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ -@@ -1653,18 +1712,6 @@ interface IPool { - bool useATokens - ); - -- /** -- * @dev Emitted on swapBorrowRateMode() -- * @param reserve The address of the underlying asset of the reserve -- * @param user The address of the user swapping his rate mode -- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable -- */ -- event SwapBorrowRateMode( -- address indexed reserve, -- address indexed user, -- DataTypes.InterestRateMode interestRateMode -- ); -- - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve -@@ -1693,20 +1740,14 @@ interface IPool { - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - -- /** -- * @dev Emitted on rebalanceStableBorrowRate() -- * @param reserve The address of the underlying asset of the reserve -- * @param user The address of the user for which the rebalance has been executed -- */ -- event RebalanceStableBorrowRate(address indexed reserve, address indexed user); -- - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed -- * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt -+ * @param interestRateMode The flashloan mode: 0 for regular flashloan, -+ * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ -@@ -1745,7 +1786,7 @@ interface IPool { - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate -- * @param stableBorrowRate The next stable borrow rate -+ * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index -@@ -1844,13 +1885,12 @@ interface IPool { - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower -- * already supplied enough collateral, or he was given enough allowance by a credit delegator on the -- * corresponding debt token (StableDebtToken or VariableDebtToken) -+ * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet -- * and 100 stable/variable debt tokens, depending on the `interestRateMode` -+ * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed -- * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable -+ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself -@@ -1867,11 +1907,11 @@ interface IPool { - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned -- * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address -+ * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` -- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable -+ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed -@@ -1890,7 +1930,7 @@ interface IPool { - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` -- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable -+ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed -@@ -1914,13 +1954,13 @@ interface IPool { - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens -- * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens -+ * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` -- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable -+ * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( -@@ -1929,24 +1969,6 @@ interface IPool { - uint256 interestRateMode - ) external returns (uint256); - -- /** -- * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa -- * @param asset The address of the underlying asset borrowed -- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable -- */ -- function swapBorrowRateMode(address asset, uint256 interestRateMode) external; -- -- /** -- * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. -- * - Users can be rebalanced if the following conditions are satisfied: -- * 1. Usage ratio is above 95% -- * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too -- * much has been borrowed at a stable rate and suppliers are not earning enough -- * @param asset The address of the underlying asset borrowed -- * @param user The address of the user to be rebalanced -- */ -- function rebalanceStableBorrowRate(address asset, address user) external; -- - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied -@@ -1983,9 +2005,9 @@ interface IPool { - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver -- * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address -+ * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address -- * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 -+ * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man -@@ -2050,14 +2072,12 @@ interface IPool { - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve -- * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, -- address stableDebtAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; -@@ -2065,6 +2085,7 @@ interface IPool { - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract -+ * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; -@@ -2080,6 +2101,22 @@ interface IPool { - address rateStrategyAddress - ) external; - -+ /** -+ * @notice Accumulates interest to all indexes of the reserve -+ * @dev Only callable by the PoolConfigurator contract -+ * @dev To be used when required by the configurator, for example when updating interest rates strategy data -+ * @param asset The address of the underlying asset of the reserve -+ */ -+ function syncIndexesState(address asset) external; -+ -+ /** -+ * @notice Updates interest rates on the reserve data -+ * @dev Only callable by the PoolConfigurator contract -+ * @dev To be used when required by the configurator, for example when updating interest rates strategy data -+ * @param asset The address of the underlying asset of the reserve -+ */ -+ function syncRatesState(address asset) external; -+ - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract -@@ -2135,7 +2172,24 @@ interface IPool { - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ -- function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); -+ function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); -+ -+ /** -+ * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 -+ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) -+ * @param asset The address of the underlying asset of the reserve -+ * @return The state and configuration data of the reserve with virtual accounting -+ */ -+ function getReserveDataExtended( -+ address asset -+ ) external view returns (DataTypes.ReserveData memory); -+ -+ /** -+ * @notice Returns the virtual underlying balance of the reserve -+ * @param asset The address of the underlying asset of the reserve -+ * @return The reserve virtual underlying balance -+ */ -+ function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer -@@ -2163,6 +2217,13 @@ interface IPool { - */ - function getReservesList() external view returns (address[] memory); - -+ /** -+ * @notice Returns the number of initialized reserves -+ * @dev It includes dropped reserves -+ * @return The count -+ */ -+ function getReservesCount() external view returns (uint256); -+ - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct -@@ -2198,20 +2259,70 @@ interface IPool { - ) external; - - /** -- * @notice Configures a new category for the eMode. -+ * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ -- function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; -+ function configureEModeCategory( -+ uint8 id, -+ DataTypes.EModeCategoryBaseConfiguration memory config -+ ) external; -+ -+ /** -+ * @notice Replaces the current eMode collateralBitmap. -+ * @param id The id of the category -+ * @param collateralBitmap The collateralBitmap of the category -+ */ -+ function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; -+ -+ /** -+ * @notice Replaces the current eMode borrowableBitmap. -+ * @param id The id of the category -+ * @param borrowableBitmap The borrowableBitmap of the category -+ */ -+ function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category -+ * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ -- function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); -+ function getEModeCategoryData( -+ uint8 id -+ ) external view returns (DataTypes.EModeCategoryLegacy memory); -+ -+ /** -+ * @notice Returns the label of an eMode category -+ * @param id The id of the category -+ * @return The label of the category -+ */ -+ function getEModeCategoryLabel(uint8 id) external view returns (string memory); -+ -+ /** -+ * @notice Returns the collateral config of an eMode category -+ * @param id The id of the category -+ * @return The ltv,lt,lb of the category -+ */ -+ function getEModeCategoryCollateralConfig( -+ uint8 id -+ ) external view returns (DataTypes.CollateralConfig memory); -+ -+ /** -+ * @notice Returns the collateralBitmap of an eMode category -+ * @param id The id of the category -+ * @return The collateralBitmap of the category -+ */ -+ function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); -+ -+ /** -+ * @notice Returns the borrowableBitmap of an eMode category -+ * @param id The id of the category -+ * @return The borrowableBitmap of the category -+ */ -+ function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode -@@ -2234,10 +2345,20 @@ interface IPool { - function resetIsolationModeTotalDebt(address asset) external; - - /** -- * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate -- * @return The percentage of available liquidity to borrow, expressed in bps -- */ -- function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); -+ * @notice Sets the liquidation grace period of the given asset -+ * @dev To enable a liquidation grace period, a timestamp in the future should be set, -+ * To disable a liquidation grace period, any timestamp in the past works, like 0 -+ * @param asset The address of the underlying asset to set the liquidationGracePeriod -+ * @param until Timestamp when the liquidation grace period will end -+ **/ -+ function setLiquidationGracePeriod(address asset, uint40 until) external; -+ -+ /** -+ * @notice Returns the liquidation grace period of the given asset -+ * @param asset The address of the underlying asset -+ * @return Timestamp when the liquidation grace period will end -+ **/ -+ function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans -@@ -2290,9 +2411,44 @@ interface IPool { - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; -+ -+ /** -+ * @notice Gets the address of the external FlashLoanLogic -+ */ -+ function getFlashLoanLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external BorrowLogic -+ */ -+ function getBorrowLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external BridgeLogic -+ */ -+ function getBridgeLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external EModeLogic -+ */ -+ function getEModeLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external LiquidationLogic -+ */ -+ function getLiquidationLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external PoolLogic -+ */ -+ function getPoolLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external SupplyLogic -+ */ -+ function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IInitializableDebtToken.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IInitializableDebtToken.sol - - /** - * @title IInitializableDebtToken -@@ -2341,12 +2497,12 @@ interface IInitializableDebtToken { - ) external; - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/DebtTokenBase.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/DebtTokenBase.sol - - /** - * @title DebtTokenBase - * @author Aave -- * @notice Base contract for different types of debt tokens, like StableDebtToken or VariableDebtToken -+ * @notice Base contract for different types of debt tokens, like VariableDebtToken - */ - abstract contract DebtTokenBase is - VersionedInitializable, -@@ -2437,7 +2593,7 @@ abstract contract DebtTokenBase is - } - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IVariableDebtToken.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IVariableDebtToken.sol - - /** - * @title IVariableDebtToken -@@ -2480,7 +2636,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - } - + -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - + /** * @title IncentivizedERC20 @@ -2511,8 +2667,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { @@ -851,32 +41,14 @@ index d6d70f1..1be027a 100644 + _decimals = decimals_; POOL = pool; } - + @@ -2704,7 +2859,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { } } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol - - /** - * @title MintableIncentivizedERC20 -@@ -2766,7 +2921,7 @@ abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { - } - } - --// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol -+// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol - - /** - * @title ScaledBalanceTokenBase -@@ -2915,7 +3070,7 @@ abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBa - } - } - + -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/VariableDebtToken.sol +// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/VariableDebtToken.sol - + /** * @title VariableDebtToken @@ -2924,12 +3079,10 @@ abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBa @@ -887,7 +59,7 @@ index d6d70f1..1be027a 100644 +abstract contract VariableDebtToken is DebtTokenBase, ScaledBalanceTokenBase, IVariableDebtToken { using WadRayMath for uint256; using SafeCast for uint256; - + - uint256 public constant DEBT_TOKEN_REVISION = 0x2; - /** @@ -924,7 +96,7 @@ index d6d70f1..1be027a 100644 - return DEBT_TOKEN_REVISION; - } + ) external virtual; - + /// @inheritdoc IERC20 function balanceOf(address user) public view virtual override returns (uint256) { @@ -3056,3 +3184,47 @@ contract VariableDebtToken is DebtTokenBase, ScaledBalanceTokenBase, IVariableDe diff --git a/diffs/ARBITRUM_LINEA/EMISSION_MANAGER_DIFF.md b/diffs/ARBITRUM_LINEA/EMISSION_MANAGER_DIFF.md index 6c294aca..b1110bfc 100644 --- a/diffs/ARBITRUM_LINEA/EMISSION_MANAGER_DIFF.md +++ b/diffs/ARBITRUM_LINEA/EMISSION_MANAGER_DIFF.md @@ -3,39 +3,16 @@ diff --git a/./downloads/ARBITRUM/EMISSION_MANAGER.sol b/./downloads/LINEA/EMISS index be75e57..9de846c 100644 --- a/./downloads/ARBITRUM/EMISSION_MANAGER.sol +++ b/./downloads/LINEA/EMISSION_MANAGER.sol -@@ -1,7 +1,7 @@ --// SPDX-License-Identifier: agpl-3.0 --pragma solidity =0.8.10; -+// SPDX-License-Identifier: BUSL-1.1 -+pragma solidity ^0.8.10; - --// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol -+// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol - - /* - * @dev Provides information about the current execution context, including the -@@ -24,7 +24,7 @@ abstract contract Context { - } - } - --// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol -+// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol - - interface IEACAggregatorProxy { - function decimals() external view returns (uint8); -@@ -43,7 +43,7 @@ interface IEACAggregatorProxy { - event NewRound(uint256 indexed roundId, address indexed startedBy); - } - + -// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol +// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsDistributor.sol - + /** * @title IRewardsDistributor @@ -89,16 +89,6 @@ interface IRewardsDistributor { uint256 rewardsAccrued ); - + - /** - * @dev Emitted when the emission manager address is updated. - * @param oldEmissionManager The address of the old emission manager @@ -52,7 +29,7 @@ index be75e57..9de846c 100644 @@ -154,6 +144,15 @@ interface IRewardsDistributor { address reward ) external view returns (uint256, uint256, uint256, uint256); - + + /** + * @dev Calculates the next value of an specific distribution index, with validations. + * @param asset The incentivized asset @@ -84,74 +61,15 @@ index be75e57..9de846c 100644 - */ - function setEmissionManager(address emissionManager) external; } - --// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol -+// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/ITransferStrategyBase.sol - - interface ITransferStrategyBase { - event EmergencyWithdrawal( -@@ -258,7 +258,7 @@ interface ITransferStrategyBase { - function emergencyWithdrawal(address token, address to, uint256 amount) external; - } - --// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol -+// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol - - /** - * @dev Contract module which provides a basic access control mechanism, where -@@ -324,7 +324,7 @@ contract Ownable is Context { - } - } - --// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol -+// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/libraries/RewardsDataTypes.sol - - library RewardsDataTypes { - struct RewardsConfigInput { -@@ -344,27 +344,38 @@ library RewardsDataTypes { - } - - struct UserData { -- uint104 index; // matches reward index -+ // Liquidity index of the reward distribution for the user -+ uint104 index; -+ // Amount of accrued rewards for the user since last user index update - uint128 accrued; - } - - struct RewardData { -+ // Liquidity index of the reward distribution - uint104 index; -+ // Amount of reward tokens distributed per second - uint88 emissionPerSecond; -+ // Timestamp of the last reward index update - uint32 lastUpdateTimestamp; -+ // The end of the distribution of rewards (in seconds) - uint32 distributionEnd; -+ // Map of user addresses and their rewards data (userAddress => userData) - mapping(address => UserData) usersData; - } - - struct AssetData { -+ // Map of reward token addresses and their data (rewardTokenAddress => rewardData) - mapping(address => RewardData) rewards; -+ // List of reward token addresses for the asset - mapping(uint128 => address) availableRewards; -+ // Count of reward tokens for the asset - uint128 availableRewardsCount; -+ // Number of decimals of the asset - uint8 decimals; - } - } - + -// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol +// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsController.sol - + /** * @title IRewardsController @@ -470,12 +481,13 @@ interface IRewardsController is IRewardsDistributor { function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - + /** - * @dev Called by the corresponding asset on any update that affects the rewards distribution - * @param user The address of the user @@ -165,22 +83,22 @@ index be75e57..9de846c 100644 **/ - function handleAction(address user, uint256 userBalance, uint256 totalSupply) external; + function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - + /** * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards @@ -561,7 +573,7 @@ interface IRewardsController is IRewardsDistributor { ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); } - + -// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IEmissionManager.sol +// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IEmissionManager.sol - + /** * @title IEmissionManager @@ -645,13 +657,6 @@ interface IEmissionManager { */ function setClaimer(address user, address claimer) external; - + - /** - * @dev Updates the address of the emission manager - * @dev Only callable by the owner of the EmissionManager @@ -194,14 +112,14 @@ index be75e57..9de846c 100644 @@ -681,7 +686,7 @@ interface IEmissionManager { function getEmissionAdmin(address reward) external view returns (address); } - + -// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/EmissionManager.sol +// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/EmissionManager.sol - + /** * @title EmissionManager @@ -704,11 +709,9 @@ contract EmissionManager is Ownable, IEmissionManager { - + /** * Constructor. - * @param controller The address of the RewardsController contract @@ -212,11 +130,11 @@ index be75e57..9de846c 100644 + constructor(address owner) { transferOwnership(owner); } - + @@ -762,11 +765,6 @@ contract EmissionManager is Ownable, IEmissionManager { _rewardsController.setClaimer(user, claimer); } - + - /// @inheritdoc IEmissionManager - function setEmissionManager(address emissionManager) external override onlyOwner { - _rewardsController.setEmissionManager(emissionManager); diff --git a/diffs/ARBITRUM_LINEA/EMODE_LOGIC_DIFF.md b/diffs/ARBITRUM_LINEA/EMODE_LOGIC_DIFF.md index 4cf04f31..f963d2e5 100644 --- a/diffs/ARBITRUM_LINEA/EMODE_LOGIC_DIFF.md +++ b/diffs/ARBITRUM_LINEA/EMODE_LOGIC_DIFF.md @@ -3,317 +3,5 @@ diff --git a/./downloads/ARBITRUM/EMODE_LOGIC.sol b/./downloads/LINEA/EMODE_LOGI index 38363c8..948a894 100644 --- a/./downloads/ARBITRUM/EMODE_LOGIC.sol +++ b/./downloads/LINEA/EMODE_LOGIC.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 - pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - - // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -@@ -221,7 +221,7 @@ library Address { - } - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - - /* - * @dev Provides information about the current execution context, including the -@@ -244,7 +244,7 @@ abstract contract Context { - } - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - - /** - * @dev External interface of AccessControl declared to support ERC165 detection. -@@ -334,7 +334,7 @@ interface IAccessControl { - function renounceRole(bytes32 role, address account) external; - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -410,7 +410,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - - // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -@@ -666,7 +666,7 @@ library SafeCast { - } - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol - - /** - * @title IAaveIncentivesController -@@ -685,7 +685,7 @@ interface IAaveIncentivesController { - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider -@@ -912,7 +912,7 @@ interface IPoolAddressesProvider { - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol - - /** - * @title IPriceOracleGetter -@@ -942,7 +942,7 @@ interface IPriceOracleGetter { - function getAssetPrice(address asset) external view returns (uint256); - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol - - /** - * @title IScaledBalanceToken -@@ -1014,7 +1014,7 @@ interface IScaledBalanceToken { - function getPreviousIndex(address user) external view returns (uint256); - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -1117,7 +1117,7 @@ library Errors { - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - - /** - * @title PercentageMath library -@@ -1178,7 +1178,7 @@ library PercentageMath { - } - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - - /** - * @title WadRayMath library -@@ -1304,7 +1304,7 @@ library WadRayMath { - } - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { - /** -@@ -1628,7 +1628,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - - /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library - /// @author Gnosis Developers -@@ -1741,7 +1741,7 @@ library GPv2SafeERC20 { - } - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - - interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); -@@ -1751,7 +1751,7 @@ interface IERC20Detailed is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol - - /** - * @title IACLManager -@@ -1924,7 +1924,7 @@ interface IACLManager { - function isAssetListingAdmin(address admin) external view returns (bool); - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - - /** - * @title IPriceOracleSentinel -@@ -1989,7 +1989,7 @@ interface IPriceOracleSentinel { - function getGracePeriod() external view returns (uint256); - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - - /** - * @title IReserveInterestRateStrategy -@@ -2016,7 +2016,7 @@ interface IReserveInterestRateStrategy { - ) external view returns (uint256, uint256); - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol - - /** - * @title MathUtils library -@@ -2113,7 +2113,7 @@ library MathUtils { - } - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol - - /** - * @title IPool -@@ -2672,6 +2672,7 @@ interface IPool { - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 -+ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ -@@ -2943,7 +2944,7 @@ interface IPool { - function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - - /** - * @title ReserveConfiguration library -@@ -2958,6 +2959,7 @@ library ReserveConfiguration { - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore -+ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore -@@ -2966,7 +2968,7 @@ library ReserveConfiguration { - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -- //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory -+ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -@@ -3523,7 +3525,7 @@ library ReserveConfiguration { - } - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - - /** - * @title EModeConfiguration library -@@ -3572,7 +3574,7 @@ library EModeConfiguration { - } - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - - /** - * @title UserConfiguration library -@@ -3804,7 +3806,7 @@ library UserConfiguration { - } - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol - - /** - * @title IInitializableAToken -@@ -3857,7 +3859,7 @@ interface IInitializableAToken { - ) external; - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol - - /** - * @title IInitializableDebtToken -@@ -3906,7 +3908,7 @@ interface IInitializableDebtToken { - ) external; - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol - - /** - * @title IVariableDebtToken -@@ -3949,7 +3951,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol - - /** - * @title IAToken -@@ -4083,7 +4085,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - function rescueTokens(address token, address to, uint256 amount) external; - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - - /** - * @title IncentivizedERC20 -@@ -4306,7 +4308,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { - } - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - - /** - * @title ReserveLogic library -@@ -4607,7 +4609,7 @@ library ReserveLogic { - } - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - - /** - * @title GenericLogic library -@@ -4851,7 +4853,7 @@ library GenericLogic { - } - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - - /** - * @title ReserveLogic library -@@ -5471,7 +5473,7 @@ library ValidationLogic { - } - } - --// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol -+// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - - /** - * @title EModeLogic library + ``` diff --git a/diffs/ARBITRUM_LINEA/FLASHLOAN_LOGIC_DIFF.md b/diffs/ARBITRUM_LINEA/FLASHLOAN_LOGIC_DIFF.md index 320bbb60..224aed39 100644 --- a/diffs/ARBITRUM_LINEA/FLASHLOAN_LOGIC_DIFF.md +++ b/diffs/ARBITRUM_LINEA/FLASHLOAN_LOGIC_DIFF.md @@ -3,362 +3,5 @@ diff --git a/./downloads/ARBITRUM/FLASHLOAN_LOGIC.sol b/./downloads/LINEA/FLASHL index 35feed8..639a33a 100644 --- a/./downloads/ARBITRUM/FLASHLOAN_LOGIC.sol +++ b/./downloads/LINEA/FLASHLOAN_LOGIC.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 - pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - - // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -@@ -221,7 +221,7 @@ library Address { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - - /* - * @dev Provides information about the current execution context, including the -@@ -244,7 +244,7 @@ abstract contract Context { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - - /** - * @dev External interface of AccessControl declared to support ERC165 detection. -@@ -334,7 +334,7 @@ interface IAccessControl { - function renounceRole(bytes32 role, address account) external; - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -410,7 +410,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - - // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -@@ -666,7 +666,7 @@ library SafeCast { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol - - /** - * @title IAaveIncentivesController -@@ -685,7 +685,7 @@ interface IAaveIncentivesController { - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider -@@ -912,7 +912,7 @@ interface IPoolAddressesProvider { - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol - - /** - * @title IPriceOracleGetter -@@ -942,7 +942,7 @@ interface IPriceOracleGetter { - function getAssetPrice(address asset) external view returns (uint256); - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol - - /** - * @title IScaledBalanceToken -@@ -1014,7 +1014,7 @@ interface IScaledBalanceToken { - function getPreviousIndex(address user) external view returns (uint256); - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -1117,7 +1117,7 @@ library Errors { - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - - /** - * @title PercentageMath library -@@ -1178,7 +1178,7 @@ library PercentageMath { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - - /** - * @title WadRayMath library -@@ -1304,7 +1304,7 @@ library WadRayMath { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { - /** -@@ -1628,7 +1628,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - - /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library - /// @author Gnosis Developers -@@ -1741,7 +1741,7 @@ library GPv2SafeERC20 { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - - interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); -@@ -1751,7 +1751,7 @@ interface IERC20Detailed is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol - - /** - * @title IACLManager -@@ -1924,7 +1924,7 @@ interface IACLManager { - function isAssetListingAdmin(address admin) external view returns (bool); - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - - /** - * @title IPriceOracleSentinel -@@ -1989,7 +1989,7 @@ interface IPriceOracleSentinel { - function getGracePeriod() external view returns (uint256); - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - - /** - * @title IReserveInterestRateStrategy -@@ -2016,7 +2016,7 @@ interface IReserveInterestRateStrategy { - ) external view returns (uint256, uint256); - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol - - /** - * @title MathUtils library -@@ -2113,7 +2113,7 @@ library MathUtils { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol - - /** - * @title IPool -@@ -2672,6 +2672,7 @@ interface IPool { - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 -+ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ -@@ -2943,7 +2944,7 @@ interface IPool { - function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - - /** - * @title ReserveConfiguration library -@@ -2958,6 +2959,7 @@ library ReserveConfiguration { - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore -+ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore -@@ -2966,7 +2968,7 @@ library ReserveConfiguration { - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -- //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory -+ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -@@ -3523,7 +3525,7 @@ library ReserveConfiguration { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol - - /** - * @title IFlashLoanReceiver -@@ -3556,7 +3558,7 @@ interface IFlashLoanReceiver { - function POOL() external view returns (IPool); - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol - - /** - * @title IFlashLoanSimpleReceiver -@@ -3589,7 +3591,7 @@ interface IFlashLoanSimpleReceiver { - function POOL() external view returns (IPool); - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - - /** - * @title EModeConfiguration library -@@ -3638,7 +3640,7 @@ library EModeConfiguration { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - - /** - * @title UserConfiguration library -@@ -3870,7 +3872,7 @@ library UserConfiguration { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol - - /** - * @title IInitializableAToken -@@ -3923,7 +3925,7 @@ interface IInitializableAToken { - ) external; - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol - - /** - * @title IInitializableDebtToken -@@ -3972,7 +3974,7 @@ interface IInitializableDebtToken { - ) external; - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol - - /** - * @title IsolationModeLogic library -@@ -4031,7 +4033,7 @@ library IsolationModeLogic { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol - - /** - * @title IVariableDebtToken -@@ -4074,7 +4076,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol - - /** - * @title IAToken -@@ -4208,7 +4210,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - function rescueTokens(address token, address to, uint256 amount) external; - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - - /** - * @title IncentivizedERC20 -@@ -4431,7 +4433,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - - /** - * @title ReserveLogic library -@@ -4732,7 +4734,7 @@ library ReserveLogic { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - - /** - * @title EModeLogic library -@@ -4794,7 +4796,7 @@ library EModeLogic { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - - /** - * @title GenericLogic library -@@ -5038,7 +5040,7 @@ library GenericLogic { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - - /** - * @title ReserveLogic library -@@ -5658,7 +5660,7 @@ library ValidationLogic { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol - - /** - * @title BorrowLogic library -@@ -5880,7 +5882,7 @@ library BorrowLogic { - } - } - --// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol -+// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol - - /** - * @title FlashLoanLogic library + ``` diff --git a/diffs/ARBITRUM_LINEA/L2_ENCODER_DIFF.md b/diffs/ARBITRUM_LINEA/L2_ENCODER_DIFF.md index 30966a65..ab2c80c0 100644 --- a/diffs/ARBITRUM_LINEA/L2_ENCODER_DIFF.md +++ b/diffs/ARBITRUM_LINEA/L2_ENCODER_DIFF.md @@ -3,1036 +3,10 @@ diff --git a/./downloads/ARBITRUM/L2_ENCODER.sol b/./downloads/LINEA/L2_ENCODER. index 9ab49b3..42a5580 100644 --- a/./downloads/ARBITRUM/L2_ENCODER.sol +++ b/./downloads/LINEA/L2_ENCODER.sol -@@ -1,7 +1,7 @@ --// SPDX-License-Identifier: BUSL-1.1 --pragma solidity =0.8.10; -+// SPDX-License-Identifier: MIT -+pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeCast.sol -+// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - - // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -@@ -257,13 +257,13 @@ library SafeCast { - } - } - --// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. -- **/ -+ */ - interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. -@@ -358,7 +358,7 @@ interface IPoolAddressesProvider { - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id -- **/ -+ */ - function getMarketId() external view returns (string memory); - - /** -@@ -400,27 +400,27 @@ interface IPoolAddressesProvider { - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address -- **/ -+ */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation -- **/ -+ */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address -- **/ -+ */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation -- **/ -+ */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** -@@ -444,7 +444,7 @@ interface IPoolAddressesProvider { - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager -- **/ -+ */ - function setACLManager(address newAclManager) external; - - /** -@@ -468,7 +468,7 @@ interface IPoolAddressesProvider { - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel -- **/ -+ */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** -@@ -480,14 +480,18 @@ interface IPoolAddressesProvider { - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider -- **/ -+ */ - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { -- struct ReserveData { -+ /** -+ * This exists specifically to maintain the `getReserveData()` interface, since the new, internal -+ * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. -+ */ -+ struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray -@@ -498,7 +502,7 @@ library DataTypes { - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; -- //the current stable borrow rate. Expressed in ray -+ // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; -@@ -506,7 +510,7 @@ library DataTypes { - uint16 id; - //aToken address - address aTokenAddress; -- //stableDebtToken address -+ // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; -@@ -520,6 +524,43 @@ library DataTypes { - uint128 isolationModeTotalDebt; - } - -+ struct ReserveData { -+ //stores the reserve configuration -+ ReserveConfigurationMap configuration; -+ //the liquidity index. Expressed in ray -+ uint128 liquidityIndex; -+ //the current supply rate. Expressed in ray -+ uint128 currentLiquidityRate; -+ //variable borrow index. Expressed in ray -+ uint128 variableBorrowIndex; -+ //the current variable borrow rate. Expressed in ray -+ uint128 currentVariableBorrowRate; -+ // DEPRECATED on v3.2.0 -+ uint128 __deprecatedStableBorrowRate; -+ //timestamp of last update -+ uint40 lastUpdateTimestamp; -+ //the id of the reserve. Represents the position in the list of the active reserves -+ uint16 id; -+ //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed -+ uint40 liquidationGracePeriodUntil; -+ //aToken address -+ address aTokenAddress; -+ // DEPRECATED on v3.2.0 -+ address __deprecatedStableDebtTokenAddress; -+ //variableDebtToken address -+ address variableDebtTokenAddress; -+ //address of the interest rate strategy -+ address interestRateStrategyAddress; -+ //the current treasury balance, scaled -+ uint128 accruedToTreasury; -+ //the outstanding unbacked aTokens minted through the bridging feature -+ uint128 unbacked; -+ //the outstanding debt borrowed against this asset in isolation mode -+ uint128 isolationModeTotalDebt; -+ //the amount of underlying accounted for by the protocol -+ uint128 virtualUnderlyingBalance; -+ } -+ - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold -@@ -528,18 +569,20 @@ library DataTypes { - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled -- //bit 59: stable rate borrowing enabled -+ //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled -- //bit 62-63: reserved -+ //bit 62: siloed borrowing enabled -+ //bit 63: flashloaning enabled - //bit 64-79: reserve factor -- //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap -- //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap -- //bit 152-167 liquidation protocol fee -- //bit 168-175 eMode category -- //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled -- //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals -- //bit 252-255 unused -+ //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap -+ //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap -+ //bit 152-167: liquidation protocol fee -+ //bit 168-175: DEPRECATED: eMode category -+ //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled -+ //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals -+ //bit 252: virtual accounting is enabled for the reserve -+ //bit 253-255 unused - - uint256 data; - } -@@ -553,30 +596,49 @@ library DataTypes { - uint256 data; - } - -- struct EModeCategory { -+ // DEPRECATED: kept for backwards compatibility, might be removed in a future version -+ struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; -- // each eMode category may or may not have a custom oracle to override the individual assets price oracles -+ // DEPRECATED - address priceSource; - string label; - } - -+ struct CollateralConfig { -+ uint16 ltv; -+ uint16 liquidationThreshold; -+ uint16 liquidationBonus; -+ } -+ -+ struct EModeCategoryBaseConfiguration { -+ uint16 ltv; -+ uint16 liquidationThreshold; -+ uint16 liquidationBonus; -+ string label; -+ } -+ -+ struct EModeCategory { -+ // each eMode category has a custom ltv and liquidation threshold -+ uint16 ltv; -+ uint16 liquidationThreshold; -+ uint16 liquidationBonus; -+ uint128 collateralBitmap; -+ string label; -+ uint128 borrowableBitmap; -+ } -+ - enum InterestRateMode { - NONE, -- STABLE, -+ __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; -- uint256 currPrincipalStableDebt; -- uint256 currAvgStableBorrowRate; -- uint256 currTotalStableDebt; -- uint256 nextAvgStableBorrowRate; -- uint256 nextTotalStableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; -@@ -586,10 +648,8 @@ library DataTypes { - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; -- address stableDebtTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; -- uint40 stableDebtLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { -@@ -619,7 +679,6 @@ library DataTypes { - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; -- uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; -@@ -671,9 +730,9 @@ library DataTypes { - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; -- uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address addressesProvider; -+ address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } -@@ -712,7 +771,6 @@ library DataTypes { - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; -- uint256 maxStableLoanPercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; -@@ -733,18 +791,16 @@ library DataTypes { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; -- uint256 totalStableDebt; -- uint256 totalVariableDebt; -- uint256 averageStableBorrowRate; -+ uint256 totalDebt; - uint256 reserveFactor; - address reserve; -- address aToken; -+ bool usingVirtualBalance; -+ uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; -- address stableDebtAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; -@@ -752,13 +808,13 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPool.sol -+// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPool.sol - - /** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. -- **/ -+ */ - interface IPool { - /** - * @dev Emitted on mintUnbacked() -@@ -767,7 +823,7 @@ interface IPool { - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used -- **/ -+ */ - event MintUnbacked( - address indexed reserve, - address user, -@@ -782,7 +838,7 @@ interface IPool { - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees -- **/ -+ */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** -@@ -792,7 +848,7 @@ interface IPool { - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used -- **/ -+ */ - event Supply( - address indexed reserve, - address user, -@@ -807,7 +863,7 @@ interface IPool { - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn -- **/ -+ */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** -@@ -817,10 +873,10 @@ interface IPool { - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out -- * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable -+ * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used -- **/ -+ */ - event Borrow( - address indexed reserve, - address user, -@@ -838,7 +894,7 @@ interface IPool { - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly -- **/ -+ */ - event Repay( - address indexed reserve, - address indexed user, -@@ -847,18 +903,6 @@ interface IPool { - bool useATokens - ); - -- /** -- * @dev Emitted on swapBorrowRateMode() -- * @param reserve The address of the underlying asset of the reserve -- * @param user The address of the user swapping his rate mode -- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable -- **/ -- event SwapBorrowRateMode( -- address indexed reserve, -- address indexed user, -- DataTypes.InterestRateMode interestRateMode -- ); -- - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve -@@ -870,40 +914,34 @@ interface IPool { - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id -- **/ -+ */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral -- **/ -+ */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral -- **/ -+ */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - -- /** -- * @dev Emitted on rebalanceStableBorrowRate() -- * @param reserve The address of the underlying asset of the reserve -- * @param user The address of the user for which the rebalance has been executed -- **/ -- event RebalanceStableBorrowRate(address indexed reserve, address indexed user); -- - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed -- * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt -+ * @param interestRateMode The flashloan mode: 0 for regular flashloan, -+ * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used -- **/ -+ */ - event FlashLoan( - address indexed target, - address initiator, -@@ -924,7 +962,7 @@ interface IPool { - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly -- **/ -+ */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, -@@ -939,11 +977,11 @@ interface IPool { - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate -- * @param stableBorrowRate The next stable borrow rate -+ * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index -- **/ -+ */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, -@@ -957,17 +995,17 @@ interface IPool { - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury -- **/ -+ */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** -- * @dev Mints an `amount` of aTokens to the `onBehalfOf` -+ * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man -- **/ -+ */ - function mintUnbacked( - address asset, - uint256 amount, -@@ -976,12 +1014,13 @@ interface IPool { - ) external; - - /** -- * @dev Back the current unbacked underlying with `amount` and pay `fee`. -+ * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees -- **/ -- function backUnbacked(address asset, uint256 amount, uint256 fee) external; -+ * @return The backed amount -+ */ -+ function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. -@@ -993,7 +1032,7 @@ interface IPool { - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man -- **/ -+ */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** -@@ -1010,7 +1049,7 @@ interface IPool { - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig -- **/ -+ */ - function supplyWithPermit( - address asset, - uint256 amount, -@@ -1032,24 +1071,23 @@ interface IPool { - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn -- **/ -+ */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower -- * already supplied enough collateral, or he was given enough allowance by a credit delegator on the -- * corresponding debt token (StableDebtToken or VariableDebtToken) -+ * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet -- * and 100 stable/variable debt tokens, depending on the `interestRateMode` -+ * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed -- * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable -+ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance -- **/ -+ */ - function borrow( - address asset, - uint256 amount, -@@ -1060,16 +1098,16 @@ interface IPool { - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned -- * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address -+ * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` -- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable -+ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid -- **/ -+ */ - function repay( - address asset, - uint256 amount, -@@ -1083,7 +1121,7 @@ interface IPool { - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` -- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable -+ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed -@@ -1092,7 +1130,7 @@ interface IPool { - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid -- **/ -+ */ - function repayWithPermit( - address asset, - uint256 amount, -@@ -1107,44 +1145,26 @@ interface IPool { - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens -- * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens -+ * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` -- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable -+ * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid -- **/ -+ */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - -- /** -- * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa -- * @param asset The address of the underlying asset borrowed -- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable -- **/ -- function swapBorrowRateMode(address asset, uint256 interestRateMode) external; -- -- /** -- * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. -- * - Users can be rebalanced if the following conditions are satisfied: -- * 1. Usage ratio is above 95% -- * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too -- * much has been borrowed at a stable rate and suppliers are not earning enough -- * @param asset The address of the underlying asset borrowed -- * @param user The address of the user to be rebalanced -- **/ -- function rebalanceStableBorrowRate(address asset, address user) external; -- - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise -- **/ -+ */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** -@@ -1157,7 +1177,7 @@ interface IPool { - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly -- **/ -+ */ - function liquidationCall( - address collateralAsset, - address debtAsset, -@@ -1170,19 +1190,19 @@ interface IPool { - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept -- * into consideration. For further details please visit https://developers.aave.com -+ * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver -- * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address -+ * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address -- * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 -+ * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man -- **/ -+ */ - function flashLoan( - address receiverAddress, - address[] calldata assets, -@@ -1197,14 +1217,14 @@ interface IPool { - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept -- * into consideration. For further details please visit https://developers.aave.com -+ * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man -- **/ -+ */ - function flashLoanSimple( - address receiverAddress, - address asset, -@@ -1222,7 +1242,7 @@ interface IPool { - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user -- **/ -+ */ - function getUserAccountData( - address user - ) -@@ -1243,14 +1263,12 @@ interface IPool { - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve -- * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract -- **/ -+ */ - function initReserve( - address asset, - address aTokenAddress, -- address stableDebtAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; -@@ -1258,8 +1276,9 @@ interface IPool { - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract -+ * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve -- **/ -+ */ - function dropReserve(address asset) external; - - /** -@@ -1267,18 +1286,34 @@ interface IPool { - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract -- **/ -+ */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - -+ /** -+ * @notice Accumulates interest to all indexes of the reserve -+ * @dev Only callable by the PoolConfigurator contract -+ * @dev To be used when required by the configurator, for example when updating interest rates strategy data -+ * @param asset The address of the underlying asset of the reserve -+ */ -+ function syncIndexesState(address asset) external; -+ -+ /** -+ * @notice Updates interest rates on the reserve data -+ * @dev Only callable by the PoolConfigurator contract -+ * @dev To be used when required by the configurator, for example when updating interest rates strategy data -+ * @param asset The address of the underlying asset of the reserve -+ */ -+ function syncRatesState(address asset) external; -+ - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap -- **/ -+ */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration -@@ -1288,7 +1323,7 @@ interface IPool { - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve -- **/ -+ */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); -@@ -1297,13 +1332,13 @@ interface IPool { - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user -- **/ -+ */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** -- * @notice Returns the normalized income normalized income of the reserve -+ * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ -@@ -1311,6 +1346,13 @@ interface IPool { - - /** - * @notice Returns the normalized variable debt per unit of asset -+ * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a -+ * "dynamic" variable index based on time, current stored index and virtual rate at the current -+ * moment (approx. a borrower would get if opening a position). This means that is always used in -+ * combination with variable debt supply/balances. -+ * If using this function externally, consider that is possible to have an increasing normalized -+ * variable debt that is not equivalent to how the variable debt index would be updated in storage -+ * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ -@@ -1320,8 +1362,25 @@ interface IPool { - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve -- **/ -- function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); -+ */ -+ function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); -+ -+ /** -+ * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 -+ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) -+ * @param asset The address of the underlying asset of the reserve -+ * @return The state and configuration data of the reserve with virtual accounting -+ */ -+ function getReserveDataExtended( -+ address asset -+ ) external view returns (DataTypes.ReserveData memory); -+ -+ /** -+ * @notice Returns the virtual underlying balance of the reserve -+ * @param asset The address of the underlying asset of the reserve -+ * @return The reserve virtual underlying balance -+ */ -+ function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer -@@ -1346,20 +1405,27 @@ interface IPool { - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves -- **/ -+ */ - function getReservesList() external view returns (address[] memory); - -+ /** -+ * @notice Returns the number of initialized reserves -+ * @dev It includes dropped reserves -+ * @return The count -+ */ -+ function getReservesCount() external view returns (uint256); -+ - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id -- **/ -+ */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider -- **/ -+ */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** -@@ -1384,20 +1450,70 @@ interface IPool { - ) external; - - /** -- * @notice Configures a new category for the eMode. -+ * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ -- function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; -+ function configureEModeCategory( -+ uint8 id, -+ DataTypes.EModeCategoryBaseConfiguration memory config -+ ) external; -+ -+ /** -+ * @notice Replaces the current eMode collateralBitmap. -+ * @param id The id of the category -+ * @param collateralBitmap The collateralBitmap of the category -+ */ -+ function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; -+ -+ /** -+ * @notice Replaces the current eMode borrowableBitmap. -+ * @param id The id of the category -+ * @param borrowableBitmap The borrowableBitmap of the category -+ */ -+ function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category -+ * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ -- function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); -+ function getEModeCategoryData( -+ uint8 id -+ ) external view returns (DataTypes.EModeCategoryLegacy memory); -+ -+ /** -+ * @notice Returns the label of an eMode category -+ * @param id The id of the category -+ * @return The label of the category -+ */ -+ function getEModeCategoryLabel(uint8 id) external view returns (string memory); -+ -+ /** -+ * @notice Returns the collateral config of an eMode category -+ * @param id The id of the category -+ * @return The ltv,lt,lb of the category -+ */ -+ function getEModeCategoryCollateralConfig( -+ uint8 id -+ ) external view returns (DataTypes.CollateralConfig memory); -+ -+ /** -+ * @notice Returns the collateralBitmap of an eMode category -+ * @param id The id of the category -+ * @return The collateralBitmap of the category -+ */ -+ function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); -+ -+ /** -+ * @notice Returns the borrowableBitmap of an eMode category -+ * @param id The id of the category -+ * @return The borrowableBitmap of the category -+ */ -+ function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode -@@ -1420,10 +1536,20 @@ interface IPool { - function resetIsolationModeTotalDebt(address asset) external; - - /** -- * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate -- * @return The percentage of available liquidity to borrow, expressed in bps -- */ -- function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); -+ * @notice Sets the liquidation grace period of the given asset -+ * @dev To enable a liquidation grace period, a timestamp in the future should be set, -+ * To disable a liquidation grace period, any timestamp in the past works, like 0 -+ * @param asset The address of the underlying asset to set the liquidationGracePeriod -+ * @param until Timestamp when the liquidation grace period will end -+ **/ -+ function setLiquidationGracePeriod(address asset, uint40 until) external; -+ -+ /** -+ * @notice Returns the liquidation grace period of the given asset -+ * @param asset The address of the underlying asset -+ * @return Timestamp when the liquidation grace period will end -+ **/ -+ function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans -@@ -1452,7 +1578,7 @@ interface IPool { - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed -- **/ -+ */ - function mintToTreasury(address[] calldata assets) external; - - /** -@@ -1474,11 +1600,46 @@ interface IPool { - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man -- **/ -+ */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; -+ -+ /** -+ * @notice Gets the address of the external FlashLoanLogic -+ */ -+ function getFlashLoanLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external BorrowLogic -+ */ -+ function getBorrowLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external BridgeLogic -+ */ -+ function getBridgeLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external EModeLogic -+ */ -+ function getEModeLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external LiquidationLogic -+ */ -+ function getLiquidationLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external PoolLogic -+ */ -+ function getPoolLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external SupplyLogic -+ */ -+ function getSupplyLogic() external view returns (address); - } - + -// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/L2Encoder.sol +// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/helpers/L2Encoder.sol - + /** * @title L2Encoder @@ -1512,7 +1673,7 @@ contract L2Encoder { @@ -1041,7 +15,7 @@ index 9ab49b3..42a5580 100644 ) external view returns (bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - + uint16 assetId = data.id; uint128 shortenedAmount = amount.toUint128(); @@ -1548,7 +1709,7 @@ contract L2Encoder { @@ -1050,7 +24,7 @@ index 9ab49b3..42a5580 100644 ) external view returns (bytes32, bytes32, bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - + uint16 assetId = data.id; uint128 shortenedAmount = amount.toUint128(); @@ -1576,7 +1737,7 @@ contract L2Encoder { @@ -1059,7 +33,7 @@ index 9ab49b3..42a5580 100644 function encodeWithdrawParams(address asset, uint256 amount) external view returns (bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - + uint16 assetId = data.id; uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); @@ -1593,7 +1754,7 @@ contract L2Encoder { @@ -1077,7 +51,7 @@ index 9ab49b3..42a5580 100644 ) external view returns (bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - + uint16 assetId = data.id; uint128 shortenedAmount = amount.toUint128(); @@ -1628,7 +1789,7 @@ contract L2Encoder { @@ -1095,7 +69,7 @@ index 9ab49b3..42a5580 100644 ) public view returns (bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - + uint16 assetId = data.id; uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); @@ -1655,7 +1816,7 @@ contract L2Encoder { @@ -1113,7 +87,7 @@ index 9ab49b3..42a5580 100644 ) external view returns (bytes32, bytes32, bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); + DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - + uint16 assetId = data.id; uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); @@ -1701,7 +1862,7 @@ contract L2Encoder { @@ -1128,7 +102,7 @@ index 9ab49b3..42a5580 100644 @@ -1712,46 +1873,6 @@ contract L2Encoder { return encodeRepayParams(asset, amount, interestRateMode); } - + - /** - * @notice Encodes swap borrow rate mode parameters from standard input to compact representation of 1 bytes32 - * @param asset The address of the underlying asset borrowed @@ -1188,10 +162,10 @@ index 9ab49b3..42a5580 100644 - DataTypes.ReserveData memory collateralData = POOL.getReserveData(collateralAsset); + DataTypes.ReserveDataLegacy memory collateralData = POOL.getReserveData(collateralAsset); uint16 collateralAssetId = collateralData.id; - + - DataTypes.ReserveData memory debtData = POOL.getReserveData(debtAsset); + DataTypes.ReserveDataLegacy memory debtData = POOL.getReserveData(debtAsset); uint16 debtAssetId = debtData.id; - + uint128 shortenedDebtToCover = debtToCover == type(uint256).max ``` diff --git a/diffs/ARBITRUM_LINEA/L2_POOL_IMPL_DIFF.md b/diffs/ARBITRUM_LINEA/L2_POOL_IMPL_DIFF.md index 9f565d5f..219626fa 100644 --- a/diffs/ARBITRUM_LINEA/L2_POOL_IMPL_DIFF.md +++ b/diffs/ARBITRUM_LINEA/L2_POOL_IMPL_DIFF.md @@ -3,427 +3,10 @@ diff --git a/./downloads/ARBITRUM/L2_POOL_IMPL.sol b/./downloads/LINEA/L2_POOL_I index 50a2a4d..8f4817d 100644 --- a/./downloads/ARBITRUM/L2_POOL_IMPL.sol +++ b/./downloads/LINEA/L2_POOL_IMPL.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 - pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol - - // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -@@ -221,7 +221,7 @@ library Address { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol - - /* - * @dev Provides information about the current execution context, including the -@@ -244,7 +244,7 @@ abstract contract Context { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - - /** - * @dev External interface of AccessControl declared to support ERC165 detection. -@@ -334,7 +334,7 @@ interface IAccessControl { - function renounceRole(bytes32 role, address account) external; - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -410,7 +410,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - - // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -@@ -666,7 +666,7 @@ library SafeCast { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAaveIncentivesController.sol - - /** - * @title IAaveIncentivesController -@@ -685,7 +685,7 @@ interface IAaveIncentivesController { - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IL2Pool.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IL2Pool.sol - - /** - * @title IL2Pool -@@ -801,7 +801,7 @@ interface IL2Pool { - function liquidationCall(bytes32 args1, bytes32 args2) external; - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider -@@ -1028,7 +1028,7 @@ interface IPoolAddressesProvider { - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleGetter.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleGetter.sol - - /** - * @title IPriceOracleGetter -@@ -1058,7 +1058,7 @@ interface IPriceOracleGetter { - function getAssetPrice(address asset) external view returns (uint256); - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IScaledBalanceToken.sol - - /** - * @title IScaledBalanceToken -@@ -1130,7 +1130,7 @@ interface IScaledBalanceToken { - function getPreviousIndex(address user) external view returns (uint256); - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol - - /** - * @title VersionedInitializable -@@ -1207,7 +1207,7 @@ abstract contract VersionedInitializable { - uint256[50] private ______gap; - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -1310,7 +1310,7 @@ library Errors { - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/CalldataLogic.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/CalldataLogic.sol - - /** - * @title CalldataLogic library -@@ -1543,7 +1543,7 @@ library CalldataLogic { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/PercentageMath.sol - - /** - * @title PercentageMath library -@@ -1604,7 +1604,7 @@ library PercentageMath { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/WadRayMath.sol - - /** - * @title WadRayMath library -@@ -1730,7 +1730,7 @@ library WadRayMath { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { - /** -@@ -2054,7 +2054,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - - /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library - /// @author Gnosis Developers -@@ -2167,7 +2167,7 @@ library GPv2SafeERC20 { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - - interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); -@@ -2177,7 +2177,7 @@ interface IERC20Detailed is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IACLManager.sol - - /** - * @title IACLManager -@@ -2350,7 +2350,7 @@ interface IACLManager { - function isAssetListingAdmin(address admin) external view returns (bool); - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IERC20WithPermit.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IERC20WithPermit.sol - - /** - * @title IERC20WithPermit -@@ -2381,7 +2381,7 @@ interface IERC20WithPermit is IERC20 { - ) external; - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleSentinel.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleSentinel.sol - - /** - * @title IPriceOracleSentinel -@@ -2446,7 +2446,7 @@ interface IPriceOracleSentinel { - function getGracePeriod() external view returns (uint256); - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol - - /** - * @title IReserveInterestRateStrategy -@@ -2473,7 +2473,7 @@ interface IReserveInterestRateStrategy { - ) external view returns (uint256, uint256); - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/MathUtils.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/MathUtils.sol - - /** - * @title MathUtils library -@@ -2570,7 +2570,7 @@ library MathUtils { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPool.sol - - /** - * @title IPool -@@ -3401,7 +3401,7 @@ interface IPool { - function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - - /** - * @title ReserveConfiguration library -@@ -3982,7 +3982,7 @@ library ReserveConfiguration { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol - - /** - * @title IFlashLoanReceiver -@@ -4015,7 +4015,7 @@ interface IFlashLoanReceiver { - function POOL() external view returns (IPool); - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol - - /** - * @title IFlashLoanSimpleReceiver -@@ -4048,7 +4048,7 @@ interface IFlashLoanSimpleReceiver { - function POOL() external view returns (IPool); - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - - /** - * @title EModeConfiguration library -@@ -4097,7 +4097,7 @@ library EModeConfiguration { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - - /** - * @title UserConfiguration library -@@ -4329,7 +4329,7 @@ library UserConfiguration { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableAToken.sol - - /** - * @title IInitializableAToken -@@ -4382,7 +4382,7 @@ interface IInitializableAToken { - ) external; - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableDebtToken.sol - - /** - * @title IInitializableDebtToken -@@ -4431,7 +4431,7 @@ interface IInitializableDebtToken { - ) external; - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol - - /** - * @title IsolationModeLogic library -@@ -4490,7 +4490,7 @@ library IsolationModeLogic { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IVariableDebtToken.sol - - /** - * @title IVariableDebtToken -@@ -4533,7 +4533,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAToken.sol - - /** - * @title IAToken -@@ -4667,7 +4667,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - function rescueTokens(address token, address to, uint256 amount) external; - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - - /** - * @title IncentivizedERC20 -@@ -4890,7 +4890,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ReserveLogic.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ReserveLogic.sol - - /** - * @title ReserveLogic library -@@ -5191,7 +5191,7 @@ library ReserveLogic { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/PoolStorage.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/PoolStorage.sol - - /** - * @title PoolStorage -@@ -5237,7 +5237,7 @@ contract PoolStorage { - uint16 internal _reservesCount; - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/EModeLogic.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/EModeLogic.sol - - /** - * @title EModeLogic library -@@ -5299,7 +5299,7 @@ library EModeLogic { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/GenericLogic.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/GenericLogic.sol - - /** - * @title GenericLogic library -@@ -5543,7 +5543,7 @@ library GenericLogic { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ValidationLogic.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ValidationLogic.sol - - /** - * @title ReserveLogic library -@@ -6163,7 +6163,7 @@ library ValidationLogic { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BridgeLogic.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BridgeLogic.sol - - library BridgeLogic { - using ReserveLogic for DataTypes.ReserveCache; -@@ -6300,7 +6300,7 @@ library BridgeLogic { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/PoolLogic.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/PoolLogic.sol - - /** - * @title PoolLogic library -@@ -6489,7 +6489,7 @@ library PoolLogic { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/SupplyLogic.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/SupplyLogic.sol - - /** - * @title SupplyLogic library -@@ -6777,7 +6777,7 @@ library SupplyLogic { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BorrowLogic.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BorrowLogic.sol - - /** - * @title BorrowLogic library -@@ -6999,7 +6999,7 @@ library BorrowLogic { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/LiquidationLogic.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/LiquidationLogic.sol - - /** - * @title LiquidationLogic library -@@ -7442,7 +7442,7 @@ library LiquidationLogic { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol - - /** - * @title FlashLoanLogic library -@@ -7702,7 +7702,7 @@ library FlashLoanLogic { - } - } - + -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/Pool.sol +// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/Pool.sol - + /** * @title Pool contract @@ -8137,7 +8137,7 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { @@ -438,28 +21,5 @@ index 50a2a4d..8f4817d 100644 @@ -8555,7 +8555,7 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { } } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/PoolInstance.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/PoolInstance.sol - - contract PoolInstance is Pool { - uint256 public constant POOL_REVISION = 6; -@@ -8578,7 +8578,7 @@ contract PoolInstance is Pool { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/L2Pool.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/L2Pool.sol - - /** - * @title L2Pool -@@ -8675,7 +8675,7 @@ abstract contract L2Pool is Pool, IL2Pool { - } - } - --// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/L2PoolInstance.sol -+// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/L2PoolInstance.sol - - contract L2PoolInstance is L2Pool, PoolInstance { - constructor(IPoolAddressesProvider provider) PoolInstance(provider) {} + ``` diff --git a/diffs/ARBITRUM_LINEA/LIQUIDATION_LOGIC_DIFF.md b/diffs/ARBITRUM_LINEA/LIQUIDATION_LOGIC_DIFF.md index d8b6009e..11c01a65 100644 --- a/diffs/ARBITRUM_LINEA/LIQUIDATION_LOGIC_DIFF.md +++ b/diffs/ARBITRUM_LINEA/LIQUIDATION_LOGIC_DIFF.md @@ -3,335 +3,5 @@ diff --git a/./downloads/ARBITRUM/LIQUIDATION_LOGIC.sol b/./downloads/LINEA/LIQU index 7169fb3..00aebcf 100644 --- a/./downloads/ARBITRUM/LIQUIDATION_LOGIC.sol +++ b/./downloads/LINEA/LIQUIDATION_LOGIC.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 - pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - - // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -@@ -221,7 +221,7 @@ library Address { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - - /* - * @dev Provides information about the current execution context, including the -@@ -244,7 +244,7 @@ abstract contract Context { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - - /** - * @dev External interface of AccessControl declared to support ERC165 detection. -@@ -334,7 +334,7 @@ interface IAccessControl { - function renounceRole(bytes32 role, address account) external; - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -410,7 +410,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - - // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -@@ -666,7 +666,7 @@ library SafeCast { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol - - /** - * @title IAaveIncentivesController -@@ -685,7 +685,7 @@ interface IAaveIncentivesController { - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider -@@ -912,7 +912,7 @@ interface IPoolAddressesProvider { - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol - - /** - * @title IPriceOracleGetter -@@ -942,7 +942,7 @@ interface IPriceOracleGetter { - function getAssetPrice(address asset) external view returns (uint256); - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol - - /** - * @title IScaledBalanceToken -@@ -1014,7 +1014,7 @@ interface IScaledBalanceToken { - function getPreviousIndex(address user) external view returns (uint256); - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -1117,7 +1117,7 @@ library Errors { - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - - /** - * @title PercentageMath library -@@ -1178,7 +1178,7 @@ library PercentageMath { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - - /** - * @title WadRayMath library -@@ -1304,7 +1304,7 @@ library WadRayMath { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { - /** -@@ -1628,7 +1628,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - - /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library - /// @author Gnosis Developers -@@ -1741,7 +1741,7 @@ library GPv2SafeERC20 { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - - interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); -@@ -1751,7 +1751,7 @@ interface IERC20Detailed is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol - - /** - * @title IACLManager -@@ -1924,7 +1924,7 @@ interface IACLManager { - function isAssetListingAdmin(address admin) external view returns (bool); - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - - /** - * @title IPriceOracleSentinel -@@ -1989,7 +1989,7 @@ interface IPriceOracleSentinel { - function getGracePeriod() external view returns (uint256); - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - - /** - * @title IReserveInterestRateStrategy -@@ -2016,7 +2016,7 @@ interface IReserveInterestRateStrategy { - ) external view returns (uint256, uint256); - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol - - /** - * @title MathUtils library -@@ -2113,7 +2113,7 @@ library MathUtils { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol - - /** - * @title IPool -@@ -2672,6 +2672,7 @@ interface IPool { - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 -+ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ -@@ -2943,7 +2944,7 @@ interface IPool { - function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - - /** - * @title ReserveConfiguration library -@@ -2958,6 +2959,7 @@ library ReserveConfiguration { - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore -+ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore -@@ -2966,7 +2968,7 @@ library ReserveConfiguration { - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -- //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory -+ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -@@ -3523,7 +3525,7 @@ library ReserveConfiguration { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - - /** - * @title EModeConfiguration library -@@ -3572,7 +3574,7 @@ library EModeConfiguration { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - - /** - * @title UserConfiguration library -@@ -3804,7 +3806,7 @@ library UserConfiguration { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol - - /** - * @title IInitializableAToken -@@ -3857,7 +3859,7 @@ interface IInitializableAToken { - ) external; - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol - - /** - * @title IInitializableDebtToken -@@ -3906,7 +3908,7 @@ interface IInitializableDebtToken { - ) external; - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol - - /** - * @title IsolationModeLogic library -@@ -3965,7 +3967,7 @@ library IsolationModeLogic { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol - - /** - * @title IVariableDebtToken -@@ -4008,7 +4010,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol - - /** - * @title IAToken -@@ -4142,7 +4144,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - function rescueTokens(address token, address to, uint256 amount) external; - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - - /** - * @title IncentivizedERC20 -@@ -4365,7 +4367,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - - /** - * @title ReserveLogic library -@@ -4666,7 +4668,7 @@ library ReserveLogic { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - - /** - * @title EModeLogic library -@@ -4728,7 +4730,7 @@ library EModeLogic { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - - /** - * @title GenericLogic library -@@ -4972,7 +4974,7 @@ library GenericLogic { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - - /** - * @title ReserveLogic library -@@ -5592,7 +5594,7 @@ library ValidationLogic { - } - } - --// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol -+// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol - - /** - * @title LiquidationLogic library + ``` diff --git a/diffs/ARBITRUM_LINEA/ORACLE_DIFF.md b/diffs/ARBITRUM_LINEA/ORACLE_DIFF.md index a34261f6..24883aa9 100644 --- a/diffs/ARBITRUM_LINEA/ORACLE_DIFF.md +++ b/diffs/ARBITRUM_LINEA/ORACLE_DIFF.md @@ -3,246 +3,14 @@ diff --git a/./downloads/ARBITRUM/ORACLE.sol b/./downloads/LINEA/ORACLE.sol index 4729969..9828b58 100644 --- a/./downloads/ARBITRUM/ORACLE.sol +++ b/./downloads/LINEA/ORACLE.sol -@@ -1,7 +1,7 @@ --// SPDX-License-Identifier: BUSL-1.1 --pragma solidity =0.8.10 ^0.8.0; -+// SPDX-License-Identifier: MIT -+pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol -+// downloads/LINEA/ORACLE/AaveOracle/src/contracts/dependencies/chainlink/AggregatorInterface.sol - - // Chainlink Contracts v0.8 - -@@ -21,13 +21,13 @@ interface AggregatorInterface { - event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); - } - --// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. -- **/ -+ */ - interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. -@@ -122,7 +122,7 @@ interface IPoolAddressesProvider { - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id -- **/ -+ */ - function getMarketId() external view returns (string memory); - - /** -@@ -164,27 +164,27 @@ interface IPoolAddressesProvider { - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address -- **/ -+ */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation -- **/ -+ */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address -- **/ -+ */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation -- **/ -+ */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** -@@ -208,7 +208,7 @@ interface IPoolAddressesProvider { - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager -- **/ -+ */ - function setACLManager(address newAclManager) external; - - /** -@@ -232,7 +232,7 @@ interface IPoolAddressesProvider { - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel -- **/ -+ */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** -@@ -244,41 +244,41 @@ interface IPoolAddressesProvider { - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider -- **/ -+ */ - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol -+// downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPriceOracleGetter.sol - - /** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. -- **/ -+ */ - interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. -- **/ -+ */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. -- **/ -+ */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset -- **/ -+ */ - function getAssetPrice(address asset) external view returns (uint256); - } - --// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/ORACLE/AaveOracle/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -316,38 +316,33 @@ library Errors { - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' -- string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' -- string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' -- string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' -- string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' -- string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' -- string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' -+ string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' -- string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' -+ string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' -@@ -369,22 +364,30 @@ library Errors { - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' -- string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' -- string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 -+ string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled -+ string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid -+ string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed -+ string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed -+ string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 -+ string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' -+ string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' -+ string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range -+ string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state -+ string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IACLManager.sol -+// downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IACLManager.sol - - /** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager -- **/ -+ */ - interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider -@@ -500,7 +503,7 @@ interface IACLManager { - function addFlashBorrower(address borrower) external; - - /** -- * @notice Removes an admin as FlashBorrower -+ * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; -@@ -551,7 +554,7 @@ interface IACLManager { - function isAssetListingAdmin(address admin) external view returns (bool); - } - --// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IAaveOracle.sol -+// downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IAaveOracle.sol - - /** - * @title IAaveOracle -@@ -619,7 +622,7 @@ interface IAaveOracle is IPriceOracleGetter { - function getFallbackOracle() external view returns (address); - } - + -// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/misc/AaveOracle.sol +// downloads/LINEA/ORACLE/AaveOracle/src/contracts/misc/AaveOracle.sol - + /** * @title AaveOracle @@ -641,7 +644,7 @@ contract AaveOracle is IAaveOracle { - + /** * @dev Only asset listing or pool admin can call functions marked by this modifier. - **/ diff --git a/diffs/ARBITRUM_LINEA/POOL_ADDRESSES_PROVIDER_DIFF.md b/diffs/ARBITRUM_LINEA/POOL_ADDRESSES_PROVIDER_DIFF.md index 29683e64..484e3bae 100644 --- a/diffs/ARBITRUM_LINEA/POOL_ADDRESSES_PROVIDER_DIFF.md +++ b/diffs/ARBITRUM_LINEA/POOL_ADDRESSES_PROVIDER_DIFF.md @@ -3,229 +3,16 @@ diff --git a/./downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER.sol b/./downloads/LINE index 9478e36..7a14597 100644 --- a/./downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER.sol +++ b/./downloads/LINEA/POOL_ADDRESSES_PROVIDER.sol -@@ -1,7 +1,9 @@ - // SPDX-License-Identifier: BUSL-1.1 --pragma solidity =0.8.10; -+pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol -+// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol -+ -+// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - - /** - * @dev Collection of functions related to the address type -@@ -25,16 +27,15 @@ library Address { - * ==== - */ - function isContract(address account) internal view returns (bool) { -- // According to EIP-1052, 0x0 is the value returned for not-yet created accounts -- // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned -- // for accounts without code, i.e. `keccak256('')` -- bytes32 codehash; -- bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; -- // solhint-disable-next-line no-inline-assembly -+ // This method relies on extcodesize, which returns 0 for contracts in -+ // construction, since the code is only stored at the end of the -+ // constructor execution. -+ -+ uint256 size; - assembly { -- codehash := extcodehash(account) -+ size := extcodesize(account) - } -- return (codehash != accountHash && codehash != 0x0); -+ return size > 0; - } - - /** -@@ -56,13 +57,171 @@ library Address { - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - -- // solhint-disable-next-line avoid-low-level-calls, avoid-call-value - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } -+ -+ /** -+ * @dev Performs a Solidity function call using a low level `call`. A -+ * plain `call` is an unsafe replacement for a function call: use this -+ * function instead. -+ * -+ * If `target` reverts with a revert reason, it is bubbled up by this -+ * function (like regular Solidity function calls). -+ * -+ * Returns the raw returned data. To convert to the expected return value, -+ * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. -+ * -+ * Requirements: -+ * -+ * - `target` must be a contract. -+ * - calling `target` with `data` must not revert. -+ * -+ * _Available since v3.1._ -+ */ -+ function functionCall(address target, bytes memory data) internal returns (bytes memory) { -+ return functionCall(target, data, 'Address: low-level call failed'); -+ } -+ -+ /** -+ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with -+ * `errorMessage` as a fallback revert reason when `target` reverts. -+ * -+ * _Available since v3.1._ -+ */ -+ function functionCall( -+ address target, -+ bytes memory data, -+ string memory errorMessage -+ ) internal returns (bytes memory) { -+ return functionCallWithValue(target, data, 0, errorMessage); -+ } -+ -+ /** -+ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], -+ * but also transferring `value` wei to `target`. -+ * -+ * Requirements: -+ * -+ * - the calling contract must have an ETH balance of at least `value`. -+ * - the called Solidity function must be `payable`. -+ * -+ * _Available since v3.1._ -+ */ -+ function functionCallWithValue( -+ address target, -+ bytes memory data, -+ uint256 value -+ ) internal returns (bytes memory) { -+ return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); -+ } -+ -+ /** -+ * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but -+ * with `errorMessage` as a fallback revert reason when `target` reverts. -+ * -+ * _Available since v3.1._ -+ */ -+ function functionCallWithValue( -+ address target, -+ bytes memory data, -+ uint256 value, -+ string memory errorMessage -+ ) internal returns (bytes memory) { -+ require(address(this).balance >= value, 'Address: insufficient balance for call'); -+ require(isContract(target), 'Address: call to non-contract'); -+ -+ (bool success, bytes memory returndata) = target.call{value: value}(data); -+ return verifyCallResult(success, returndata, errorMessage); -+ } -+ -+ /** -+ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], -+ * but performing a static call. -+ * -+ * _Available since v3.3._ -+ */ -+ function functionStaticCall( -+ address target, -+ bytes memory data -+ ) internal view returns (bytes memory) { -+ return functionStaticCall(target, data, 'Address: low-level static call failed'); -+ } -+ -+ /** -+ * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], -+ * but performing a static call. -+ * -+ * _Available since v3.3._ -+ */ -+ function functionStaticCall( -+ address target, -+ bytes memory data, -+ string memory errorMessage -+ ) internal view returns (bytes memory) { -+ require(isContract(target), 'Address: static call to non-contract'); -+ -+ (bool success, bytes memory returndata) = target.staticcall(data); -+ return verifyCallResult(success, returndata, errorMessage); -+ } -+ -+ /** -+ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], -+ * but performing a delegate call. -+ * -+ * _Available since v3.4._ -+ */ -+ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { -+ return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); -+ } -+ -+ /** -+ * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], -+ * but performing a delegate call. -+ * -+ * _Available since v3.4._ -+ */ -+ function functionDelegateCall( -+ address target, -+ bytes memory data, -+ string memory errorMessage -+ ) internal returns (bytes memory) { -+ require(isContract(target), 'Address: delegate call to non-contract'); -+ -+ (bool success, bytes memory returndata) = target.delegatecall(data); -+ return verifyCallResult(success, returndata, errorMessage); -+ } -+ -+ /** -+ * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the -+ * revert reason using the provided one. -+ * -+ * _Available since v4.3._ -+ */ -+ function verifyCallResult( -+ bool success, -+ bytes memory returndata, -+ string memory errorMessage -+ ) internal pure returns (bytes memory) { -+ if (success) { -+ return returndata; -+ } else { -+ // Look for revert reason and bubble it up if present -+ if (returndata.length > 0) { -+ // The easiest way to bubble the revert reason is using memory via assembly -+ -+ assembly { -+ let returndata_size := mload(returndata) -+ revert(add(32, returndata), returndata_size) -+ } -+ } else { -+ revert(errorMessage); -+ } -+ } -+ } - } - --// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol -+// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Context.sol - - /* - * @dev Provides information about the current execution context, including the -@@ -85,7 +244,7 @@ abstract contract Context { - } - } - + -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol +// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol - + /** * @title Proxy @@ -104,6 +263,14 @@ abstract contract Proxy { _fallback(); } - + + /** + * @dev Fallback function that will run if call data is empty. + * IMPORTANT. receive() on implementation contracts will be unreachable @@ -240,121 +27,14 @@ index 9478e36..7a14597 100644 @@ -158,13 +325,13 @@ abstract contract Proxy { } } - --// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. -- **/ -+ */ - interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. -@@ -259,7 +426,7 @@ interface IPoolAddressesProvider { - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id -- **/ -+ */ - function getMarketId() external view returns (string memory); - - /** -@@ -301,27 +468,27 @@ interface IPoolAddressesProvider { - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address -- **/ -+ */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation -- **/ -+ */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address -- **/ -+ */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation -- **/ -+ */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** -@@ -345,7 +512,7 @@ interface IPoolAddressesProvider { - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager -- **/ -+ */ - function setACLManager(address newAclManager) external; - - /** -@@ -369,7 +536,7 @@ interface IPoolAddressesProvider { - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel -- **/ -+ */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** -@@ -381,11 +548,11 @@ interface IPoolAddressesProvider { - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider -- **/ -+ */ - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol -+// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol - - /** - * @dev Contract module which provides a basic access control mechanism, where -@@ -451,7 +618,7 @@ contract Ownable is Context { - } - } - --// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol -+// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol - - /** - * @title BaseUpgradeabilityProxy -@@ -514,7 +681,7 @@ contract BaseUpgradeabilityProxy is Proxy { - } - } - --// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol -+// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol - - /** - * @title InitializableUpgradeabilityProxy -@@ -541,7 +708,7 @@ contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { - } - } - + -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol +// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol - + /** * @title BaseImmutableAdminUpgradeabilityProxy @@ -558,10 +725,10 @@ contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - + /** * @dev Constructor. - * @param admin The address of the admin @@ -365,24 +45,15 @@ index 9478e36..7a14597 100644 + constructor(address admin_) { + _admin = admin_; } - + modifier ifAdmin() { @@ -624,7 +791,7 @@ contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { } } - --// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol -+// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol - - /** - * @title InitializableAdminUpgradeabilityProxy -@@ -649,7 +816,7 @@ contract InitializableImmutableAdminUpgradeabilityProxy is - } - } - + -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol +// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/protocol/configuration/PoolAddressesProvider.sol - + /** * @title PoolAddressesProvider @@ -657,7 +824,7 @@ contract InitializableImmutableAdminUpgradeabilityProxy is diff --git a/diffs/ARBITRUM_LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY_DIFF.md b/diffs/ARBITRUM_LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY_DIFF.md index ca9bad4f..0e867b6f 100644 --- a/diffs/ARBITRUM_LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY_DIFF.md +++ b/diffs/ARBITRUM_LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY_DIFF.md @@ -3,138 +3,10 @@ diff --git a/./downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY.sol b/./downl index b396e1f..8ab717f 100644 --- a/./downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY.sol +++ b/./downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 --pragma solidity =0.8.10; -+pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol -+// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Context.sol - - /* - * @dev Provides information about the current execution context, including the -@@ -24,13 +24,13 @@ abstract contract Context { - } - } - --// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol -+// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/interfaces/IPoolAddressesProviderRegistry.sol - - /** - * @title IPoolAddressesProviderRegistry - * @author Aave - * @notice Defines the basic interface for an Aave Pool Addresses Provider Registry. -- **/ -+ */ - interface IPoolAddressesProviderRegistry { - /** - * @dev Emitted when a new AddressesProvider is registered. -@@ -49,7 +49,7 @@ interface IPoolAddressesProviderRegistry { - /** - * @notice Returns the list of registered addresses providers - * @return The list of addresses providers -- **/ -+ */ - function getAddressesProvidersList() external view returns (address[] memory); - - /** -@@ -74,17 +74,17 @@ interface IPoolAddressesProviderRegistry { - * @dev The id must not be used by an already registered PoolAddressesProvider - * @param provider The address of the new PoolAddressesProvider - * @param id The id for the new PoolAddressesProvider, referring to the market it belongs to -- **/ -+ */ - function registerAddressesProvider(address provider, uint256 id) external; - - /** - * @notice Removes an addresses provider from the list of registered addresses providers - * @param provider The PoolAddressesProvider address -- **/ -+ */ - function unregisterAddressesProvider(address provider) external; - } - --// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -122,38 +122,33 @@ library Errors { - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' -- string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' -- string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' -- string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' -- string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' -- string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' -- string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' -+ string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' -- string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' -+ string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' -@@ -175,16 +170,24 @@ library Errors { - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' -- string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' -- string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 -+ string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled -+ string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid -+ string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed -+ string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed -+ string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 -+ string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' -+ string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' -+ string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range -+ string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state -+ string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol -+// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol - - /** - * @dev Contract module which provides a basic access control mechanism, where -@@ -250,7 +253,7 @@ contract Ownable is Context { - } - } - + -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol +// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol - + /** * @title PoolAddressesProviderRegistry @@ -258,7 +261,7 @@ contract Ownable is Context { diff --git a/diffs/ARBITRUM_LINEA/POOL_CONFIGURATOR_IMPL_DIFF.md b/diffs/ARBITRUM_LINEA/POOL_CONFIGURATOR_IMPL_DIFF.md index f0f29d46..6ae4183d 100644 --- a/diffs/ARBITRUM_LINEA/POOL_CONFIGURATOR_IMPL_DIFF.md +++ b/diffs/ARBITRUM_LINEA/POOL_CONFIGURATOR_IMPL_DIFF.md @@ -3,256 +3,5 @@ diff --git a/./downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL.sol b/./downloads/LINEA index 09a7d9d..e6effd0 100644 --- a/./downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL.sol +++ b/./downloads/LINEA/POOL_CONFIGURATOR_IMPL.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 - pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol - - // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -@@ -221,7 +221,7 @@ library Address { - } - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -297,7 +297,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol - - /** - * @title Proxy -@@ -378,7 +378,7 @@ abstract contract Proxy { - } - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IAaveIncentivesController.sol - - /** - * @title IAaveIncentivesController -@@ -397,7 +397,7 @@ interface IAaveIncentivesController { - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider -@@ -624,7 +624,7 @@ interface IPoolAddressesProvider { - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol - - /** - * @title VersionedInitializable -@@ -701,7 +701,7 @@ abstract contract VersionedInitializable { - uint256[50] private ______gap; - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -804,7 +804,7 @@ library Errors { - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/math/PercentageMath.sol - - /** - * @title PercentageMath library -@@ -865,7 +865,7 @@ library PercentageMath { - } - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol - - library ConfiguratorInputTypes { - struct InitReserveInput { -@@ -904,7 +904,7 @@ library ConfiguratorInputTypes { - } - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { - /** -@@ -1228,7 +1228,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - - interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); -@@ -1238,7 +1238,7 @@ interface IERC20Detailed is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IACLManager.sol - - /** - * @title IACLManager -@@ -1411,7 +1411,7 @@ interface IACLManager { - function isAssetListingAdmin(address admin) external view returns (bool); - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolDataProvider.sol - - /** - * @title IPoolDataProvider -@@ -1659,7 +1659,7 @@ interface IPoolDataProvider { - function getVirtualUnderlyingBalance(address asset) external view returns (uint256); - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol - - /** - * @title IReserveInterestRateStrategy -@@ -1686,7 +1686,7 @@ interface IReserveInterestRateStrategy { - ) external view returns (uint256, uint256); - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol - - /** - * @title BaseUpgradeabilityProxy -@@ -1749,7 +1749,7 @@ contract BaseUpgradeabilityProxy is Proxy { - } - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPool.sol - - /** - * @title IPool -@@ -2580,7 +2580,7 @@ interface IPool { - function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - - /** - * @title ReserveConfiguration library -@@ -3161,7 +3161,7 @@ library ReserveConfiguration { - } - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol - - /** - * @title InitializableUpgradeabilityProxy -@@ -3188,7 +3188,7 @@ contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { - } - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol - - /** - * @title IDefaultInterestRateStrategyV2 -@@ -3346,7 +3346,7 @@ interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { - function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol - - /** - * @title BaseImmutableAdminUpgradeabilityProxy -@@ -3429,7 +3429,7 @@ contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - } - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - - /** - * @title EModeConfiguration library -@@ -3478,7 +3478,7 @@ library EModeConfiguration { - } - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableAToken.sol - - /** - * @title IInitializableAToken -@@ -3531,7 +3531,7 @@ interface IInitializableAToken { - ) external; - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableDebtToken.sol - - /** - * @title IInitializableDebtToken -@@ -3580,7 +3580,7 @@ interface IInitializableDebtToken { - ) external; - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolConfigurator.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolConfigurator.sol - - /** - * @title IPoolConfigurator -@@ -4128,7 +4128,7 @@ interface IPoolConfigurator { - function MAX_GRACE_PERIOD() external view returns (uint40); - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol - - /** - * @title InitializableAdminUpgradeabilityProxy -@@ -4153,7 +4153,7 @@ contract InitializableImmutableAdminUpgradeabilityProxy is - } - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol - - /** - * @title ConfiguratorLogic library -@@ -4365,7 +4365,7 @@ library ConfiguratorLogic { - } - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/pool/PoolConfigurator.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/pool/PoolConfigurator.sol - - /** - * @title PoolConfigurator -@@ -4978,7 +4978,7 @@ abstract contract PoolConfigurator is VersionedInitializable, IPoolConfigurator - } - } - --// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/instances/PoolConfiguratorInstance.sol -+// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/instances/PoolConfiguratorInstance.sol - - contract PoolConfiguratorInstance is PoolConfigurator { - uint256 public constant CONFIGURATOR_REVISION = 4; + ``` diff --git a/diffs/ARBITRUM_LINEA/POOL_LOGIC_DIFF.md b/diffs/ARBITRUM_LINEA/POOL_LOGIC_DIFF.md index b8418ee8..4979a570 100644 --- a/diffs/ARBITRUM_LINEA/POOL_LOGIC_DIFF.md +++ b/diffs/ARBITRUM_LINEA/POOL_LOGIC_DIFF.md @@ -3,326 +3,5 @@ diff --git a/./downloads/ARBITRUM/POOL_LOGIC.sol b/./downloads/LINEA/POOL_LOGIC. index a04f0bb..61a4f73 100644 --- a/./downloads/ARBITRUM/POOL_LOGIC.sol +++ b/./downloads/LINEA/POOL_LOGIC.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 - pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - - // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -@@ -221,7 +221,7 @@ library Address { - } - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - - /* - * @dev Provides information about the current execution context, including the -@@ -244,7 +244,7 @@ abstract contract Context { - } - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - - /** - * @dev External interface of AccessControl declared to support ERC165 detection. -@@ -334,7 +334,7 @@ interface IAccessControl { - function renounceRole(bytes32 role, address account) external; - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -410,7 +410,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - - // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -@@ -666,7 +666,7 @@ library SafeCast { - } - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol - - /** - * @title IAaveIncentivesController -@@ -685,7 +685,7 @@ interface IAaveIncentivesController { - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider -@@ -912,7 +912,7 @@ interface IPoolAddressesProvider { - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol - - /** - * @title IPriceOracleGetter -@@ -942,7 +942,7 @@ interface IPriceOracleGetter { - function getAssetPrice(address asset) external view returns (uint256); - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol - - /** - * @title IScaledBalanceToken -@@ -1014,7 +1014,7 @@ interface IScaledBalanceToken { - function getPreviousIndex(address user) external view returns (uint256); - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -1117,7 +1117,7 @@ library Errors { - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - - /** - * @title PercentageMath library -@@ -1178,7 +1178,7 @@ library PercentageMath { - } - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - - /** - * @title WadRayMath library -@@ -1304,7 +1304,7 @@ library WadRayMath { - } - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { - /** -@@ -1628,7 +1628,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - - /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library - /// @author Gnosis Developers -@@ -1741,7 +1741,7 @@ library GPv2SafeERC20 { - } - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - - interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); -@@ -1751,7 +1751,7 @@ interface IERC20Detailed is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol - - /** - * @title IACLManager -@@ -1924,7 +1924,7 @@ interface IACLManager { - function isAssetListingAdmin(address admin) external view returns (bool); - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - - /** - * @title IPriceOracleSentinel -@@ -1989,7 +1989,7 @@ interface IPriceOracleSentinel { - function getGracePeriod() external view returns (uint256); - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - - /** - * @title IReserveInterestRateStrategy -@@ -2016,7 +2016,7 @@ interface IReserveInterestRateStrategy { - ) external view returns (uint256, uint256); - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol - - /** - * @title MathUtils library -@@ -2113,7 +2113,7 @@ library MathUtils { - } - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol - - /** - * @title IPool -@@ -2672,6 +2672,7 @@ interface IPool { - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 -+ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ -@@ -2943,7 +2944,7 @@ interface IPool { - function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - - /** - * @title ReserveConfiguration library -@@ -2958,6 +2959,7 @@ library ReserveConfiguration { - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore -+ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore -@@ -2966,7 +2968,7 @@ library ReserveConfiguration { - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -- //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory -+ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -@@ -3523,7 +3525,7 @@ library ReserveConfiguration { - } - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - - /** - * @title EModeConfiguration library -@@ -3572,7 +3574,7 @@ library EModeConfiguration { - } - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - - /** - * @title UserConfiguration library -@@ -3804,7 +3806,7 @@ library UserConfiguration { - } - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol - - /** - * @title IInitializableAToken -@@ -3857,7 +3859,7 @@ interface IInitializableAToken { - ) external; - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol - - /** - * @title IInitializableDebtToken -@@ -3906,7 +3908,7 @@ interface IInitializableDebtToken { - ) external; - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol - - /** - * @title IVariableDebtToken -@@ -3949,7 +3951,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol - - /** - * @title IAToken -@@ -4083,7 +4085,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - function rescueTokens(address token, address to, uint256 amount) external; - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - - /** - * @title IncentivizedERC20 -@@ -4306,7 +4308,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { - } - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - - /** - * @title ReserveLogic library -@@ -4607,7 +4609,7 @@ library ReserveLogic { - } - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - - /** - * @title EModeLogic library -@@ -4669,7 +4671,7 @@ library EModeLogic { - } - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - - /** - * @title GenericLogic library -@@ -4913,7 +4915,7 @@ library GenericLogic { - } - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - - /** - * @title ReserveLogic library -@@ -5533,7 +5535,7 @@ library ValidationLogic { - } - } - --// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol -+// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol - - /** - * @title PoolLogic library + ``` diff --git a/diffs/ARBITRUM_LINEA/SUPPLY_LOGIC_DIFF.md b/diffs/ARBITRUM_LINEA/SUPPLY_LOGIC_DIFF.md index 15ac15e3..a081e3f5 100644 --- a/diffs/ARBITRUM_LINEA/SUPPLY_LOGIC_DIFF.md +++ b/diffs/ARBITRUM_LINEA/SUPPLY_LOGIC_DIFF.md @@ -3,326 +3,5 @@ diff --git a/./downloads/ARBITRUM/SUPPLY_LOGIC.sol b/./downloads/LINEA/SUPPLY_LO index 99515df..a3cc5dd 100644 --- a/./downloads/ARBITRUM/SUPPLY_LOGIC.sol +++ b/./downloads/LINEA/SUPPLY_LOGIC.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 - pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - - // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -@@ -221,7 +221,7 @@ library Address { - } - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - - /* - * @dev Provides information about the current execution context, including the -@@ -244,7 +244,7 @@ abstract contract Context { - } - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - - /** - * @dev External interface of AccessControl declared to support ERC165 detection. -@@ -334,7 +334,7 @@ interface IAccessControl { - function renounceRole(bytes32 role, address account) external; - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -410,7 +410,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - - // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -@@ -666,7 +666,7 @@ library SafeCast { - } - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol - - /** - * @title IAaveIncentivesController -@@ -685,7 +685,7 @@ interface IAaveIncentivesController { - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider -@@ -912,7 +912,7 @@ interface IPoolAddressesProvider { - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol - - /** - * @title IPriceOracleGetter -@@ -942,7 +942,7 @@ interface IPriceOracleGetter { - function getAssetPrice(address asset) external view returns (uint256); - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol - - /** - * @title IScaledBalanceToken -@@ -1014,7 +1014,7 @@ interface IScaledBalanceToken { - function getPreviousIndex(address user) external view returns (uint256); - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -1117,7 +1117,7 @@ library Errors { - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - - /** - * @title PercentageMath library -@@ -1178,7 +1178,7 @@ library PercentageMath { - } - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - - /** - * @title WadRayMath library -@@ -1304,7 +1304,7 @@ library WadRayMath { - } - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { - /** -@@ -1628,7 +1628,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - - /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library - /// @author Gnosis Developers -@@ -1741,7 +1741,7 @@ library GPv2SafeERC20 { - } - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - - interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); -@@ -1751,7 +1751,7 @@ interface IERC20Detailed is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol - - /** - * @title IACLManager -@@ -1924,7 +1924,7 @@ interface IACLManager { - function isAssetListingAdmin(address admin) external view returns (bool); - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - - /** - * @title IPriceOracleSentinel -@@ -1989,7 +1989,7 @@ interface IPriceOracleSentinel { - function getGracePeriod() external view returns (uint256); - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - - /** - * @title IReserveInterestRateStrategy -@@ -2016,7 +2016,7 @@ interface IReserveInterestRateStrategy { - ) external view returns (uint256, uint256); - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol - - /** - * @title MathUtils library -@@ -2113,7 +2113,7 @@ library MathUtils { - } - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol - - /** - * @title IPool -@@ -2672,6 +2672,7 @@ interface IPool { - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 -+ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ -@@ -2943,7 +2944,7 @@ interface IPool { - function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - - /** - * @title ReserveConfiguration library -@@ -2958,6 +2959,7 @@ library ReserveConfiguration { - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore -+ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore -@@ -2966,7 +2968,7 @@ library ReserveConfiguration { - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -- //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory -+ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -@@ -3523,7 +3525,7 @@ library ReserveConfiguration { - } - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - - /** - * @title EModeConfiguration library -@@ -3572,7 +3574,7 @@ library EModeConfiguration { - } - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - - /** - * @title UserConfiguration library -@@ -3804,7 +3806,7 @@ library UserConfiguration { - } - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol - - /** - * @title IInitializableAToken -@@ -3857,7 +3859,7 @@ interface IInitializableAToken { - ) external; - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol - - /** - * @title IInitializableDebtToken -@@ -3906,7 +3908,7 @@ interface IInitializableDebtToken { - ) external; - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol - - /** - * @title IVariableDebtToken -@@ -3949,7 +3951,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol - - /** - * @title IAToken -@@ -4083,7 +4085,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - function rescueTokens(address token, address to, uint256 amount) external; - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - - /** - * @title IncentivizedERC20 -@@ -4306,7 +4308,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { - } - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - - /** - * @title ReserveLogic library -@@ -4607,7 +4609,7 @@ library ReserveLogic { - } - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - - /** - * @title EModeLogic library -@@ -4669,7 +4671,7 @@ library EModeLogic { - } - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - - /** - * @title GenericLogic library -@@ -4913,7 +4915,7 @@ library GenericLogic { - } - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - - /** - * @title ReserveLogic library -@@ -5533,7 +5535,7 @@ library ValidationLogic { - } - } - --// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol -+// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol - - /** - * @title SupplyLogic library + ``` diff --git a/diffs/ARBITRUM_LINEA/UI_INCENTIVE_DATA_PROVIDER_DIFF.md b/diffs/ARBITRUM_LINEA/UI_INCENTIVE_DATA_PROVIDER_DIFF.md index 94901233..6c9d4d8a 100644 --- a/diffs/ARBITRUM_LINEA/UI_INCENTIVE_DATA_PROVIDER_DIFF.md +++ b/diffs/ARBITRUM_LINEA/UI_INCENTIVE_DATA_PROVIDER_DIFF.md @@ -3,193 +3,5 @@ diff --git a/./downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER.sol b/./downloads/L index d31e3f7..64c6bd5 100644 --- a/./downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER.sol +++ b/./downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 - pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol - - /* - * @dev Provides information about the current execution context, including the -@@ -24,7 +24,7 @@ abstract contract Context { - } - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -100,7 +100,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - - // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -@@ -356,7 +356,7 @@ library SafeCast { - } - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol - - interface IEACAggregatorProxy { - function decimals() external view returns (uint8); -@@ -375,7 +375,7 @@ interface IEACAggregatorProxy { - event NewRound(uint256 indexed roundId, address indexed startedBy); - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol - - /** - * @title IAaveIncentivesController -@@ -394,7 +394,7 @@ interface IAaveIncentivesController { - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider -@@ -621,7 +621,7 @@ interface IPoolAddressesProvider { - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -724,7 +724,7 @@ library Errors { - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol - - /** - * @title WadRayMath library -@@ -850,7 +850,7 @@ library WadRayMath { - } - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { - /** -@@ -1174,7 +1174,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol - - /** - * @title IRewardsDistributor -@@ -1351,7 +1351,7 @@ interface IRewardsDistributor { - function getEmissionManager() external view returns (address); - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol - - interface ITransferStrategyBase { - event EmergencyWithdrawal( -@@ -1389,7 +1389,7 @@ interface ITransferStrategyBase { - function emergencyWithdrawal(address token, address to, uint256 amount) external; - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - - interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); -@@ -1399,7 +1399,7 @@ interface IERC20Detailed is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol - - interface IUiIncentiveDataProviderV3 { - struct AggregatedReserveIncentiveData { -@@ -1470,7 +1470,7 @@ interface IUiIncentiveDataProviderV3 { - returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory); - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol - - /** - * @title IACLManager -@@ -1643,7 +1643,7 @@ interface IACLManager { - function isAssetListingAdmin(address admin) external view returns (bool); - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol - - /** - * @title IPool -@@ -2474,7 +2474,7 @@ interface IPool { - function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - - /** - * @title ReserveConfiguration library -@@ -3055,7 +3055,7 @@ library ReserveConfiguration { - } - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol - - library RewardsDataTypes { - struct RewardsConfigInput { -@@ -3106,7 +3106,7 @@ library RewardsDataTypes { - } - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - - /** - * @title UserConfiguration library -@@ -3338,7 +3338,7 @@ library UserConfiguration { - } - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol - - /** - * @title IRewardsController -@@ -3536,7 +3536,7 @@ interface IRewardsController is IRewardsDistributor { - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - - /** - * @title IncentivizedERC20 -@@ -3759,7 +3759,7 @@ abstract contract IncentivizedERC20 is Context, IERC20Detailed { - } - } - --// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol -+// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol - - contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { - using UserConfiguration for DataTypes.UserConfigurationMap; + ``` diff --git a/diffs/ARBITRUM_LINEA/UI_POOL_DATA_PROVIDER_DIFF.md b/diffs/ARBITRUM_LINEA/UI_POOL_DATA_PROVIDER_DIFF.md index 7d95d85b..3bc4996e 100644 --- a/diffs/ARBITRUM_LINEA/UI_POOL_DATA_PROVIDER_DIFF.md +++ b/diffs/ARBITRUM_LINEA/UI_POOL_DATA_PROVIDER_DIFF.md @@ -3,229 +3,5 @@ diff --git a/./downloads/ARBITRUM/UI_POOL_DATA_PROVIDER.sol b/./downloads/LINEA/ index 1457bcc..2d97366 100644 --- a/./downloads/ARBITRUM/UI_POOL_DATA_PROVIDER.sol +++ b/./downloads/LINEA/UI_POOL_DATA_PROVIDER.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 - pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -77,7 +77,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol - - interface IEACAggregatorProxy { - function decimals() external view returns (uint8); -@@ -96,7 +96,7 @@ interface IEACAggregatorProxy { - event NewRound(uint256 indexed roundId, address indexed startedBy); - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol - - /** - * @title IAaveIncentivesController -@@ -115,7 +115,7 @@ interface IAaveIncentivesController { - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider -@@ -342,7 +342,7 @@ interface IPoolAddressesProvider { - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol - - /** - * @title IPriceOracleGetter -@@ -372,7 +372,7 @@ interface IPriceOracleGetter { - function getAssetPrice(address asset) external view returns (uint256); - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol - - /** - * @title IScaledBalanceToken -@@ -444,7 +444,7 @@ interface IScaledBalanceToken { - function getPreviousIndex(address user) external view returns (uint256); - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -547,7 +547,7 @@ library Errors { - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol - - /** - * @title WadRayMath library -@@ -673,7 +673,7 @@ library WadRayMath { - } - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { - /** -@@ -997,7 +997,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - - interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); -@@ -1007,7 +1007,7 @@ interface IERC20Detailed is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol - - interface IERC20DetailedBytes is IERC20 { - function name() external view returns (bytes32); -@@ -1017,7 +1017,7 @@ interface IERC20DetailedBytes is IERC20 { - function decimals() external view returns (uint8); - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol - - /** - * @title IPoolDataProvider -@@ -1265,7 +1265,7 @@ interface IPoolDataProvider { - function getVirtualUnderlyingBalance(address asset) external view returns (uint256); - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol - - /** - * @title IReserveInterestRateStrategy -@@ -1292,7 +1292,7 @@ interface IReserveInterestRateStrategy { - ) external view returns (uint256, uint256); - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol - - interface IUiPoolDataProviderV3 { - struct AggregatedReserveData { -@@ -1384,7 +1384,7 @@ interface IUiPoolDataProviderV3 { - function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory); - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol - - /** - * @title IAaveOracle -@@ -1452,7 +1452,7 @@ interface IAaveOracle is IPriceOracleGetter { - function getFallbackOracle() external view returns (address); - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol - - /** - * @title IPool -@@ -2283,7 +2283,7 @@ interface IPool { - function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - - /** - * @title ReserveConfiguration library -@@ -2864,7 +2864,7 @@ library ReserveConfiguration { - } - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol - - /** - * @title IDefaultInterestRateStrategyV2 -@@ -3022,7 +3022,7 @@ interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { - function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - - /** - * @title UserConfiguration library -@@ -3254,7 +3254,7 @@ library UserConfiguration { - } - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol - - /** - * @title IInitializableAToken -@@ -3307,7 +3307,7 @@ interface IInitializableAToken { - ) external; - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol - - /** - * @title IInitializableDebtToken -@@ -3356,7 +3356,7 @@ interface IInitializableDebtToken { - ) external; - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol - - /** - * @title IVariableDebtToken -@@ -3399,7 +3399,7 @@ interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol - - /** - * @title IAToken -@@ -3533,7 +3533,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - function rescueTokens(address token, address to, uint256 amount) external; - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol - - /** - * @title AaveProtocolDataProvider -@@ -3818,7 +3818,7 @@ contract AaveProtocolDataProvider is IPoolDataProvider { - } - } - --// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol -+// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol - - contract UiPoolDataProviderV3 is IUiPoolDataProviderV3 { - using WadRayMath for uint256; + ``` diff --git a/diffs/ARBITRUM_LINEA/WALLET_BALANCE_PROVIDER_DIFF.md b/diffs/ARBITRUM_LINEA/WALLET_BALANCE_PROVIDER_DIFF.md index 26ac0526..cac32656 100644 --- a/diffs/ARBITRUM_LINEA/WALLET_BALANCE_PROVIDER_DIFF.md +++ b/diffs/ARBITRUM_LINEA/WALLET_BALANCE_PROVIDER_DIFF.md @@ -3,1825 +3,19 @@ diff --git a/./downloads/ARBITRUM/WALLET_BALANCE_PROVIDER.sol b/./downloads/LINE index 0195ac0..a31677f 100644 --- a/./downloads/ARBITRUM/WALLET_BALANCE_PROVIDER.sol +++ b/./downloads/LINEA/WALLET_BALANCE_PROVIDER.sol -@@ -1,7 +1,9 @@ --// SPDX-License-Identifier: agpl-3.0 --pragma solidity =0.8.10; -+// SPDX-License-Identifier: BUSL-1.1 -+pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol -+// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol -+ -+// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - - /** - * @dev Collection of functions related to the address type -@@ -25,16 +27,15 @@ library Address { - * ==== - */ - function isContract(address account) internal view returns (bool) { -- // According to EIP-1052, 0x0 is the value returned for not-yet created accounts -- // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned -- // for accounts without code, i.e. `keccak256('')` -- bytes32 codehash; -- bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; -- // solhint-disable-next-line no-inline-assembly -+ // This method relies on extcodesize, which returns 0 for contracts in -+ // construction, since the code is only stored at the end of the -+ // constructor execution. -+ -+ uint256 size; - assembly { -- codehash := extcodehash(account) -+ size := extcodesize(account) - } -- return (codehash != accountHash && codehash != 0x0); -+ return size > 0; - } - - /** -@@ -56,13 +57,171 @@ library Address { - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - -- // solhint-disable-next-line avoid-low-level-calls, avoid-call-value - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } -+ -+ /** -+ * @dev Performs a Solidity function call using a low level `call`. A -+ * plain `call` is an unsafe replacement for a function call: use this -+ * function instead. -+ * -+ * If `target` reverts with a revert reason, it is bubbled up by this -+ * function (like regular Solidity function calls). -+ * -+ * Returns the raw returned data. To convert to the expected return value, -+ * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. -+ * -+ * Requirements: -+ * -+ * - `target` must be a contract. -+ * - calling `target` with `data` must not revert. -+ * -+ * _Available since v3.1._ -+ */ -+ function functionCall(address target, bytes memory data) internal returns (bytes memory) { -+ return functionCall(target, data, 'Address: low-level call failed'); -+ } -+ -+ /** -+ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with -+ * `errorMessage` as a fallback revert reason when `target` reverts. -+ * -+ * _Available since v3.1._ -+ */ -+ function functionCall( -+ address target, -+ bytes memory data, -+ string memory errorMessage -+ ) internal returns (bytes memory) { -+ return functionCallWithValue(target, data, 0, errorMessage); -+ } -+ -+ /** -+ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], -+ * but also transferring `value` wei to `target`. -+ * -+ * Requirements: -+ * -+ * - the calling contract must have an ETH balance of at least `value`. -+ * - the called Solidity function must be `payable`. -+ * -+ * _Available since v3.1._ -+ */ -+ function functionCallWithValue( -+ address target, -+ bytes memory data, -+ uint256 value -+ ) internal returns (bytes memory) { -+ return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); -+ } -+ -+ /** -+ * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but -+ * with `errorMessage` as a fallback revert reason when `target` reverts. -+ * -+ * _Available since v3.1._ -+ */ -+ function functionCallWithValue( -+ address target, -+ bytes memory data, -+ uint256 value, -+ string memory errorMessage -+ ) internal returns (bytes memory) { -+ require(address(this).balance >= value, 'Address: insufficient balance for call'); -+ require(isContract(target), 'Address: call to non-contract'); -+ -+ (bool success, bytes memory returndata) = target.call{value: value}(data); -+ return verifyCallResult(success, returndata, errorMessage); -+ } -+ -+ /** -+ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], -+ * but performing a static call. -+ * -+ * _Available since v3.3._ -+ */ -+ function functionStaticCall( -+ address target, -+ bytes memory data -+ ) internal view returns (bytes memory) { -+ return functionStaticCall(target, data, 'Address: low-level static call failed'); -+ } -+ -+ /** -+ * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], -+ * but performing a static call. -+ * -+ * _Available since v3.3._ -+ */ -+ function functionStaticCall( -+ address target, -+ bytes memory data, -+ string memory errorMessage -+ ) internal view returns (bytes memory) { -+ require(isContract(target), 'Address: static call to non-contract'); -+ -+ (bool success, bytes memory returndata) = target.staticcall(data); -+ return verifyCallResult(success, returndata, errorMessage); -+ } -+ -+ /** -+ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], -+ * but performing a delegate call. -+ * -+ * _Available since v3.4._ -+ */ -+ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { -+ return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); -+ } -+ -+ /** -+ * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], -+ * but performing a delegate call. -+ * -+ * _Available since v3.4._ -+ */ -+ function functionDelegateCall( -+ address target, -+ bytes memory data, -+ string memory errorMessage -+ ) internal returns (bytes memory) { -+ require(isContract(target), 'Address: delegate call to non-contract'); -+ -+ (bool success, bytes memory returndata) = target.delegatecall(data); -+ return verifyCallResult(success, returndata, errorMessage); -+ } -+ -+ /** -+ * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the -+ * revert reason using the provided one. -+ * -+ * _Available since v4.3._ -+ */ -+ function verifyCallResult( -+ bool success, -+ bytes memory returndata, -+ string memory errorMessage -+ ) internal pure returns (bytes memory) { -+ if (success) { -+ return returndata; -+ } else { -+ // Look for revert reason and bubble it up if present -+ if (returndata.length > 0) { -+ // The easiest way to bubble the revert reason is using memory via assembly -+ -+ assembly { -+ let returndata_size := mload(returndata) -+ revert(add(32, returndata), returndata_size) -+ } -+ } else { -+ revert(errorMessage); -+ } -+ } -+ } - } - --// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -138,13 +297,13 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. -- **/ -+ */ - interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. -@@ -239,7 +398,7 @@ interface IPoolAddressesProvider { - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id -- **/ -+ */ - function getMarketId() external view returns (string memory); - - /** -@@ -281,27 +440,27 @@ interface IPoolAddressesProvider { - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address -- **/ -+ */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation -- **/ -+ */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address -- **/ -+ */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation -- **/ -+ */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** -@@ -325,7 +484,7 @@ interface IPoolAddressesProvider { - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager -- **/ -+ */ - function setACLManager(address newAclManager) external; - - /** -@@ -349,7 +508,7 @@ interface IPoolAddressesProvider { - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel -- **/ -+ */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** -@@ -361,11 +520,11 @@ interface IPoolAddressesProvider { - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider -- **/ -+ */ - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -403,38 +562,33 @@ library Errors { - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' -- string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' -- string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' -- string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' -- string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' -- string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' -- string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' -+ string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' -- string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' -+ string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' -@@ -456,19 +610,31 @@ library Errors { - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' -- string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' -- string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 -+ string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled -+ string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid -+ string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed -+ string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed -+ string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 -+ string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' -+ string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' -+ string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range -+ string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state -+ string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { -- struct ReserveData { -+ /** -+ * This exists specifically to maintain the `getReserveData()` interface, since the new, internal -+ * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. -+ */ -+ struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray -@@ -479,7 +645,7 @@ library DataTypes { - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; -- //the current stable borrow rate. Expressed in ray -+ // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; -@@ -487,7 +653,7 @@ library DataTypes { - uint16 id; - //aToken address - address aTokenAddress; -- //stableDebtToken address -+ // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; -@@ -501,6 +667,43 @@ library DataTypes { - uint128 isolationModeTotalDebt; - } - -+ struct ReserveData { -+ //stores the reserve configuration -+ ReserveConfigurationMap configuration; -+ //the liquidity index. Expressed in ray -+ uint128 liquidityIndex; -+ //the current supply rate. Expressed in ray -+ uint128 currentLiquidityRate; -+ //variable borrow index. Expressed in ray -+ uint128 variableBorrowIndex; -+ //the current variable borrow rate. Expressed in ray -+ uint128 currentVariableBorrowRate; -+ // DEPRECATED on v3.2.0 -+ uint128 __deprecatedStableBorrowRate; -+ //timestamp of last update -+ uint40 lastUpdateTimestamp; -+ //the id of the reserve. Represents the position in the list of the active reserves -+ uint16 id; -+ //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed -+ uint40 liquidationGracePeriodUntil; -+ //aToken address -+ address aTokenAddress; -+ // DEPRECATED on v3.2.0 -+ address __deprecatedStableDebtTokenAddress; -+ //variableDebtToken address -+ address variableDebtTokenAddress; -+ //address of the interest rate strategy -+ address interestRateStrategyAddress; -+ //the current treasury balance, scaled -+ uint128 accruedToTreasury; -+ //the outstanding unbacked aTokens minted through the bridging feature -+ uint128 unbacked; -+ //the outstanding debt borrowed against this asset in isolation mode -+ uint128 isolationModeTotalDebt; -+ //the amount of underlying accounted for by the protocol -+ uint128 virtualUnderlyingBalance; -+ } -+ - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold -@@ -509,18 +712,20 @@ library DataTypes { - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled -- //bit 59: stable rate borrowing enabled -+ //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled -- //bit 62-63: reserved -+ //bit 62: siloed borrowing enabled -+ //bit 63: flashloaning enabled - //bit 64-79: reserve factor -- //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap -- //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap -- //bit 152-167 liquidation protocol fee -- //bit 168-175 eMode category -- //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled -- //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals -- //bit 252-255 unused -+ //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap -+ //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap -+ //bit 152-167: liquidation protocol fee -+ //bit 168-175: DEPRECATED: eMode category -+ //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled -+ //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals -+ //bit 252: virtual accounting is enabled for the reserve -+ //bit 253-255 unused - - uint256 data; - } -@@ -534,30 +739,49 @@ library DataTypes { - uint256 data; - } - -- struct EModeCategory { -+ // DEPRECATED: kept for backwards compatibility, might be removed in a future version -+ struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; -- // each eMode category may or may not have a custom oracle to override the individual assets price oracles -+ // DEPRECATED - address priceSource; - string label; - } - -+ struct CollateralConfig { -+ uint16 ltv; -+ uint16 liquidationThreshold; -+ uint16 liquidationBonus; -+ } -+ -+ struct EModeCategoryBaseConfiguration { -+ uint16 ltv; -+ uint16 liquidationThreshold; -+ uint16 liquidationBonus; -+ string label; -+ } -+ -+ struct EModeCategory { -+ // each eMode category has a custom ltv and liquidation threshold -+ uint16 ltv; -+ uint16 liquidationThreshold; -+ uint16 liquidationBonus; -+ uint128 collateralBitmap; -+ string label; -+ uint128 borrowableBitmap; -+ } -+ - enum InterestRateMode { - NONE, -- STABLE, -+ __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; -- uint256 currPrincipalStableDebt; -- uint256 currAvgStableBorrowRate; -- uint256 currTotalStableDebt; -- uint256 nextAvgStableBorrowRate; -- uint256 nextTotalStableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; -@@ -567,10 +791,8 @@ library DataTypes { - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; -- address stableDebtTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; -- uint40 stableDebtLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { -@@ -600,7 +822,6 @@ library DataTypes { - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; -- uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; -@@ -652,9 +873,9 @@ library DataTypes { - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; -- uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address addressesProvider; -+ address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } -@@ -693,7 +914,6 @@ library DataTypes { - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; -- uint256 maxStableLoanPercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; -@@ -714,18 +934,16 @@ library DataTypes { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; -- uint256 totalStableDebt; -- uint256 totalVariableDebt; -- uint256 averageStableBorrowRate; -+ uint256 totalDebt; - uint256 reserveFactor; - address reserve; -- address aToken; -+ bool usingVirtualBalance; -+ uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; -- address stableDebtAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; -@@ -733,7 +951,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol -+// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - - /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library - /// @author Gnosis Developers -@@ -846,13 +1064,13 @@ library GPv2SafeERC20 { - } - } - --// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPool.sol -+// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPool.sol - - /** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. -- **/ -+ */ - interface IPool { - /** - * @dev Emitted on mintUnbacked() -@@ -861,7 +1079,7 @@ interface IPool { - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used -- **/ -+ */ - event MintUnbacked( - address indexed reserve, - address user, -@@ -876,7 +1094,7 @@ interface IPool { - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees -- **/ -+ */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** -@@ -886,7 +1104,7 @@ interface IPool { - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used -- **/ -+ */ - event Supply( - address indexed reserve, - address user, -@@ -901,7 +1119,7 @@ interface IPool { - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn -- **/ -+ */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** -@@ -911,10 +1129,10 @@ interface IPool { - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out -- * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable -+ * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used -- **/ -+ */ - event Borrow( - address indexed reserve, - address user, -@@ -932,7 +1150,7 @@ interface IPool { - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly -- **/ -+ */ - event Repay( - address indexed reserve, - address indexed user, -@@ -941,18 +1159,6 @@ interface IPool { - bool useATokens - ); - -- /** -- * @dev Emitted on swapBorrowRateMode() -- * @param reserve The address of the underlying asset of the reserve -- * @param user The address of the user swapping his rate mode -- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable -- **/ -- event SwapBorrowRateMode( -- address indexed reserve, -- address indexed user, -- DataTypes.InterestRateMode interestRateMode -- ); -- - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve -@@ -964,40 +1170,34 @@ interface IPool { - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id -- **/ -+ */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral -- **/ -+ */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral -- **/ -+ */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - -- /** -- * @dev Emitted on rebalanceStableBorrowRate() -- * @param reserve The address of the underlying asset of the reserve -- * @param user The address of the user for which the rebalance has been executed -- **/ -- event RebalanceStableBorrowRate(address indexed reserve, address indexed user); -- - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed -- * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt -+ * @param interestRateMode The flashloan mode: 0 for regular flashloan, -+ * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used -- **/ -+ */ - event FlashLoan( - address indexed target, - address initiator, -@@ -1018,7 +1218,7 @@ interface IPool { - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly -- **/ -+ */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, -@@ -1033,11 +1233,11 @@ interface IPool { - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate -- * @param stableBorrowRate The next stable borrow rate -+ * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index -- **/ -+ */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, -@@ -1051,17 +1251,17 @@ interface IPool { - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury -- **/ -+ */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** -- * @dev Mints an `amount` of aTokens to the `onBehalfOf` -+ * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man -- **/ -+ */ - function mintUnbacked( - address asset, - uint256 amount, -@@ -1070,12 +1270,13 @@ interface IPool { - ) external; - - /** -- * @dev Back the current unbacked underlying with `amount` and pay `fee`. -+ * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees -- **/ -- function backUnbacked(address asset, uint256 amount, uint256 fee) external; -+ * @return The backed amount -+ */ -+ function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. -@@ -1087,7 +1288,7 @@ interface IPool { - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man -- **/ -+ */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** -@@ -1104,7 +1305,7 @@ interface IPool { - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig -- **/ -+ */ - function supplyWithPermit( - address asset, - uint256 amount, -@@ -1126,24 +1327,23 @@ interface IPool { - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn -- **/ -+ */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower -- * already supplied enough collateral, or he was given enough allowance by a credit delegator on the -- * corresponding debt token (StableDebtToken or VariableDebtToken) -+ * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet -- * and 100 stable/variable debt tokens, depending on the `interestRateMode` -+ * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed -- * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable -+ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance -- **/ -+ */ - function borrow( - address asset, - uint256 amount, -@@ -1154,16 +1354,16 @@ interface IPool { - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned -- * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address -+ * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` -- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable -+ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid -- **/ -+ */ - function repay( - address asset, - uint256 amount, -@@ -1177,7 +1377,7 @@ interface IPool { - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` -- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable -+ * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed -@@ -1186,7 +1386,7 @@ interface IPool { - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid -- **/ -+ */ - function repayWithPermit( - address asset, - uint256 amount, -@@ -1201,44 +1401,26 @@ interface IPool { - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens -- * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens -+ * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` -- * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable -+ * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid -- **/ -+ */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - -- /** -- * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa -- * @param asset The address of the underlying asset borrowed -- * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable -- **/ -- function swapBorrowRateMode(address asset, uint256 interestRateMode) external; -- -- /** -- * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. -- * - Users can be rebalanced if the following conditions are satisfied: -- * 1. Usage ratio is above 95% -- * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too -- * much has been borrowed at a stable rate and suppliers are not earning enough -- * @param asset The address of the underlying asset borrowed -- * @param user The address of the user to be rebalanced -- **/ -- function rebalanceStableBorrowRate(address asset, address user) external; -- - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise -- **/ -+ */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** -@@ -1251,7 +1433,7 @@ interface IPool { - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly -- **/ -+ */ - function liquidationCall( - address collateralAsset, - address debtAsset, -@@ -1264,19 +1446,19 @@ interface IPool { - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept -- * into consideration. For further details please visit https://developers.aave.com -+ * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver -- * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address -+ * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address -- * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 -+ * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man -- **/ -+ */ - function flashLoan( - address receiverAddress, - address[] calldata assets, -@@ -1291,14 +1473,14 @@ interface IPool { - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept -- * into consideration. For further details please visit https://developers.aave.com -+ * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man -- **/ -+ */ - function flashLoanSimple( - address receiverAddress, - address asset, -@@ -1316,7 +1498,7 @@ interface IPool { - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user -- **/ -+ */ - function getUserAccountData( - address user - ) -@@ -1337,14 +1519,12 @@ interface IPool { - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve -- * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract -- **/ -+ */ - function initReserve( - address asset, - address aTokenAddress, -- address stableDebtAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; -@@ -1352,8 +1532,9 @@ interface IPool { - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract -+ * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve -- **/ -+ */ - function dropReserve(address asset) external; - - /** -@@ -1361,18 +1542,34 @@ interface IPool { - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract -- **/ -+ */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - -+ /** -+ * @notice Accumulates interest to all indexes of the reserve -+ * @dev Only callable by the PoolConfigurator contract -+ * @dev To be used when required by the configurator, for example when updating interest rates strategy data -+ * @param asset The address of the underlying asset of the reserve -+ */ -+ function syncIndexesState(address asset) external; -+ -+ /** -+ * @notice Updates interest rates on the reserve data -+ * @dev Only callable by the PoolConfigurator contract -+ * @dev To be used when required by the configurator, for example when updating interest rates strategy data -+ * @param asset The address of the underlying asset of the reserve -+ */ -+ function syncRatesState(address asset) external; -+ - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap -- **/ -+ */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration -@@ -1382,7 +1579,7 @@ interface IPool { - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve -- **/ -+ */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); -@@ -1391,13 +1588,13 @@ interface IPool { - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user -- **/ -+ */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** -- * @notice Returns the normalized income normalized income of the reserve -+ * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ -@@ -1405,6 +1602,13 @@ interface IPool { - - /** - * @notice Returns the normalized variable debt per unit of asset -+ * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a -+ * "dynamic" variable index based on time, current stored index and virtual rate at the current -+ * moment (approx. a borrower would get if opening a position). This means that is always used in -+ * combination with variable debt supply/balances. -+ * If using this function externally, consider that is possible to have an increasing normalized -+ * variable debt that is not equivalent to how the variable debt index would be updated in storage -+ * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ -@@ -1414,8 +1618,25 @@ interface IPool { - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve -- **/ -- function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); -+ */ -+ function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); -+ -+ /** -+ * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 -+ * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) -+ * @param asset The address of the underlying asset of the reserve -+ * @return The state and configuration data of the reserve with virtual accounting -+ */ -+ function getReserveDataExtended( -+ address asset -+ ) external view returns (DataTypes.ReserveData memory); -+ -+ /** -+ * @notice Returns the virtual underlying balance of the reserve -+ * @param asset The address of the underlying asset of the reserve -+ * @return The reserve virtual underlying balance -+ */ -+ function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer -@@ -1440,20 +1661,27 @@ interface IPool { - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves -- **/ -+ */ - function getReservesList() external view returns (address[] memory); - -+ /** -+ * @notice Returns the number of initialized reserves -+ * @dev It includes dropped reserves -+ * @return The count -+ */ -+ function getReservesCount() external view returns (uint256); -+ - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id -- **/ -+ */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider -- **/ -+ */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** -@@ -1478,20 +1706,70 @@ interface IPool { - ) external; - - /** -- * @notice Configures a new category for the eMode. -+ * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ -- function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; -+ function configureEModeCategory( -+ uint8 id, -+ DataTypes.EModeCategoryBaseConfiguration memory config -+ ) external; -+ -+ /** -+ * @notice Replaces the current eMode collateralBitmap. -+ * @param id The id of the category -+ * @param collateralBitmap The collateralBitmap of the category -+ */ -+ function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; -+ -+ /** -+ * @notice Replaces the current eMode borrowableBitmap. -+ * @param id The id of the category -+ * @param borrowableBitmap The borrowableBitmap of the category -+ */ -+ function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category -+ * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ -- function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); -+ function getEModeCategoryData( -+ uint8 id -+ ) external view returns (DataTypes.EModeCategoryLegacy memory); -+ -+ /** -+ * @notice Returns the label of an eMode category -+ * @param id The id of the category -+ * @return The label of the category -+ */ -+ function getEModeCategoryLabel(uint8 id) external view returns (string memory); -+ -+ /** -+ * @notice Returns the collateral config of an eMode category -+ * @param id The id of the category -+ * @return The ltv,lt,lb of the category -+ */ -+ function getEModeCategoryCollateralConfig( -+ uint8 id -+ ) external view returns (DataTypes.CollateralConfig memory); -+ -+ /** -+ * @notice Returns the collateralBitmap of an eMode category -+ * @param id The id of the category -+ * @return The collateralBitmap of the category -+ */ -+ function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); -+ -+ /** -+ * @notice Returns the borrowableBitmap of an eMode category -+ * @param id The id of the category -+ * @return The borrowableBitmap of the category -+ */ -+ function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode -@@ -1514,10 +1792,20 @@ interface IPool { - function resetIsolationModeTotalDebt(address asset) external; - - /** -- * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate -- * @return The percentage of available liquidity to borrow, expressed in bps -- */ -- function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); -+ * @notice Sets the liquidation grace period of the given asset -+ * @dev To enable a liquidation grace period, a timestamp in the future should be set, -+ * To disable a liquidation grace period, any timestamp in the past works, like 0 -+ * @param asset The address of the underlying asset to set the liquidationGracePeriod -+ * @param until Timestamp when the liquidation grace period will end -+ **/ -+ function setLiquidationGracePeriod(address asset, uint40 until) external; -+ -+ /** -+ * @notice Returns the liquidation grace period of the given asset -+ * @param asset The address of the underlying asset -+ * @return Timestamp when the liquidation grace period will end -+ **/ -+ function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans -@@ -1546,7 +1834,7 @@ interface IPool { - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed -- **/ -+ */ - function mintToTreasury(address[] calldata assets) external; - - /** -@@ -1568,11 +1856,46 @@ interface IPool { - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man -- **/ -+ */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; -+ -+ /** -+ * @notice Gets the address of the external FlashLoanLogic -+ */ -+ function getFlashLoanLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external BorrowLogic -+ */ -+ function getBorrowLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external BridgeLogic -+ */ -+ function getBridgeLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external EModeLogic -+ */ -+ function getEModeLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external LiquidationLogic -+ */ -+ function getLiquidationLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external PoolLogic -+ */ -+ function getPoolLogic() external view returns (address); -+ -+ /** -+ * @notice Gets the address of the external SupplyLogic -+ */ -+ function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol -+// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - - /** - * @title ReserveConfiguration library -@@ -1587,17 +1910,19 @@ library ReserveConfiguration { - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore -- uint256 internal constant STABLE_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFF; // prettier-ignore -+ // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore -+ uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -- uint256 internal constant EMODE_CATEGORY_MASK = 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -+ // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore -+ uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; -@@ -1606,19 +1931,18 @@ library ReserveConfiguration { - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; -- uint256 internal constant STABLE_BORROWING_ENABLED_START_BIT_POSITION = 59; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; -- /// @dev bit 63 reserved -- -+ uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; -- uint256 internal constant EMODE_CATEGORY_START_BIT_POSITION = 168; -+ //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; -+ uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; -@@ -1628,7 +1952,6 @@ library ReserveConfiguration { - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; -- uint256 internal constant MAX_VALID_EMODE_CATEGORY = 255; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - -@@ -1639,7 +1962,7 @@ library ReserveConfiguration { - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv -- **/ -+ */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - -@@ -1650,7 +1973,7 @@ library ReserveConfiguration { - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value -- **/ -+ */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } -@@ -1659,7 +1982,7 @@ library ReserveConfiguration { - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold -- **/ -+ */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold -@@ -1675,7 +1998,7 @@ library ReserveConfiguration { - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold -- **/ -+ */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { -@@ -1686,7 +2009,7 @@ library ReserveConfiguration { - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus -- **/ -+ */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus -@@ -1702,7 +2025,7 @@ library ReserveConfiguration { - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus -- **/ -+ */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { -@@ -1713,7 +2036,7 @@ library ReserveConfiguration { - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals -- **/ -+ */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals -@@ -1727,7 +2050,7 @@ library ReserveConfiguration { - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset -- **/ -+ */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { -@@ -1738,7 +2061,7 @@ library ReserveConfiguration { - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state -- **/ -+ */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | -@@ -1749,7 +2072,7 @@ library ReserveConfiguration { - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state -- **/ -+ */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } -@@ -1758,7 +2081,7 @@ library ReserveConfiguration { - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state -- **/ -+ */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | -@@ -1769,7 +2092,7 @@ library ReserveConfiguration { - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state -- **/ -+ */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } -@@ -1778,7 +2101,7 @@ library ReserveConfiguration { - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state -- **/ -+ */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | -@@ -1789,7 +2112,7 @@ library ReserveConfiguration { - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state -- **/ -+ */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } -@@ -1802,7 +2125,7 @@ library ReserveConfiguration { - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable -- **/ -+ */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable -@@ -1820,7 +2143,7 @@ library ReserveConfiguration { - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag -- **/ -+ */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { -@@ -1832,7 +2155,7 @@ library ReserveConfiguration { - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed -- **/ -+ */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed -@@ -1847,7 +2170,7 @@ library ReserveConfiguration { - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag -- **/ -+ */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { -@@ -1858,7 +2181,7 @@ library ReserveConfiguration { - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise -- **/ -+ */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled -@@ -1872,43 +2195,18 @@ library ReserveConfiguration { - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state -- **/ -+ */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - -- /** -- * @notice Enables or disables stable rate borrowing on the reserve -- * @param self The reserve configuration -- * @param enabled True if the stable rate borrowing needs to be enabled, false otherwise -- **/ -- function setStableRateBorrowingEnabled( -- DataTypes.ReserveConfigurationMap memory self, -- bool enabled -- ) internal pure { -- self.data = -- (self.data & STABLE_BORROWING_MASK) | -- (uint256(enabled ? 1 : 0) << STABLE_BORROWING_ENABLED_START_BIT_POSITION); -- } -- -- /** -- * @notice Gets the stable rate borrowing state of the reserve -- * @param self The reserve configuration -- * @return The stable rate borrowing state -- **/ -- function getStableRateBorrowingEnabled( -- DataTypes.ReserveConfigurationMap memory self -- ) internal pure returns (bool) { -- return (self.data & ~STABLE_BORROWING_MASK) != 0; -- } -- - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor -- **/ -+ */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor -@@ -1924,7 +2222,7 @@ library ReserveConfiguration { - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor -- **/ -+ */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { -@@ -1935,7 +2233,7 @@ library ReserveConfiguration { - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap -- **/ -+ */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap -@@ -1949,7 +2247,7 @@ library ReserveConfiguration { - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap -- **/ -+ */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { -@@ -1960,7 +2258,7 @@ library ReserveConfiguration { - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap -- **/ -+ */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap -@@ -1974,7 +2272,7 @@ library ReserveConfiguration { - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap -- **/ -+ */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { -@@ -1985,7 +2283,7 @@ library ReserveConfiguration { - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset -- **/ -+ */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling -@@ -1999,7 +2297,7 @@ library ReserveConfiguration { - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) -- **/ -+ */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { -@@ -2010,7 +2308,7 @@ library ReserveConfiguration { - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee -- **/ -+ */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee -@@ -2029,7 +2327,7 @@ library ReserveConfiguration { - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee -- **/ -+ */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { -@@ -2041,7 +2339,7 @@ library ReserveConfiguration { - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap -- **/ -+ */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap -@@ -2057,7 +2355,7 @@ library ReserveConfiguration { - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap -- **/ -+ */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { -@@ -2065,28 +2363,55 @@ library ReserveConfiguration { - } - - /** -- * @notice Sets the eMode asset category -+ * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration -- * @param category The asset category when the user selects the eMode -- **/ -- function setEModeCategory( -+ * @param flashLoanEnabled True if the asset is flashloanable, false otherwise -+ */ -+ function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, -- uint256 category -+ bool flashLoanEnabled - ) internal pure { -- require(category <= MAX_VALID_EMODE_CATEGORY, Errors.INVALID_EMODE_CATEGORY); -+ self.data = -+ (self.data & FLASHLOAN_ENABLED_MASK) | -+ (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); -+ } -+ -+ /** -+ * @notice Gets the flashloanable flag for the reserve -+ * @param self The reserve configuration -+ * @return The flashloanable flag -+ */ -+ function getFlashLoanEnabled( -+ DataTypes.ReserveConfigurationMap memory self -+ ) internal pure returns (bool) { -+ return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; -+ } - -- self.data = (self.data & EMODE_CATEGORY_MASK) | (category << EMODE_CATEGORY_START_BIT_POSITION); -+ /** -+ * @notice Sets the virtual account active/not state of the reserve -+ * @param self The reserve configuration -+ * @param active The active state -+ */ -+ function setVirtualAccActive( -+ DataTypes.ReserveConfigurationMap memory self, -+ bool active -+ ) internal pure { -+ self.data = -+ (self.data & VIRTUAL_ACC_ACTIVE_MASK) | -+ (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** -- * @dev Gets the eMode asset category -+ * @notice Gets the virtual account active/not state of the reserve -+ * @dev The state should be true for all normal assets and should be false -+ * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration -- * @return The eMode category for the asset -- **/ -- function getEModeCategory( -+ * @return The active state -+ */ -+ function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self -- ) internal pure returns (uint256) { -- return (self.data & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION; -+ ) internal pure returns (bool) { -+ return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** -@@ -2095,19 +2420,17 @@ library ReserveConfiguration { - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled -- * @return The state flag representing stableRateBorrowing enabled - * @return The state flag representing paused -- **/ -+ */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self -- ) internal pure returns (bool, bool, bool, bool, bool) { -+ ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, -- (dataLocal & ~STABLE_BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } -@@ -2120,11 +2443,10 @@ library ReserveConfiguration { - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor -- * @return The state param representing eMode category -- **/ -+ */ - function getParams( - DataTypes.ReserveConfigurationMap memory self -- ) internal pure returns (uint256, uint256, uint256, uint256, uint256, uint256) { -+ ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( -@@ -2132,8 +2454,7 @@ library ReserveConfiguration { - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, -- (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION, -- (dataLocal & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION -+ (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - -@@ -2142,7 +2463,7 @@ library ReserveConfiguration { - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. -- **/ -+ */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { -@@ -2155,7 +2476,7 @@ library ReserveConfiguration { - } - } - + -// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol +// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/helpers/WalletBalanceProvider.sol - + /** * @title WalletBalanceProvider contract @@ -2240,7 +2561,7 @@ contract WalletBalanceProvider { reservesWithEth[j] ); - + - (bool isActive, , , , ) = configuration.getFlags(); + (bool isActive, , , ) = configuration.getFlags(); - + if (!isActive) { balances[j] = 0; ``` diff --git a/diffs/ARBITRUM_LINEA/WETH_GATEWAY_DIFF.md b/diffs/ARBITRUM_LINEA/WETH_GATEWAY_DIFF.md index 5c0c8010..3eeed023 100644 --- a/diffs/ARBITRUM_LINEA/WETH_GATEWAY_DIFF.md +++ b/diffs/ARBITRUM_LINEA/WETH_GATEWAY_DIFF.md @@ -3,157 +3,5 @@ diff --git a/./downloads/ARBITRUM/WETH_GATEWAY.sol b/./downloads/LINEA/WETH_GATE index 5984e04..cba4608 100644 --- a/./downloads/ARBITRUM/WETH_GATEWAY.sol +++ b/./downloads/LINEA/WETH_GATEWAY.sol -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BUSL-1.1 - pragma solidity ^0.8.0 ^0.8.10; - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol - - /* - * @dev Provides information about the current execution context, including the -@@ -24,7 +24,7 @@ abstract contract Context { - } - } - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - - /** - * @dev Interface of the ERC20 standard as defined in the EIP. -@@ -100,7 +100,7 @@ interface IERC20 { - event Approval(address indexed owner, address indexed spender, uint256 value); - } - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWETH.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWETH.sol - - interface IWETH { - function deposit() external payable; -@@ -112,7 +112,7 @@ interface IWETH { - function transferFrom(address src, address dst, uint256 wad) external returns (bool); - } - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol - - interface IWrappedTokenGatewayV3 { - function depositETH(address pool, address onBehalfOf, uint16 referralCode) external payable; -@@ -134,7 +134,7 @@ interface IWrappedTokenGatewayV3 { - ) external; - } - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAaveIncentivesController.sol - - /** - * @title IAaveIncentivesController -@@ -153,7 +153,7 @@ interface IAaveIncentivesController { - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - } - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPoolAddressesProvider.sol - - /** - * @title IPoolAddressesProvider -@@ -380,7 +380,7 @@ interface IPoolAddressesProvider { - function setPoolDataProvider(address newDataProvider) external; - } - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IScaledBalanceToken.sol - - /** - * @title IScaledBalanceToken -@@ -452,7 +452,7 @@ interface IScaledBalanceToken { - function getPreviousIndex(address user) external view returns (uint256); - } - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/helpers/Errors.sol - - /** - * @title Errors library -@@ -555,7 +555,7 @@ library Errors { - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode - } - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/types/DataTypes.sol - - library DataTypes { - /** -@@ -879,7 +879,7 @@ library DataTypes { - } - } - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - - /// @title Gnosis Protocol v2 Safe ERC20 Transfer Library - /// @author Gnosis Developers -@@ -992,7 +992,7 @@ library GPv2SafeERC20 { - } - } - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol - - /** - * @dev Contract module which provides a basic access control mechanism, where -@@ -1058,7 +1058,7 @@ contract Ownable is Context { - } - } - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPool.sol - - /** - * @title IPool -@@ -1889,7 +1889,7 @@ interface IPool { - function getSupplyLogic() external view returns (address); - } - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - - /** - * @title ReserveConfiguration library -@@ -2470,7 +2470,7 @@ library ReserveConfiguration { - } - } - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - - /** - * @title UserConfiguration library -@@ -2702,7 +2702,7 @@ library UserConfiguration { - } - } - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IInitializableAToken.sol - - /** - * @title IInitializableAToken -@@ -2755,7 +2755,7 @@ interface IInitializableAToken { - ) external; - } - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAToken.sol - - /** - * @title IAToken -@@ -2889,7 +2889,7 @@ interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - function rescueTokens(address token, address to, uint256 amount) external; - } - --// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/WrappedTokenGatewayV3.sol -+// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/WrappedTokenGatewayV3.sol - - /** - * @dev This contract is an upgrade of the WrappedTokenGatewayV3 contract, with immutable pool address. + ``` From ea3d854602450b582c3974423e733e05116227c9 Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Fri, 17 Jan 2025 16:45:11 +0530 Subject: [PATCH 3/4] chore: remove config files and downloads --- .gitignore | 2 + diff.ts | 122 - diff_config.ts | 293 - .../ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER.sol | 3226 ------ .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../helpers/AaveProtocolDataProvider.sol | 295 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 833 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPoolDataProvider.sol | 250 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../configuration/ReserveConfiguration.sol | 583 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - downloads/ARBITRUM/ACL_MANAGER.sol | 1066 -- .../openzeppelin/contracts/AccessControl.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/ERC165.sol | 28 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC165.sol | 24 - .../openzeppelin/contracts/Strings.sol | 66 - .../contracts/interfaces/IACLManager.sol | 175 - .../interfaces/IPoolAddressesProvider.sol | 227 - .../protocol/configuration/ACLManager.sol | 134 - .../protocol/libraries/helpers/Errors.sol | 100 - downloads/ARBITRUM/BORROW_LOGIC.sol | 5815 ----------- .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 833 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 583 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/logic/BorrowLogic.sol | 234 - .../protocol/libraries/logic/EModeLogic.sol | 72 - .../protocol/libraries/logic/GenericLogic.sol | 256 - .../libraries/logic/IsolationModeLogic.sol | 64 - .../protocol/libraries/logic/ReserveLogic.sol | 313 - .../libraries/logic/ValidationLogic.sol | 642 -- .../protocol/libraries/math/MathUtils.sol | 99 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/base/IncentivizedERC20.sol | 234 - downloads/ARBITRUM/BRIDGE_LOGIC.sol | 5671 ----------- .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 833 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 583 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/logic/BridgeLogic.sol | 150 - .../protocol/libraries/logic/EModeLogic.sol | 72 - .../protocol/libraries/logic/GenericLogic.sol | 256 - .../protocol/libraries/logic/ReserveLogic.sol | 313 - .../libraries/logic/ValidationLogic.sol | 642 -- .../protocol/libraries/math/MathUtils.sol | 99 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/base/IncentivizedERC20.sol | 234 - downloads/ARBITRUM/COLLECTOR_IMPL.sol | 1161 --- .../src/contracts/oz-common/Address.sol | 249 - .../src/contracts/oz-common/SafeERC20.sol | 117 - .../contracts/oz-common/interfaces/IERC20.sol | 83 - .../interfaces/draft-IERC20Permit.sol | 61 - .../Collector/src/contracts/Collector.sol | 346 - .../Collector/src/interfaces/ICollector.sol | 174 - .../Collector/src/libs/ReentrancyGuard.sol | 70 - .../src/libs/VersionedInitializable.sol | 42 - downloads/ARBITRUM/CONFIGURATOR_LOGIC.sol | 3165 ------ .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../BaseUpgradeabilityProxy.sol | 66 - .../InitializableUpgradeabilityProxy.sol | 29 - .../openzeppelin/upgradeability/Proxy.sol | 81 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/core/contracts/interfaces/IPool.sol | 835 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../IReserveInterestRateStrategy.sol | 30 - .../BaseImmutableAdminUpgradeabilityProxy.sol | 85 - ...zableImmutableAdminUpgradeabilityProxy.sol | 29 - .../configuration/ReserveConfiguration.sol | 640 -- .../protocol/libraries/helpers/Errors.sol | 108 - .../libraries/logic/ConfiguratorLogic.sol | 281 - .../types/ConfiguratorInputTypes.sol | 42 - .../protocol/libraries/types/DataTypes.sol | 313 - downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL.sol | 3210 ------ .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../contracts/interfaces/IACLManager.sol | 175 - .../contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../contracts/interfaces/IPool.sol | 737 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IScaledBalanceToken.sol | 72 - .../VersionedInitializable.sol | 77 - .../protocol/libraries/helpers/Errors.sol | 100 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 264 - .../protocol/tokenization/AToken.sol | 256 - .../protocol/tokenization/base/EIP712Base.sol | 70 - .../tokenization/base/IncentivizedERC20.sol | 235 - .../base/MintableIncentivizedERC20.sol | 66 - .../base/ScaledBalanceTokenBase.sol | 156 - .../DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol | 1852 ---- .../openzeppelin/contracts/IERC20.sol | 80 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../interfaces/IScaledBalanceToken.sol | 71 - .../VersionedInitializable.sol | 77 - .../misc/interfaces/IEACAggregatorProxy.sol | 19 - .../contracts/rewards/RewardsController.sol | 369 - .../contracts/rewards/RewardsDistributor.sol | 548 -- .../rewards/interfaces/IRewardsController.sol | 206 - .../interfaces/IRewardsDistributor.sol | 186 - .../interfaces/ITransferStrategyBase.sol | 46 - .../rewards/libraries/RewardsDataTypes.sol | 54 - .../DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol | 3058 ------ .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../contracts/interfaces/IACLManager.sol | 175 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/ICreditDelegationToken.sol | 60 - .../interfaces/IInitializableDebtToken.sol | 52 - .../contracts/interfaces/IPool.sol | 737 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../VersionedInitializable.sol | 77 - .../protocol/libraries/helpers/Errors.sol | 100 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 264 - .../tokenization/VariableDebtToken.sol | 155 - .../tokenization/base/DebtTokenBase.sol | 102 - .../protocol/tokenization/base/EIP712Base.sol | 70 - .../tokenization/base/IncentivizedERC20.sol | 235 - .../base/MintableIncentivizedERC20.sol | 66 - .../base/ScaledBalanceTokenBase.sol | 156 - downloads/ARBITRUM/EMISSION_MANAGER.sol | 791 -- .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/Ownable.sol | 69 - .../misc/interfaces/IEACAggregatorProxy.sol | 19 - .../contracts/rewards/EmissionManager.sol | 118 - .../rewards/interfaces/IEmissionManager.sol | 129 - .../rewards/interfaces/IRewardsController.sol | 205 - .../interfaces/IRewardsDistributor.sol | 186 - .../interfaces/ITransferStrategyBase.sol | 46 - .../rewards/libraries/RewardsDataTypes.sol | 43 - downloads/ARBITRUM/EMODE_LOGIC.sol | 5534 ----------- .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 833 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 583 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/logic/EModeLogic.sol | 72 - .../protocol/libraries/logic/GenericLogic.sol | 256 - .../protocol/libraries/logic/ReserveLogic.sol | 313 - .../libraries/logic/ValidationLogic.sol | 642 -- .../protocol/libraries/math/MathUtils.sol | 99 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/base/IncentivizedERC20.sol | 234 - downloads/ARBITRUM/FLASHLOAN_LOGIC.sol | 6141 ------------ .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 833 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../interfaces/IFlashLoanReceiver.sol | 36 - .../interfaces/IFlashLoanSimpleReceiver.sol | 36 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 583 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/logic/BorrowLogic.sol | 234 - .../protocol/libraries/logic/EModeLogic.sol | 72 - .../libraries/logic/FlashLoanLogic.sol | 277 - .../protocol/libraries/logic/GenericLogic.sol | 256 - .../libraries/logic/IsolationModeLogic.sol | 64 - .../protocol/libraries/logic/ReserveLogic.sol | 313 - .../libraries/logic/ValidationLogic.sol | 642 -- .../protocol/libraries/math/MathUtils.sol | 99 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/base/IncentivizedERC20.sol | 234 - downloads/ARBITRUM/L2_ENCODER.sol | 1811 ---- .../chainlink/AggregatorInterface.sol | 19 - .../gnosis/contracts/GPv2SafeERC20.sol | 124 - .../openzeppelin/contracts/AccessControl.sol | 220 - .../openzeppelin/contracts/Address.sol | 61 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/ERC165.sol | 28 - .../openzeppelin/contracts/ERC20.sol | 344 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC165.sol | 24 - .../openzeppelin/contracts/IERC20.sol | 80 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/Ownable.sol | 69 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../openzeppelin/contracts/SafeMath.sol | 59 - .../openzeppelin/contracts/Strings.sol | 66 - .../BaseAdminUpgradeabilityProxy.sol | 126 - .../BaseUpgradeabilityProxy.sol | 66 - .../InitializableAdminUpgradeabilityProxy.sol | 42 - .../InitializableUpgradeabilityProxy.sol | 29 - .../openzeppelin/upgradeability/Proxy.sol | 73 - .../upgradeability/UpgradeabilityProxy.sol | 28 - .../deployments/ReservesSetupHelper.sol | 57 - .../flashloan/base/FlashLoanReceiverBase.sol | 21 - .../interfaces/IFlashLoanReceiver.sol | 36 - .../interfaces/IFlashLoanSimpleReceiver.sol | 36 - .../contracts/interfaces/IACLManager.sol | 175 - .../core-v3/contracts/interfaces/IAToken.sol | 150 - .../interfaces/IAaveIncentivesController.sol | 176 - .../contracts/interfaces/IAaveOracle.sol | 71 - .../interfaces/ICreditDelegationToken.sol | 60 - .../contracts/interfaces/IDelegationToken.sol | 15 - .../contracts/interfaces/IERC20WithPermit.sol | 33 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../core-v3/contracts/interfaces/IL2Pool.sol | 141 - .../core-v3/contracts/interfaces/IPool.sol | 747 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../IPoolAddressesProviderRegistry.sol | 61 - .../interfaces/IPoolConfigurator.sol | 468 - .../interfaces/IPoolDataProvider.sol | 52 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 39 - .../interfaces/IScaledBalanceToken.sol | 71 - .../contracts/interfaces/IStableDebtToken.sol | 153 - .../interfaces/IVariableDebtToken.sol | 50 - .../core-v3/contracts/misc/AaveOracle.sol | 152 - .../misc/AaveProtocolDataProvider.sol | 377 - .../core-v3/contracts/misc/L2Encoder.sol | 355 - .../mocks/flashloan/MockFlashLoanReceiver.sol | 78 - .../helpers/MockIncentivesController.sol | 87 - .../contracts/mocks/helpers/MockL2Pool.sol | 13 - .../contracts/mocks/helpers/MockPool.sol | 53 - .../helpers/MockReserveConfiguration.sol | 174 - .../mocks/tokens/MintableDelegationERC20.sol | 35 - .../contracts/mocks/tokens/MintableERC20.sol | 92 - .../mocks/upgradeability/MockAToken.sol | 14 - .../MockInitializableImplementation.sol | 115 - .../upgradeability/MockStableDebtToken.sol | 13 - .../upgradeability/MockVariableDebtToken.sol | 13 - .../protocol/configuration/ACLManager.sol | 134 - .../configuration/PoolAddressesProvider.sol | 210 - .../PoolAddressesProviderRegistry.sol | 105 - .../BaseImmutableAdminUpgradeabilityProxy.sol | 86 - ...zableImmutableAdminUpgradeabilityProxy.sol | 29 - .../VersionedInitializable.sol | 77 - .../configuration/ReserveConfiguration.sol | 633 -- .../configuration/UserConfiguration.sol | 251 - .../protocol/libraries/helpers/Errors.sol | 100 - .../protocol/libraries/helpers/Helpers.sol | 29 - .../protocol/libraries/logic/BorrowLogic.sol | 349 - .../protocol/libraries/logic/BridgeLogic.sol | 141 - .../libraries/logic/CalldataLogic.sol | 322 - .../libraries/logic/ConfiguratorLogic.sol | 268 - .../protocol/libraries/logic/EModeLogic.sol | 121 - .../libraries/logic/FlashLoanLogic.sol | 262 - .../protocol/libraries/logic/GenericLogic.sol | 280 - .../libraries/logic/IsolationModeLogic.sol | 64 - .../libraries/logic/LiquidationLogic.sol | 538 - .../protocol/libraries/logic/PoolLogic.sol | 192 - .../protocol/libraries/logic/ReserveLogic.sol | 362 - .../protocol/libraries/logic/SupplyLogic.sol | 290 - .../libraries/logic/ValidationLogic.sol | 726 -- .../protocol/libraries/math/MathUtils.sol | 101 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../types/ConfiguratorInputTypes.sol | 41 - .../protocol/libraries/types/DataTypes.sol | 268 - .../DefaultReserveInterestRateStrategy.sol | 299 - .../contracts/protocol/pool/L2Pool.sol | 135 - .../core-v3/contracts/protocol/pool/Pool.sol | 773 -- .../protocol/pool/PoolConfigurator.sol | 528 - .../contracts/protocol/pool/PoolStorage.sol | 51 - .../protocol/tokenization/AToken.sol | 272 - .../tokenization/DelegationAwareAToken.sol | 37 - .../protocol/tokenization/StableDebtToken.sol | 430 - .../tokenization/VariableDebtToken.sol | 157 - .../tokenization/base/DebtTokenBase.sol | 112 - .../protocol/tokenization/base/EIP712Base.sol | 70 - .../tokenization/base/IncentivizedERC20.sol | 253 - .../base/MintableIncentivizedERC20.sol | 66 - .../base/ScaledBalanceTokenBase.sol | 128 - .../adapters/paraswap/BaseParaSwapAdapter.sol | 139 - .../paraswap/BaseParaSwapBuyAdapter.sol | 109 - .../paraswap/BaseParaSwapSellAdapter.sol | 107 - .../paraswap/ParaSwapLiquiditySwapAdapter.sol | 211 - .../paraswap/ParaSwapRepayAdapter.sol | 229 - .../paraswap/interfaces/IParaSwapAugustus.sol | 6 - .../interfaces/IParaSwapAugustusRegistry.sol | 6 - .../openzeppelin/ReentrancyGuard.sol | 62 - .../contracts/libraries/DataTypesHelper.sol | 30 - .../misc/UiIncentiveDataProviderV3.sol | 411 - .../contracts/misc/UiPoolDataProviderV3.sol | 262 - .../contracts/misc/WETHGateway.sol | 218 - .../contracts/misc/WalletBalanceProvider.sol | 110 - .../misc/interfaces/IEACAggregatorProxy.sol | 19 - .../misc/interfaces/IERC20DetailedBytes.sol | 12 - .../interfaces/IUiIncentiveDataProviderV3.sol | 74 - .../misc/interfaces/IUiPoolDataProviderV3.sol | 114 - .../contracts/misc/interfaces/IWETH.sol | 16 - .../misc/interfaces/IWETHGateway.sol | 40 - .../contracts/rewards/RewardsController.sol | 367 - .../contracts/rewards/RewardsDistributor.sol | 516 - .../IPullRewardsTransferStrategy.sol | 15 - .../rewards/interfaces/IRewardsController.sol | 205 - .../interfaces/IRewardsDistributor.sol | 164 - .../rewards/interfaces/IStakedToken.sol | 14 - .../IStakedTokenTransferStrategy.sol | 31 - .../interfaces/ITransferStrategyBase.sol | 46 - .../rewards/libraries/RewardsDataTypes.sol | 43 - .../PullRewardsTransferStrategy.sol | 49 - .../StakedTokenTransferStrategy.sol | 73 - .../TransferStrategyBase.sol | 66 - .../contracts/treasury/Collector.sol | 79 - .../treasury/CollectorController.sol | 56 - .../treasury/interfaces/ICollector.sol | 60 - .../openzeppelin/contracts/IERC20Detailed.sol | 3 - .../InitializableAdminUpgradeabilityProxy.sol | 3 - .../deployments/ReservesSetupHelper.sol | 3 - .../core-v3/contracts/misc/AaveOracle.sol | 3 - .../misc/AaveProtocolDataProvider.sol | 3 - .../core-v3/contracts/misc/L2Encoder.sol | 3 - .../mocks/flashloan/MockFlashLoanReceiver.sol | 3 - .../helpers/MockIncentivesController.sol | 3 - .../contracts/mocks/helpers/MockL2Pool.sol | 3 - .../contracts/mocks/helpers/MockPool.sol | 3 - .../helpers/MockReserveConfiguration.sol | 3 - .../mocks/tokens/MintableDelegationERC20.sol | 3 - .../contracts/mocks/tokens/MintableERC20.sol | 3 - .../mocks/upgradeability/MockAToken.sol | 3 - .../MockInitializableImplementation.sol | 3 - .../upgradeability/MockStableDebtToken.sol | 3 - .../upgradeability/MockVariableDebtToken.sol | 3 - .../protocol/configuration/ACLManager.sol | 3 - .../configuration/PoolAddressesProvider.sol | 3 - .../PoolAddressesProviderRegistry.sol | 3 - ...zableImmutableAdminUpgradeabilityProxy.sol | 3 - .../protocol/libraries/logic/BorrowLogic.sol | 3 - .../protocol/libraries/logic/BridgeLogic.sol | 3 - .../libraries/logic/CalldataLogic.sol | 3 - .../protocol/libraries/logic/EModeLogic.sol | 3 - .../libraries/logic/FlashLoanLogic.sol | 3 - .../protocol/libraries/logic/GenericLogic.sol | 3 - .../protocol/libraries/logic/ReserveLogic.sol | 3 - .../protocol/libraries/logic/SupplyLogic.sol | 3 - .../libraries/logic/ValidationLogic.sol | 3 - .../DefaultReserveInterestRateStrategy.sol | 3 - .../contracts/protocol/pool/L2Pool.sol | 3 - .../core-v3/contracts/protocol/pool/Pool.sol | 3 - .../protocol/pool/PoolConfigurator.sol | 3 - .../protocol/tokenization/AToken.sol | 3 - .../tokenization/DelegationAwareAToken.sol | 3 - .../protocol/tokenization/StableDebtToken.sol | 3 - .../tokenization/VariableDebtToken.sol | 3 - .../paraswap/ParaSwapLiquiditySwapAdapter.sol | 3 - .../paraswap/ParaSwapRepayAdapter.sol | 3 - .../misc/UiIncentiveDataProviderV3.sol | 3 - .../contracts/misc/UiPoolDataProviderV3.sol | 3 - .../contracts/misc/WETHGateway.sol | 3 - .../contracts/misc/WalletBalanceProvider.sol | 3 - .../contracts/rewards/RewardsController.sol | 3 - .../PullRewardsTransferStrategy.sol | 3 - .../StakedTokenTransferStrategy.sol | 3 - .../contracts/treasury/Collector.sol | 3 - .../treasury/CollectorController.sol | 3 - downloads/ARBITRUM/L2_POOL_IMPL.sol | 8682 ----------------- .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../contracts/instances/L2PoolInstance.sol | 10 - .../src/contracts/instances/PoolInstance.sol | 27 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../contracts/interfaces/IERC20WithPermit.sol | 33 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IL2Pool.sol | 116 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../VersionedInitializable.sol | 77 - .../interfaces/IFlashLoanReceiver.sol | 36 - .../interfaces/IFlashLoanSimpleReceiver.sol | 36 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 584 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/logic/BorrowLogic.sol | 234 - .../protocol/libraries/logic/BridgeLogic.sol | 150 - .../libraries/logic/CalldataLogic.sol | 233 - .../protocol/libraries/logic/EModeLogic.sol | 72 - .../libraries/logic/FlashLoanLogic.sol | 277 - .../protocol/libraries/logic/GenericLogic.sol | 256 - .../libraries/logic/IsolationModeLogic.sol | 64 - .../libraries/logic/LiquidationLogic.sol | 460 - .../protocol/libraries/logic/PoolLogic.sol | 201 - .../protocol/libraries/logic/ReserveLogic.sol | 313 - .../protocol/libraries/logic/SupplyLogic.sol | 300 - .../libraries/logic/ValidationLogic.sol | 642 -- .../protocol/libraries/math/MathUtils.sol | 99 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../src/contracts/protocol/pool/L2Pool.sol | 102 - .../src/contracts/protocol/pool/Pool.sol | 871 -- .../contracts/protocol/pool/PoolStorage.sol | 51 - .../tokenization/base/IncentivizedERC20.sol | 234 - downloads/ARBITRUM/LIQUIDATION_LOGIC.sol | 6036 ------------ .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 833 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 583 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/logic/EModeLogic.sol | 72 - .../protocol/libraries/logic/GenericLogic.sol | 256 - .../libraries/logic/IsolationModeLogic.sol | 64 - .../libraries/logic/LiquidationLogic.sol | 460 - .../protocol/libraries/logic/ReserveLogic.sol | 313 - .../libraries/logic/ValidationLogic.sol | 642 -- .../protocol/libraries/math/MathUtils.sol | 99 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/base/IncentivizedERC20.sol | 234 - downloads/ARBITRUM/ORACLE.sol | 759 -- .../chainlink/AggregatorInterface.sol | 19 - .../contracts/interfaces/IACLManager.sol | 175 - .../contracts/interfaces/IAaveOracle.sol | 71 - .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../core-v3/contracts/misc/AaveOracle.sol | 152 - .../protocol/libraries/helpers/Errors.sol | 100 - .../ARBITRUM/POOL_ADDRESSES_PROVIDER.sol | 855 -- .../openzeppelin/contracts/Address.sol | 61 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/Ownable.sol | 69 - .../BaseUpgradeabilityProxy.sol | 66 - .../InitializableUpgradeabilityProxy.sol | 29 - .../openzeppelin/upgradeability/Proxy.sol | 73 - .../interfaces/IPoolAddressesProvider.sol | 227 - .../configuration/PoolAddressesProvider.sol | 210 - .../BaseImmutableAdminUpgradeabilityProxy.sol | 86 - ...zableImmutableAdminUpgradeabilityProxy.sol | 29 - .../POOL_ADDRESSES_PROVIDER_REGISTRY.sol | 349 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/Ownable.sol | 69 - .../IPoolAddressesProviderRegistry.sol | 61 - .../PoolAddressesProviderRegistry.sol | 105 - .../protocol/libraries/helpers/Errors.sol | 100 - downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL.sol | 4995 ---------- .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../BaseUpgradeabilityProxy.sol | 66 - .../InitializableUpgradeabilityProxy.sol | 29 - .../openzeppelin/upgradeability/Proxy.sol | 81 - .../instances/PoolConfiguratorInstance.sol | 18 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../interfaces/IAaveIncentivesController.sol | 19 - .../IDefaultInterestRateStrategyV2.sol | 161 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPoolConfigurator.sol | 551 -- .../interfaces/IPoolDataProvider.sol | 250 - .../IReserveInterestRateStrategy.sol | 29 - .../BaseImmutableAdminUpgradeabilityProxy.sol | 85 - ...zableImmutableAdminUpgradeabilityProxy.sol | 29 - .../VersionedInitializable.sol | 77 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 584 -- .../protocol/libraries/helpers/Errors.sol | 103 - .../libraries/logic/ConfiguratorLogic.sol | 223 - .../libraries/math/PercentageMath.sol | 61 - .../types/ConfiguratorInputTypes.sol | 39 - .../protocol/libraries/types/DataTypes.sol | 324 - .../protocol/pool/PoolConfigurator.sol | 630 -- downloads/ARBITRUM/POOL_LOGIC.sol | 5723 ----------- .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 833 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 583 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/logic/EModeLogic.sol | 72 - .../protocol/libraries/logic/GenericLogic.sol | 256 - .../protocol/libraries/logic/PoolLogic.sol | 201 - .../protocol/libraries/logic/ReserveLogic.sol | 313 - .../libraries/logic/ValidationLogic.sol | 642 -- .../protocol/libraries/math/MathUtils.sol | 99 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/base/IncentivizedERC20.sol | 234 - downloads/ARBITRUM/SUPPLY_LOGIC.sol | 5822 ----------- .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 833 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 583 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/logic/EModeLogic.sol | 72 - .../protocol/libraries/logic/GenericLogic.sol | 256 - .../protocol/libraries/logic/ReserveLogic.sol | 313 - .../protocol/libraries/logic/SupplyLogic.sol | 300 - .../libraries/logic/ValidationLogic.sol | 642 -- .../protocol/libraries/math/MathUtils.sol | 99 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/base/IncentivizedERC20.sol | 234 - .../ARBITRUM/UI_INCENTIVE_DATA_PROVIDER.sol | 4044 -------- .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../helpers/UiIncentiveDataProviderV3.sol | 294 - .../interfaces/IEACAggregatorProxy.sol | 19 - .../interfaces/IUiIncentiveDataProviderV3.sol | 73 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../interfaces/IAaveIncentivesController.sol | 19 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../configuration/ReserveConfiguration.sol | 584 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/base/IncentivizedERC20.sol | 234 - .../rewards/interfaces/IRewardsController.sol | 203 - .../interfaces/IRewardsDistributor.sol | 177 - .../interfaces/ITransferStrategyBase.sol | 38 - .../rewards/libraries/RewardsDataTypes.sol | 54 - downloads/ARBITRUM/UI_POOL_DATA_PROVIDER.sol | 4068 -------- .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../helpers/AaveProtocolDataProvider.sol | 295 - .../helpers/UiPoolDataProviderV3.sol | 265 - .../interfaces/IEACAggregatorProxy.sol | 19 - .../interfaces/IERC20DetailedBytes.sol | 12 - .../interfaces/IUiPoolDataProviderV3.sol | 95 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../src/contracts/interfaces/IAaveOracle.sol | 71 - .../IDefaultInterestRateStrategyV2.sol | 161 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPoolDataProvider.sol | 250 - .../interfaces/IPriceOracleGetter.sol | 30 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../configuration/ReserveConfiguration.sol | 584 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../ARBITRUM/WALLET_BALANCE_PROVIDER.sol | 2255 ----- .../gnosis/contracts/GPv2SafeERC20.sol | 124 - .../openzeppelin/contracts/Address.sol | 61 - .../openzeppelin/contracts/IERC20.sol | 80 - .../core-v3/contracts/interfaces/IPool.sol | 747 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../configuration/ReserveConfiguration.sol | 633 -- .../protocol/libraries/helpers/Errors.sol | 100 - .../protocol/libraries/types/DataTypes.sol | 268 - .../contracts/misc/WalletBalanceProvider.sol | 110 - downloads/ARBITRUM/WETH_GATEWAY.sol | 3076 ------ .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/Ownable.sol | 69 - .../helpers/WrappedTokenGatewayV3.sol | 197 - .../contracts/helpers/interfaces/IWETH.sol | 12 - .../interfaces/IWrappedTokenGatewayV3.sol | 22 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IScaledBalanceToken.sol | 72 - .../configuration/ReserveConfiguration.sol | 584 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/types/DataTypes.sol | 324 - .../LINEA/AAVE_PROTOCOL_DATA_PROVIDER.sol | 3228 ------ .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../helpers/AaveProtocolDataProvider.sol | 295 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPoolDataProvider.sol | 250 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../configuration/ReserveConfiguration.sol | 584 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - downloads/LINEA/ACL_MANAGER.sol | 1069 -- .../openzeppelin/contracts/AccessControl.sol | 216 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/ERC165.sol | 28 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC165.sol | 24 - .../openzeppelin/contracts/Strings.sol | 66 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../interfaces/IPoolAddressesProvider.sol | 227 - .../protocol/configuration/ACLManager.sol | 133 - .../protocol/libraries/helpers/Errors.sol | 103 - downloads/LINEA/BORROW_LOGIC.sol | 5817 ----------- .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 584 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/logic/BorrowLogic.sol | 234 - .../protocol/libraries/logic/EModeLogic.sol | 72 - .../protocol/libraries/logic/GenericLogic.sol | 256 - .../libraries/logic/IsolationModeLogic.sol | 64 - .../protocol/libraries/logic/ReserveLogic.sol | 313 - .../libraries/logic/ValidationLogic.sol | 642 -- .../protocol/libraries/math/MathUtils.sol | 99 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/base/IncentivizedERC20.sol | 234 - downloads/LINEA/BRIDGE_LOGIC.sol | 5673 ----------- .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 584 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/logic/BridgeLogic.sol | 150 - .../protocol/libraries/logic/EModeLogic.sol | 72 - .../protocol/libraries/logic/GenericLogic.sol | 256 - .../protocol/libraries/logic/ReserveLogic.sol | 313 - .../libraries/logic/ValidationLogic.sol | 642 -- .../protocol/libraries/math/MathUtils.sol | 99 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/base/IncentivizedERC20.sol | 234 - downloads/LINEA/COLLECTOR_IMPL.sol | 1035 -- .../openzeppelin/ReentrancyGuard.sol | 70 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/SafeERC20.sol | 87 - .../VersionedInitializable.sol | 77 - .../src/contracts/treasury/Collector.sol | 341 - .../src/contracts/treasury/ICollector.sol | 174 - downloads/LINEA/CONFIGURATOR_LOGIC.sol | 3052 ------ .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../BaseUpgradeabilityProxy.sol | 66 - .../InitializableUpgradeabilityProxy.sol | 29 - .../openzeppelin/upgradeability/Proxy.sol | 81 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../IReserveInterestRateStrategy.sol | 29 - .../BaseImmutableAdminUpgradeabilityProxy.sol | 85 - ...zableImmutableAdminUpgradeabilityProxy.sol | 29 - .../configuration/ReserveConfiguration.sol | 584 -- .../protocol/libraries/helpers/Errors.sol | 103 - .../libraries/logic/ConfiguratorLogic.sol | 223 - .../types/ConfiguratorInputTypes.sol | 39 - .../protocol/libraries/types/DataTypes.sol | 324 - downloads/LINEA/DEFAULT_A_TOKEN_IMPL.sol | 3383 ------- .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../contracts/instances/ATokenInstance.sol | 49 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IScaledBalanceToken.sol | 72 - .../VersionedInitializable.sol | 77 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../protocol/tokenization/AToken.sol | 227 - .../protocol/tokenization/base/EIP712Base.sol | 70 - .../tokenization/base/IncentivizedERC20.sol | 234 - .../base/MintableIncentivizedERC20.sol | 66 - .../base/ScaledBalanceTokenBase.sol | 156 - .../DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol | 1853 ---- .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../interfaces/IEACAggregatorProxy.sol | 19 - .../interfaces/IScaledBalanceToken.sol | 72 - .../VersionedInitializable.sol | 77 - .../contracts/rewards/RewardsController.sol | 355 - .../contracts/rewards/RewardsDistributor.sol | 537 - .../rewards/interfaces/IRewardsController.sol | 203 - .../interfaces/IRewardsDistributor.sol | 177 - .../interfaces/ITransferStrategyBase.sol | 38 - .../rewards/libraries/RewardsDataTypes.sol | 54 - .../DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol | 3230 ------ .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../instances/VariableDebtTokenInstance.sol | 46 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/ICreditDelegationToken.sol | 60 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../VersionedInitializable.sol | 77 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/VariableDebtToken.sol | 128 - .../tokenization/base/DebtTokenBase.sol | 102 - .../protocol/tokenization/base/EIP712Base.sol | 70 - .../tokenization/base/IncentivizedERC20.sol | 234 - .../base/MintableIncentivizedERC20.sol | 66 - .../base/ScaledBalanceTokenBase.sol | 156 - downloads/LINEA/EMISSION_MANAGER.sol | 789 -- .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/Ownable.sol | 69 - .../interfaces/IEACAggregatorProxy.sol | 19 - .../src/contracts/rewards/EmissionManager.sol | 109 - .../rewards/interfaces/IEmissionManager.sol | 118 - .../rewards/interfaces/IRewardsController.sol | 203 - .../interfaces/IRewardsDistributor.sol | 177 - .../interfaces/ITransferStrategyBase.sol | 38 - .../rewards/libraries/RewardsDataTypes.sol | 54 - downloads/LINEA/EMODE_LOGIC.sol | 5536 ----------- .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 584 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/logic/EModeLogic.sol | 72 - .../protocol/libraries/logic/GenericLogic.sol | 256 - .../protocol/libraries/logic/ReserveLogic.sol | 313 - .../libraries/logic/ValidationLogic.sol | 642 -- .../protocol/libraries/math/MathUtils.sol | 99 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/base/IncentivizedERC20.sol | 234 - downloads/LINEA/FLASHLOAN_LOGIC.sol | 6143 ------------ .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../interfaces/IFlashLoanReceiver.sol | 36 - .../interfaces/IFlashLoanSimpleReceiver.sol | 36 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 584 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/logic/BorrowLogic.sol | 234 - .../protocol/libraries/logic/EModeLogic.sol | 72 - .../libraries/logic/FlashLoanLogic.sol | 277 - .../protocol/libraries/logic/GenericLogic.sol | 256 - .../libraries/logic/IsolationModeLogic.sol | 64 - .../protocol/libraries/logic/ReserveLogic.sol | 313 - .../libraries/logic/ValidationLogic.sol | 642 -- .../protocol/libraries/math/MathUtils.sol | 99 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/base/IncentivizedERC20.sol | 234 - downloads/LINEA/L2_ENCODER.sol | 1932 ---- .../openzeppelin/contracts/SafeCast.sol | 255 - .../src/contracts/helpers/L2Encoder.sol | 296 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../protocol/libraries/types/DataTypes.sol | 324 - downloads/LINEA/L2_POOL_IMPL.sol | 8682 ----------------- .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../contracts/instances/L2PoolInstance.sol | 10 - .../src/contracts/instances/PoolInstance.sol | 27 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../contracts/interfaces/IERC20WithPermit.sol | 33 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IL2Pool.sol | 116 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../VersionedInitializable.sol | 77 - .../interfaces/IFlashLoanReceiver.sol | 36 - .../interfaces/IFlashLoanSimpleReceiver.sol | 36 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 584 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/logic/BorrowLogic.sol | 234 - .../protocol/libraries/logic/BridgeLogic.sol | 150 - .../libraries/logic/CalldataLogic.sol | 233 - .../protocol/libraries/logic/EModeLogic.sol | 72 - .../libraries/logic/FlashLoanLogic.sol | 277 - .../protocol/libraries/logic/GenericLogic.sol | 256 - .../libraries/logic/IsolationModeLogic.sol | 64 - .../libraries/logic/LiquidationLogic.sol | 460 - .../protocol/libraries/logic/PoolLogic.sol | 201 - .../protocol/libraries/logic/ReserveLogic.sol | 313 - .../protocol/libraries/logic/SupplyLogic.sol | 300 - .../libraries/logic/ValidationLogic.sol | 642 -- .../protocol/libraries/math/MathUtils.sol | 99 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../src/contracts/protocol/pool/L2Pool.sol | 102 - .../src/contracts/protocol/pool/Pool.sol | 871 -- .../contracts/protocol/pool/PoolStorage.sol | 51 - .../tokenization/base/IncentivizedERC20.sol | 234 - downloads/LINEA/LIQUIDATION_LOGIC.sol | 6038 ------------ .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 584 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/logic/EModeLogic.sol | 72 - .../protocol/libraries/logic/GenericLogic.sol | 256 - .../libraries/logic/IsolationModeLogic.sol | 64 - .../libraries/logic/LiquidationLogic.sol | 460 - .../protocol/libraries/logic/ReserveLogic.sol | 313 - .../libraries/logic/ValidationLogic.sol | 642 -- .../protocol/libraries/math/MathUtils.sol | 99 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/base/IncentivizedERC20.sol | 234 - downloads/LINEA/ORACLE.sol | 762 -- .../chainlink/AggregatorInterface.sol | 19 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAaveOracle.sol | 71 - .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../src/contracts/misc/AaveOracle.sol | 146 - .../protocol/libraries/helpers/Errors.sol | 103 - downloads/LINEA/POOL_ADDRESSES_PROVIDER.sol | 1022 -- .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/Ownable.sol | 69 - .../BaseUpgradeabilityProxy.sol | 66 - .../InitializableUpgradeabilityProxy.sol | 29 - .../openzeppelin/upgradeability/Proxy.sol | 81 - .../interfaces/IPoolAddressesProvider.sol | 227 - .../BaseImmutableAdminUpgradeabilityProxy.sol | 85 - ...zableImmutableAdminUpgradeabilityProxy.sol | 29 - .../configuration/PoolAddressesProvider.sol | 209 - .../POOL_ADDRESSES_PROVIDER_REGISTRY.sol | 352 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/Ownable.sol | 69 - .../IPoolAddressesProviderRegistry.sol | 60 - .../PoolAddressesProviderRegistry.sol | 102 - .../protocol/libraries/helpers/Errors.sol | 103 - downloads/LINEA/POOL_CONFIGURATOR_IMPL.sol | 4995 ---------- .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../BaseUpgradeabilityProxy.sol | 66 - .../InitializableUpgradeabilityProxy.sol | 29 - .../openzeppelin/upgradeability/Proxy.sol | 81 - .../instances/PoolConfiguratorInstance.sol | 18 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../interfaces/IAaveIncentivesController.sol | 19 - .../IDefaultInterestRateStrategyV2.sol | 161 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPoolConfigurator.sol | 551 -- .../interfaces/IPoolDataProvider.sol | 250 - .../IReserveInterestRateStrategy.sol | 29 - .../BaseImmutableAdminUpgradeabilityProxy.sol | 85 - ...zableImmutableAdminUpgradeabilityProxy.sol | 29 - .../VersionedInitializable.sol | 77 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 584 -- .../protocol/libraries/helpers/Errors.sol | 103 - .../libraries/logic/ConfiguratorLogic.sol | 223 - .../libraries/math/PercentageMath.sol | 61 - .../types/ConfiguratorInputTypes.sol | 39 - .../protocol/libraries/types/DataTypes.sol | 324 - .../protocol/pool/PoolConfigurator.sol | 630 -- downloads/LINEA/POOL_LOGIC.sol | 5725 ----------- .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 584 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/logic/EModeLogic.sol | 72 - .../protocol/libraries/logic/GenericLogic.sol | 256 - .../protocol/libraries/logic/PoolLogic.sol | 201 - .../protocol/libraries/logic/ReserveLogic.sol | 313 - .../libraries/logic/ValidationLogic.sol | 642 -- .../protocol/libraries/math/MathUtils.sol | 99 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/base/IncentivizedERC20.sol | 234 - downloads/LINEA/SUPPLY_LOGIC.sol | 5824 ----------- .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IAccessControl.sol | 91 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPriceOracleGetter.sol | 30 - .../interfaces/IPriceOracleSentinel.sol | 67 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../configuration/EModeConfiguration.sol | 53 - .../configuration/ReserveConfiguration.sol | 584 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/logic/EModeLogic.sol | 72 - .../protocol/libraries/logic/GenericLogic.sol | 256 - .../protocol/libraries/logic/ReserveLogic.sol | 313 - .../protocol/libraries/logic/SupplyLogic.sol | 300 - .../libraries/logic/ValidationLogic.sol | 642 -- .../protocol/libraries/math/MathUtils.sol | 99 - .../libraries/math/PercentageMath.sol | 61 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/base/IncentivizedERC20.sol | 234 - .../LINEA/UI_INCENTIVE_DATA_PROVIDER.sol | 4044 -------- .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../openzeppelin/contracts/SafeCast.sol | 255 - .../helpers/UiIncentiveDataProviderV3.sol | 294 - .../interfaces/IEACAggregatorProxy.sol | 19 - .../interfaces/IUiIncentiveDataProviderV3.sol | 73 - .../src/contracts/interfaces/IACLManager.sol | 175 - .../interfaces/IAaveIncentivesController.sol | 19 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../configuration/ReserveConfiguration.sol | 584 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - .../tokenization/base/IncentivizedERC20.sol | 234 - .../rewards/interfaces/IRewardsController.sol | 203 - .../interfaces/IRewardsDistributor.sol | 177 - .../interfaces/ITransferStrategyBase.sol | 38 - .../rewards/libraries/RewardsDataTypes.sol | 54 - downloads/LINEA/UI_POOL_DATA_PROVIDER.sol | 4068 -------- .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/IERC20Detailed.sol | 12 - .../helpers/AaveProtocolDataProvider.sol | 295 - .../helpers/UiPoolDataProviderV3.sol | 265 - .../interfaces/IEACAggregatorProxy.sol | 19 - .../interfaces/IERC20DetailedBytes.sol | 12 - .../interfaces/IUiPoolDataProviderV3.sol | 95 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../src/contracts/interfaces/IAaveOracle.sol | 71 - .../IDefaultInterestRateStrategyV2.sol | 161 - .../interfaces/IInitializableAToken.sol | 56 - .../interfaces/IInitializableDebtToken.sol | 52 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IPoolDataProvider.sol | 250 - .../interfaces/IPriceOracleGetter.sol | 30 - .../IReserveInterestRateStrategy.sol | 29 - .../interfaces/IScaledBalanceToken.sol | 72 - .../interfaces/IVariableDebtToken.sol | 46 - .../configuration/ReserveConfiguration.sol | 584 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/math/WadRayMath.sol | 126 - .../protocol/libraries/types/DataTypes.sol | 324 - downloads/LINEA/WALLET_BALANCE_PROVIDER.sol | 2576 ----- .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Address.sol | 220 - .../openzeppelin/contracts/IERC20.sol | 76 - .../helpers/WalletBalanceProvider.sol | 108 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../configuration/ReserveConfiguration.sol | 584 -- .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/types/DataTypes.sol | 324 - downloads/LINEA/WETH_GATEWAY.sol | 3076 ------ .../gnosis/contracts/GPv2SafeERC20.sol | 115 - .../openzeppelin/contracts/Context.sol | 23 - .../openzeppelin/contracts/IERC20.sol | 76 - .../openzeppelin/contracts/Ownable.sol | 69 - .../helpers/WrappedTokenGatewayV3.sol | 197 - .../contracts/helpers/interfaces/IWETH.sol | 12 - .../interfaces/IWrappedTokenGatewayV3.sol | 22 - .../src/contracts/interfaces/IAToken.sol | 138 - .../interfaces/IAaveIncentivesController.sol | 19 - .../interfaces/IInitializableAToken.sol | 56 - .../src/contracts/interfaces/IPool.sol | 834 -- .../interfaces/IPoolAddressesProvider.sol | 227 - .../interfaces/IScaledBalanceToken.sol | 72 - .../configuration/ReserveConfiguration.sol | 584 -- .../configuration/UserConfiguration.sol | 236 - .../protocol/libraries/helpers/Errors.sol | 103 - .../protocol/libraries/types/DataTypes.sol | 324 - 1292 files changed, 2 insertions(+), 380052 deletions(-) delete mode 100644 diff.ts delete mode 100644 diff_config.ts delete mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER.sol delete mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/AaveProtocolDataProvider.sol delete mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol delete mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/ACL_MANAGER.sol delete mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol delete mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol delete mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol delete mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol delete mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol delete mode 100644 downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL.sol delete mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/Address.sol delete mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/SafeERC20.sol delete mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/interfaces/IERC20.sol delete mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/interfaces/draft-IERC20Permit.sol delete mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/contracts/Collector.sol delete mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/interfaces/ICollector.sol delete mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/ReentrancyGuard.sol delete mode 100644 downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/VersionedInitializable.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/logic/ConfiguratorLogic.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol delete mode 100644 downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAToken.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/misc/interfaces/IEACAggregatorProxy.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsController.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsDistributor.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsController.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsDistributor.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/ITransferStrategyBase.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/libraries/RewardsDataTypes.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/ICreditDelegationToken.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/VariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/DebtTokenBase.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol delete mode 100644 downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol delete mode 100644 downloads/ARBITRUM/EMISSION_MANAGER.sol delete mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol delete mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol delete mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/EmissionManager.sol delete mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IEmissionManager.sol delete mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol delete mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol delete mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol delete mode 100644 downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC20.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseAdminUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/UpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/base/FlashLoanReceiverBase.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/interfaces/IFlashLoanReceiver.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/interfaces/IFlashLoanSimpleReceiver.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAaveOracle.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/ICreditDelegationToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IDelegationToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IERC20WithPermit.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IL2Pool.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolConfigurator.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolDataProvider.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IStableDebtToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/AaveOracle.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/L2Encoder.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockPool.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/helpers/Helpers.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ConfiguratorLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/IsolationModeLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/LiquidationLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/PoolLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/L2Pool.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/Pool.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/PoolStorage.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/AToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/DebtTokenBase.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/EIP712Base.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapAdapter.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapBuyAdapter.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapSellAdapter.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/interfaces/IParaSwapAugustus.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/interfaces/IParaSwapAugustusRegistry.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/dependencies/openzeppelin/ReentrancyGuard.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/libraries/DataTypesHelper.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/WETHGateway.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IERC20DetailedBytes.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IUiIncentiveDataProviderV3.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IUiPoolDataProviderV3.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IWETH.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IWETHGateway.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/RewardsController.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/RewardsDistributor.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IPullRewardsTransferStrategy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IStakedToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IStakedTokenTransferStrategy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/TransferStrategyBase.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/Collector.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/CollectorController.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/interfaces/ICollector.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/AaveOracle.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/L2Encoder.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockPool.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/L2Pool.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/Pool.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/AToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/WETHGateway.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/RewardsController.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/treasury/Collector.sol delete mode 100644 downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/treasury/CollectorController.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/L2PoolInstance.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/PoolInstance.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IERC20WithPermit.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IL2Pool.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BorrowLogic.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BridgeLogic.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/CalldataLogic.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/LiquidationLogic.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/PoolLogic.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/SupplyLogic.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/L2Pool.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/Pool.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/PoolStorage.sol delete mode 100644 downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/ARBITRUM/ORACLE.sol delete mode 100644 downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol delete mode 100644 downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IAaveOracle.sol delete mode 100644 downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/misc/AaveOracle.sol delete mode 100644 downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol delete mode 100644 downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/instances/PoolConfiguratorInstance.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolConfigurator.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/pool/PoolConfigurator.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol delete mode 100644 downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER.sol delete mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/WrappedTokenGatewayV3.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWETH.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER.sol delete mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/helpers/AaveProtocolDataProvider.sol delete mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolDataProvider.sol delete mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/ACL_MANAGER.sol delete mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/AccessControl.sol delete mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/ERC165.sol delete mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IERC165.sol delete mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Strings.sol delete mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/configuration/ACLManager.sol delete mode 100644 downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/LINEA/COLLECTOR_IMPL.sol delete mode 100644 downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/ReentrancyGuard.sol delete mode 100644 downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/SafeERC20.sol delete mode 100644 downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol delete mode 100644 downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/Collector.sol delete mode 100644 downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/ICollector.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol delete mode 100644 downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/instances/ATokenInstance.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/AToken.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol delete mode 100644 downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol delete mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol delete mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol delete mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol delete mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsController.sol delete mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsDistributor.sol delete mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsController.sol delete mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsDistributor.sol delete mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/ITransferStrategyBase.sol delete mode 100644 downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/libraries/RewardsDataTypes.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/instances/VariableDebtTokenInstance.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/ICreditDelegationToken.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/VariableDebtToken.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/DebtTokenBase.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol delete mode 100644 downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol delete mode 100644 downloads/LINEA/EMISSION_MANAGER.sol delete mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol delete mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol delete mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/EmissionManager.sol delete mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IEmissionManager.sol delete mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsController.sol delete mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsDistributor.sol delete mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/ITransferStrategyBase.sol delete mode 100644 downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/libraries/RewardsDataTypes.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/LINEA/L2_ENCODER.sol delete mode 100644 downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/helpers/L2Encoder.sol delete mode 100644 downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/L2PoolInstance.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/PoolInstance.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IERC20WithPermit.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IL2Pool.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BorrowLogic.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BridgeLogic.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/CalldataLogic.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/LiquidationLogic.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/PoolLogic.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/SupplyLogic.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/L2Pool.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/Pool.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/PoolStorage.sol delete mode 100644 downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/LINEA/ORACLE.sol delete mode 100644 downloads/LINEA/ORACLE/AaveOracle/src/contracts/dependencies/chainlink/AggregatorInterface.sol delete mode 100644 downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IAaveOracle.sol delete mode 100644 downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/LINEA/ORACLE/AaveOracle/src/contracts/misc/AaveOracle.sol delete mode 100644 downloads/LINEA/ORACLE/AaveOracle/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/protocol/configuration/PoolAddressesProvider.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/interfaces/IPoolAddressesProviderRegistry.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol delete mode 100644 downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/instances/PoolConfiguratorInstance.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolConfigurator.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolDataProvider.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/pool/PoolConfigurator.sol delete mode 100644 downloads/LINEA/POOL_LOGIC.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol delete mode 100644 downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol delete mode 100644 downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER.sol delete mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol delete mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/helpers/WalletBalanceProvider.sol delete mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/types/DataTypes.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/WrappedTokenGatewayV3.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWETH.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAToken.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAaveIncentivesController.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IInitializableAToken.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPool.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPoolAddressesProvider.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IScaledBalanceToken.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/helpers/Errors.sol delete mode 100644 downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/types/DataTypes.sol diff --git a/.gitignore b/.gitignore index 7d497b20..9a68b89b 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,8 @@ out/ # artifacts reports/ +diffs/ +downloads/ # editors .idea diff --git a/diff.ts b/diff.ts deleted file mode 100644 index 57a61334..00000000 --- a/diff.ts +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env node - -import {ethers} from 'ethers'; -import {CONTRACTS, PROXIES, CHAIN_ID, Networks} from './diff_config'; -import child_process from 'child_process'; -import dotenv from 'dotenv'; -import fs from 'fs'; -dotenv.config(); - -function runCmd(cmd: string) { - var resp = child_process.execSync(cmd); - var result = resp.toString(); - return result; -} - -const API_KEYS = { - [Networks.ARBITRUM]: process.env.ETHERSCAN_API_KEY_ARBITRUM, - [Networks.LINEA]: process.env.ETHERSCAN_API_KEY_LINEA, - [Networks.FACTORY_LOCAL]: undefined, -}; - -const RPC_URLS = { - [Networks.ARBITRUM]: process.env.RPC_ARBITRUM, - [Networks.LINEA]: process.env.RPC_LINEA, - [Networks.FACTORY_LOCAL]: undefined, -}; - -function download(network: Networks, contractName: string, address: string) { - if (!fs.existsSync(`downloads/${network}/${contractName}`)) { - console.log('downloading', contractName); - runCmd( - `cast etherscan-source --chain-id ${CHAIN_ID[network]} -d downloads/${network}/${contractName} ${address} --etherscan-api-key ${API_KEYS[network]}` - ); - } -} - -function getImpl(network: Networks, address: string) { - const x = runCmd( - `cast storage --rpc-url ${RPC_URLS[network]} ${address} 24440054405305269366569402256811496959409073762505157381672968839269610695612 --etherscan-api-key ${API_KEYS[network]}` - ).replace('\n', ''); - return ethers.getAddress(x.slice(-40)); -} - -function diffContracts(commonContracts: string[], network1: string, network2: string) { - try { - commonContracts.map((contractName) => { - PROXIES.includes(contractName) && (contractName = contractName + '_IMPL'); - const sourcePathNetwork1 = - network1 != 'FACTORY_LOCAL' - ? `./downloads/${network1}/${contractName}.sol` - : `./downloads/FACTORY_LOCAL/${contractName}.sol`; - const sourcePathNetwork2 = - network2 != 'FACTORY_LOCAL' - ? `./downloads/${network2}/${contractName}.sol` - : `./downloads/FACTORY_LOCAL/${contractName}.sol`; - const outPath = `${network1}_${network2}/${contractName}_DIFF`; - runCmd( - `make git-diff before=${sourcePathNetwork1} after=${sourcePathNetwork2} out=${outPath}` - ); - }); - } catch (e) { - console.log(e); - throw new Error('oops... failed to diff contracts'); - } -} - -function flatten(network: string, name: string, path: string) { - console.log('flattening contract', name); - const sourcePath = - network != 'FACTORY_LOCAL' ? `./downloads/${network}/${name}/${path}` : `./${path}`; - const outPath = - network != 'FACTORY_LOCAL' - ? `./downloads/${network}/${name}.sol` - : `./downloads/FACTORY_LOCAL/${name}.sol`; - runCmd(`forge flatten ${sourcePath} --output ${outPath}`); -} - -function downloadContracts(commonContracts: string[], network: Networks) { - commonContracts.map((key) => { - const isProxy = PROXIES.includes(key); - const contractName = isProxy ? `${key}_IMPL` : key; - const address = isProxy - ? getImpl(network, CONTRACTS[network][key].address as string) - : CONTRACTS[network][key].address; - download(network, contractName, address as string); - }); -} - -function flattenContracts(commonContracts: string[], network: Networks) { - commonContracts.map((key) => { - const isProxy = PROXIES.includes(key); - const contractName = isProxy ? `${key}_IMPL` : key; - flatten(network, contractName, CONTRACTS[network as keyof typeof CONTRACTS][key].path); - }); -} - -async function main() { - // get networks to diff against from the command line input - const network1 = process.argv[2] as Networks; - const network2 = process.argv[3] as Networks; - - console.log(`comparing diffs between ${network1}, ${network2}`); - - // find all the common contracts to compare between both the networks. - const commonContracts = Object.keys(CONTRACTS[network1 as keyof typeof CONTRACTS]).filter((key) => - CONTRACTS[network2 as keyof typeof CONTRACTS].hasOwnProperty(key) - ); - - if (network1 != 'FACTORY_LOCAL') { - downloadContracts(commonContracts, network1); - } - if (network2 != 'FACTORY_LOCAL') { - downloadContracts(commonContracts, network2); - } - - flattenContracts(commonContracts, network1); - flattenContracts(commonContracts, network2); - - diffContracts(commonContracts, network1, network2); -} - -main(); diff --git a/diff_config.ts b/diff_config.ts deleted file mode 100644 index b70f6430..00000000 --- a/diff_config.ts +++ /dev/null @@ -1,293 +0,0 @@ -import {AaveV3Linea, AaveV3Arbitrum} from '@bgd-labs/aave-address-book'; - -enum Networks { - ARBITRUM = 'ARBITRUM', - LINEA = 'LINEA', - FACTORY_LOCAL = 'FACTORY_LOCAL' -} - -const CONTRACTS: ContractsType = { - [Networks.ARBITRUM]: { - POOL_ADDRESSES_PROVIDER: { - name: 'PoolAddressesProvider', - path: 'PoolAddressesProvider/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol', - address: AaveV3Arbitrum.POOL_ADDRESSES_PROVIDER, - }, - L2_POOL: { - name: 'L2Pool', - path: 'L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/L2PoolInstance.sol', - address: AaveV3Arbitrum.POOL, - }, - POOL_CONFIGURATOR: { - name: 'PoolConfigurator', - path: 'PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/instances/PoolConfiguratorInstance.sol', - address: AaveV3Arbitrum.POOL_CONFIGURATOR, - }, - ORACLE: { - name: 'AaveOracle', - path: 'AaveOracle/@aave/core-v3/contracts/misc/AaveOracle.sol', - address: AaveV3Arbitrum.ORACLE, - }, - AAVE_PROTOCOL_DATA_PROVIDER: { - name: 'AaveProtocolDataProvider', - path: 'AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/AaveProtocolDataProvider.sol', - address: AaveV3Arbitrum.AAVE_PROTOCOL_DATA_PROVIDER, - }, - ACL_MANAGER: { - name: 'ACLManager', - path: 'ACLManager/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol', - address: AaveV3Arbitrum.ACL_MANAGER, - }, - COLLECTOR: { - name: 'Collector', - path: 'Collector/src/contracts/Collector.sol', - address: AaveV3Arbitrum.COLLECTOR, - }, - DEFAULT_INCENTIVES_CONTROLLER: { - name: 'RewardsController', - path: 'RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsController.sol', - address: AaveV3Arbitrum.DEFAULT_INCENTIVES_CONTROLLER, - }, - DEFAULT_A_TOKEN_IMPL: { - name: 'AToken', - path: 'AToken/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol', - address: AaveV3Arbitrum.DEFAULT_A_TOKEN_IMPL_REV_2, - }, - DEFAULT_VARIABLE_DEBT_TOKEN_IMPL: { - name: 'VariableDebtToken', - path: 'VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/VariableDebtToken.sol', - address: AaveV3Arbitrum.DEFAULT_VARIABLE_DEBT_TOKEN_IMPL_REV_2, - }, - EMISSION_MANAGER: { - name: 'EmissionManager', - path: 'EmissionManager/@aave/periphery-v3/contracts/rewards/EmissionManager.sol', - address: AaveV3Arbitrum.EMISSION_MANAGER, - }, - POOL_ADDRESSES_PROVIDER_REGISTRY: { - name: 'PoolAddressesProviderRegistry', - path: 'PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol', - address: AaveV3Arbitrum.POOL_ADDRESSES_PROVIDER_REGISTRY, - }, - WETH_GATEWAY: { - name: 'WrappedTokenGatewayV3', - path: 'WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/WrappedTokenGatewayV3.sol', - address: AaveV3Arbitrum.WETH_GATEWAY, - }, - WALLET_BALANCE_PROVIDER: { - name: 'WalletBalanceProvider', - path: 'WalletBalanceProvider/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol', - address: AaveV3Arbitrum.WALLET_BALANCE_PROVIDER, - }, - UI_POOL_DATA_PROVIDER: { - name: 'UiPoolDataProviderV3', - path: 'UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol', - address: AaveV3Arbitrum.UI_POOL_DATA_PROVIDER, - }, - UI_INCENTIVE_DATA_PROVIDER: { - name: 'UiIncentiveDataProviderV3', - path: 'UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol', - address: AaveV3Arbitrum.UI_INCENTIVE_DATA_PROVIDER, - }, - L2_ENCODER: { - name: 'L2Encoder', - path: 'L2Encoder/@aave/core-v3/contracts/misc/L2Encoder.sol', - address: AaveV3Arbitrum.L2_ENCODER, - }, - BORROW_LOGIC: { - name: 'BorrowLogic', - path: 'BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol', - address: '0x4c52FE2162200bf26c314d7bbd8611699139d553', - }, - BRIDGE_LOGIC: { - name: 'BridgeLogic', - path: 'BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol', - address: '0x97dCbFaE5372A63128F141E8C0BC2c871Ca5F604', - }, - CONFIGURATOR_LOGIC: { - name: 'ConfiguratorLogic', - path: 'ConfiguratorLogic/src/core/contracts/protocol/libraries/logic/ConfiguratorLogic.sol', - address: '0x6F4964Db83CeCCDc98164796221d5259b922313C', - }, - EMODE_LOGIC: { - name: 'EModeLogic', - path: 'EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol', - address: '0x88F864670De467aA73CD45325F9652C578C8AB85', - }, - FLASHLOAN_LOGIC: { - name: 'FlashLoanLogic', - path: 'FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol', - address: '0xb32381feFFF45eE9F47fD2f2cF83C832637d6EF0', - }, - LIQUIDATION_LOGIC: { - name: 'LiquidationLogic', - path: 'LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol', - address: '0x80d16970B31243Fe67DaB028115f3E4c3E3510Ad', - }, - POOL_LOGIC: { - name: 'PoolLogic', - path: 'PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol', - address: '0xA58FB47bE9074828215A173564C0CD10f6F249bf', - }, - SUPPLY_LOGIC: { - name: 'SupplyLogic', - path: 'SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol', - address: '0x2b22E425C1322fbA0DbF17bb1dA25d71811EE7ba', - }, - }, - [Networks.LINEA]: { - POOL_ADDRESSES_PROVIDER: { - name: 'PoolAddressesProvider', - path: 'PoolAddressesProvider/src/contracts/protocol/configuration/PoolAddressesProvider.sol', - address: AaveV3Linea.POOL_ADDRESSES_PROVIDER, - }, - L2_POOL: { - name: 'L2Pool', - path: 'L2PoolInstance/src/contracts/instances/L2PoolInstance.sol', - address: AaveV3Linea.POOL, - }, - POOL_CONFIGURATOR: { - name: 'PoolConfigurator', - path: 'PoolConfiguratorInstance/src/contracts/instances/PoolConfiguratorInstance.sol', - address: AaveV3Linea.POOL_CONFIGURATOR, - }, - ORACLE: { - name: 'AaveOracle', - path: 'AaveOracle/src/contracts/misc/AaveOracle.sol', - address: AaveV3Linea.ORACLE, - }, - AAVE_PROTOCOL_DATA_PROVIDER: { - name: 'AaveProtocolDataProvider', - path: 'AaveProtocolDataProvider/src/contracts/helpers/AaveProtocolDataProvider.sol', - address: AaveV3Linea.AAVE_PROTOCOL_DATA_PROVIDER, - }, - ACL_MANAGER: { - name: 'ACLManager', - path: 'ACLManager/src/contracts/protocol/configuration/ACLManager.sol', - address: AaveV3Linea.ACL_MANAGER, - }, - COLLECTOR: { - name: 'Collector', - path: 'Collector/src/contracts/treasury/Collector.sol', - address: '0x86E2938daE289763D4e09a7e42c5cCcA62Cf9809', - }, - DEFAULT_INCENTIVES_CONTROLLER: { - name: 'RewardsController', - path: 'RewardsController/src/contracts/rewards/RewardsController.sol', - address: AaveV3Linea.DEFAULT_INCENTIVES_CONTROLLER, - }, - DEFAULT_A_TOKEN_IMPL: { - name: 'AToken', - path: 'ATokenInstance/src/contracts/instances/ATokenInstance.sol', - address: '0x589750BA8aF186cE5B55391B0b7148cAD43a1619', - }, - DEFAULT_VARIABLE_DEBT_TOKEN_IMPL: { - name: 'VariableDebtToken', - path: 'VariableDebtTokenInstance/src/contracts/instances/VariableDebtTokenInstance.sol', - address: '0xBeC519531F0E78BcDdB295242fA4EC5251B38574', - }, - EMISSION_MANAGER: { - name: 'EmissionManager', - path: 'EmissionManager/src/contracts/rewards/EmissionManager.sol', - address: AaveV3Linea.EMISSION_MANAGER, - }, - POOL_ADDRESSES_PROVIDER_REGISTRY: { - name: 'PoolAddressesProviderRegistry', - path: 'PoolAddressesProviderRegistry/src/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol', - address: AaveV3Linea.POOL_ADDRESSES_PROVIDER_REGISTRY, - }, - WETH_GATEWAY: { - name: 'WrappedTokenGatewayV3', - path: 'WrappedTokenGatewayV3/src/contracts/helpers/WrappedTokenGatewayV3.sol', - address: AaveV3Linea.WETH_GATEWAY, - }, - WALLET_BALANCE_PROVIDER: { - name: 'WalletBalanceProvider', - path: 'WalletBalanceProvider/src/contracts/helpers/WalletBalanceProvider.sol', - address: AaveV3Linea.WALLET_BALANCE_PROVIDER, - }, - UI_POOL_DATA_PROVIDER: { - name: 'UiPoolDataProviderV3', - path: 'UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol', - address: AaveV3Linea.UI_POOL_DATA_PROVIDER, - }, - UI_INCENTIVE_DATA_PROVIDER: { - name: 'UiIncentiveDataProviderV3', - path: 'UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol', - address: AaveV3Linea.UI_INCENTIVE_DATA_PROVIDER, - }, - L2_ENCODER: { - name: 'L2Encoder', - path: 'L2Encoder/src/contracts/helpers/L2Encoder.sol', - address: '0x01d678F1bbE148C96e7501F1Ac41661904F84F61', - }, - BORROW_LOGIC: { - name: 'BorrowLogic', - path: 'BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol', - address: '0xbFEDA4cC9184727Ac7546Ce529D306bB5CffcB4F', - }, - BRIDGE_LOGIC: { - name: 'BridgeLogic', - path: 'BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol', - address: '0x3f399651Fc3FE274F7754Bb240BC80e096c0d1c5', - }, - CONFIGURATOR_LOGIC: { - name: 'ConfiguratorLogic', - path: 'ConfiguratorLogic/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol', - address: '0x1C39F5E734625F34eAf11a8B43c71DAB832936b5', - }, - EMODE_LOGIC: { - name: 'EModeLogic', - path: 'EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol', - address: '0x848eD9932047Fae0baf74d645450018F424A4367', - }, - FLASHLOAN_LOGIC: { - name: 'FlashLoanLogic', - path: 'FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol', - address: '0x6990DFae5c227F1aC5D486b1AC0eecAcC2B3e68d', - }, - LIQUIDATION_LOGIC: { - name: 'LiquidationLogic', - path: 'LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol', - address: '0xB84A9FBa16902e990EbCb63A22bB46996E9CfABe', - }, - POOL_LOGIC: { - name: 'PoolLogic', - path: 'PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol', - address: '0x7Cc1def95a7eCfb5afF91425D5e828802A8d914E', - }, - SUPPLY_LOGIC: { - name: 'SupplyLogic', - path: 'SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol', - address: '0x3c012c5d3Be847F46a1428A3Bc53d70dFe691194', - }, - }, - [Networks.FACTORY_LOCAL]: {} -}; - -interface ContractInfo { - name: string; - path: string; - address?: string; -} - -type ContractsType = { - [key in Networks]: { - [contractName: string]: ContractInfo; - }; -}; - -const PROXIES = [ - 'DEFAULT_INCENTIVES_CONTROLLER', - 'POOL', - 'POOL_CONFIGURATOR', - 'L2_POOL', - 'COLLECTOR', -]; - -const CHAIN_ID = { - [Networks.ARBITRUM]: 42161, - [Networks.LINEA]: 59144, - [Networks.FACTORY_LOCAL]: undefined -}; - -export {CONTRACTS, PROXIES, CHAIN_ID, Networks}; diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER.sol deleted file mode 100644 index 81421916..00000000 --- a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER.sol +++ /dev/null @@ -1,3226 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol - -/** - * @title IPoolDataProvider - * @author Aave - * @notice Defines the basic interface of a PoolDataProvider - */ -interface IPoolDataProvider { - struct TokenData { - string symbol; - address tokenAddress; - } - - /** - * @notice Returns the address for the PoolAddressesProvider contract. - * @return The address for the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the list of the existing reserves in the pool. - * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. - * @return The list of reserves, pairs of symbols and addresses - */ - function getAllReservesTokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the list of the existing ATokens in the pool. - * @return The list of ATokens, pairs of symbols and addresses - */ - function getAllATokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the configuration data of the reserve - * @dev Not returning borrow and supply caps for compatibility, nor pause flag - * @param asset The address of the underlying asset of the reserve - * @return decimals The number of decimals of the reserve - * @return ltv The ltv of the reserve - * @return liquidationThreshold The liquidationThreshold of the reserve - * @return liquidationBonus The liquidationBonus of the reserve - * @return reserveFactor The reserveFactor of the reserve - * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise - * @return borrowingEnabled True if borrowing is enabled, false otherwise - * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise - * @return isActive True if it is active, false otherwise - * @return isFrozen True if it is frozen, false otherwise - */ - function getReserveConfigurationData( - address asset - ) - external - view - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ); - - /** - * @notice Returns the caps parameters of the reserve - * @param asset The address of the underlying asset of the reserve - * @return borrowCap The borrow cap of the reserve - * @return supplyCap The supply cap of the reserve - */ - function getReserveCaps( - address asset - ) external view returns (uint256 borrowCap, uint256 supplyCap); - - /** - * @notice Returns if the pool is paused - * @param asset The address of the underlying asset of the reserve - * @return isPaused True if the pool is paused, false otherwise - */ - function getPaused(address asset) external view returns (bool isPaused); - - /** - * @notice Returns the siloed borrowing flag - * @param asset The address of the underlying asset of the reserve - * @return True if the asset is siloed for borrowing - */ - function getSiloedBorrowing(address asset) external view returns (bool); - - /** - * @notice Returns the protocol fee on the liquidation bonus - * @param asset The address of the underlying asset of the reserve - * @return The protocol fee on liquidation - */ - function getLiquidationProtocolFee(address asset) external view returns (uint256); - - /** - * @notice Returns the unbacked mint cap of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The unbacked mint cap of the reserve - */ - function getUnbackedMintCap(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The debt ceiling of the reserve - */ - function getDebtCeiling(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling decimals - * @return The debt ceiling decimals - */ - function getDebtCeilingDecimals() external pure returns (uint256); - - /** - * @notice Returns the reserve data - * @param asset The address of the underlying asset of the reserve - * @return unbacked The amount of unbacked tokens - * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted - * @return totalAToken The total supply of the aToken - * @return totalStableDebt The total stable debt of the reserve - * @return totalVariableDebt The total variable debt of the reserve - * @return liquidityRate The liquidity rate of the reserve - * @return variableBorrowRate The variable borrow rate of the reserve - * @return stableBorrowRate The stable borrow rate of the reserve - * @return averageStableBorrowRate The average stable borrow rate of the reserve - * @return liquidityIndex The liquidity index of the reserve - * @return variableBorrowIndex The variable borrow index of the reserve - * @return lastUpdateTimestamp The timestamp of the last update of the reserve - */ - function getReserveData( - address asset - ) - external - view - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ); - - /** - * @notice Returns the total supply of aTokens for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total supply of the aToken - */ - function getATokenTotalSupply(address asset) external view returns (uint256); - - /** - * @notice Returns the total debt for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total debt for asset - */ - function getTotalDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the user data in a reserve - * @param asset The address of the underlying asset of the reserve - * @param user The address of the user - * @return currentATokenBalance The current AToken balance of the user - * @return currentStableDebt The current stable debt of the user - * @return currentVariableDebt The current variable debt of the user - * @return principalStableDebt The principal stable debt of the user - * @return scaledVariableDebt The scaled variable debt of the user - * @return stableBorrowRate The stable borrow rate of the user - * @return liquidityRate The liquidity rate of the reserve - * @return stableRateLastUpdated The timestamp of the last update of the user stable rate - * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false - * otherwise - */ - function getUserReserveData( - address asset, - address user - ) - external - view - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ); - - /** - * @notice Returns the token addresses of the reserve - * @param asset The address of the underlying asset of the reserve - * @return aTokenAddress The AToken address of the reserve - * @return stableDebtTokenAddress DEPRECATED in v3.2.0 - * @return variableDebtTokenAddress The VariableDebtToken address of the reserve - */ - function getReserveTokensAddresses( - address asset - ) - external - view - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ); - - /** - * @notice Returns the address of the Interest Rate strategy - * @param asset The address of the underlying asset of the reserve - * @return irStrategyAddress The address of the Interest Rate strategy - */ - function getInterestRateStrategyAddress( - address asset - ) external view returns (address irStrategyAddress); - - /** - * @notice Returns whether the reserve has FlashLoans enabled or disabled - * @param asset The address of the underlying asset of the reserve - * @return True if FlashLoans are enabled, false otherwise - */ - function getFlashLoanEnabled(address asset) external view returns (bool); - - /** - * @notice Returns whether virtual accounting is enabled/not for a reserve - * @param asset The address of the underlying asset of the reserve - * @return True if active, false otherwise - */ - function getIsVirtualAccActive(address asset) external view returns (bool); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint256); -} - -// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/AaveProtocolDataProvider.sol - -/** - * @title AaveProtocolDataProvider - * @author Aave - * @notice Peripheral contract to collect and pre-process information from the Pool. - */ -contract AaveProtocolDataProvider is IPoolDataProvider { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - - address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; - address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /// @inheritdoc IPoolDataProvider - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @notice Constructor - * @param addressesProvider The address of the PoolAddressesProvider contract - */ - constructor(IPoolAddressesProvider addressesProvider) { - ADDRESSES_PROVIDER = addressesProvider; - } - - /// @inheritdoc IPoolDataProvider - function getAllReservesTokens() external view override returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory reservesTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - if (reserves[i] == MKR) { - reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); - continue; - } - if (reserves[i] == ETH) { - reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); - continue; - } - reservesTokens[i] = TokenData({ - symbol: IERC20Detailed(reserves[i]).symbol(), - tokenAddress: reserves[i] - }); - } - return reservesTokens; - } - - /// @inheritdoc IPoolDataProvider - function getAllATokens() external view override returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory aTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveDataLegacy memory reserveData = pool.getReserveData(reserves[i]); - aTokens[i] = TokenData({ - symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), - tokenAddress: reserveData.aTokenAddress - }); - } - return aTokens; - } - - /// @inheritdoc IPoolDataProvider - function getReserveConfigurationData( - address asset - ) - external - view - override - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ) - { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration - .getParams(); - - (isActive, isFrozen, borrowingEnabled, ) = configuration.getFlags(); - - // @notice all stable debt related parameters deprecated in v3.2.0 - stableBorrowRateEnabled = false; - - usageAsCollateralEnabled = liquidationThreshold != 0; - } - - /// @inheritdoc IPoolDataProvider - function getReserveCaps( - address asset - ) external view override returns (uint256 borrowCap, uint256 supplyCap) { - (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); - } - - /// @inheritdoc IPoolDataProvider - function getPaused(address asset) external view override returns (bool isPaused) { - (, , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); - } - - /// @inheritdoc IPoolDataProvider - function getSiloedBorrowing(address asset) external view override returns (bool) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); - } - - /// @inheritdoc IPoolDataProvider - function getLiquidationProtocolFee(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); - } - - /// @inheritdoc IPoolDataProvider - function getUnbackedMintCap(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); - } - - /// @inheritdoc IPoolDataProvider - function getDebtCeiling(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); - } - - /// @inheritdoc IPoolDataProvider - function getDebtCeilingDecimals() external pure override returns (uint256) { - return ReserveConfiguration.DEBT_CEILING_DECIMALS; - } - - /// @inheritdoc IPoolDataProvider - function getReserveData( - address asset - ) - external - view - override - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - // @notice all stable debt related parameters deprecated in v3.2.0 - return ( - reserve.unbacked, - reserve.accruedToTreasury, - IERC20Detailed(reserve.aTokenAddress).totalSupply(), - 0, - IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), - reserve.currentLiquidityRate, - reserve.currentVariableBorrowRate, - 0, - 0, - reserve.liquidityIndex, - reserve.variableBorrowIndex, - reserve.lastUpdateTimestamp - ); - } - - /// @inheritdoc IPoolDataProvider - function getATokenTotalSupply(address asset) external view override returns (uint256) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.aTokenAddress).totalSupply(); - } - - /// @inheritdoc IPoolDataProvider - function getTotalDebt(address asset) external view override returns (uint256) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); - } - - /// @inheritdoc IPoolDataProvider - function getUserReserveData( - address asset, - address user - ) - external - view - override - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) - .getUserConfiguration(user); - - currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); - currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); - - // @notice all stable debt related parameters deprecated in v3.2.0 - currentStableDebt = principalStableDebt = stableBorrowRate = stableRateLastUpdated = 0; - - scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); - liquidityRate = reserve.currentLiquidityRate; - usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); - } - - /// @inheritdoc IPoolDataProvider - function getReserveTokensAddresses( - address asset - ) - external - view - override - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - // @notice all stable debt related parameters deprecated in v3.2.0 - return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); - } - - /// @inheritdoc IPoolDataProvider - function getInterestRateStrategyAddress( - address asset - ) external view override returns (address irStrategyAddress) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - return (reserve.interestRateStrategyAddress); - } - - /// @inheritdoc IPoolDataProvider - function getFlashLoanEnabled(address asset) external view override returns (bool) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - return configuration.getFlashLoanEnabled(); - } - - /// @inheritdoc IPoolDataProvider - function getIsVirtualAccActive(address asset) external view override returns (bool) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - return configuration.getIsVirtualAccActive(); - } - - /// @inheritdoc IPoolDataProvider - function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); - } -} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/AaveProtocolDataProvider.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/AaveProtocolDataProvider.sol deleted file mode 100644 index 671b658b..00000000 --- a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/AaveProtocolDataProvider.sol +++ /dev/null @@ -1,295 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; -import {WadRayMath} from '../protocol/libraries/math/WadRayMath.sol'; -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {IVariableDebtToken} from '../interfaces/IVariableDebtToken.sol'; -import {IPool} from '../interfaces/IPool.sol'; -import {IPoolDataProvider} from '../interfaces/IPoolDataProvider.sol'; - -/** - * @title AaveProtocolDataProvider - * @author Aave - * @notice Peripheral contract to collect and pre-process information from the Pool. - */ -contract AaveProtocolDataProvider is IPoolDataProvider { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - - address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; - address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /// @inheritdoc IPoolDataProvider - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @notice Constructor - * @param addressesProvider The address of the PoolAddressesProvider contract - */ - constructor(IPoolAddressesProvider addressesProvider) { - ADDRESSES_PROVIDER = addressesProvider; - } - - /// @inheritdoc IPoolDataProvider - function getAllReservesTokens() external view override returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory reservesTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - if (reserves[i] == MKR) { - reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); - continue; - } - if (reserves[i] == ETH) { - reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); - continue; - } - reservesTokens[i] = TokenData({ - symbol: IERC20Detailed(reserves[i]).symbol(), - tokenAddress: reserves[i] - }); - } - return reservesTokens; - } - - /// @inheritdoc IPoolDataProvider - function getAllATokens() external view override returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory aTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveDataLegacy memory reserveData = pool.getReserveData(reserves[i]); - aTokens[i] = TokenData({ - symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), - tokenAddress: reserveData.aTokenAddress - }); - } - return aTokens; - } - - /// @inheritdoc IPoolDataProvider - function getReserveConfigurationData( - address asset - ) - external - view - override - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ) - { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration - .getParams(); - - (isActive, isFrozen, borrowingEnabled, ) = configuration.getFlags(); - - // @notice all stable debt related parameters deprecated in v3.2.0 - stableBorrowRateEnabled = false; - - usageAsCollateralEnabled = liquidationThreshold != 0; - } - - /// @inheritdoc IPoolDataProvider - function getReserveCaps( - address asset - ) external view override returns (uint256 borrowCap, uint256 supplyCap) { - (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); - } - - /// @inheritdoc IPoolDataProvider - function getPaused(address asset) external view override returns (bool isPaused) { - (, , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); - } - - /// @inheritdoc IPoolDataProvider - function getSiloedBorrowing(address asset) external view override returns (bool) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); - } - - /// @inheritdoc IPoolDataProvider - function getLiquidationProtocolFee(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); - } - - /// @inheritdoc IPoolDataProvider - function getUnbackedMintCap(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); - } - - /// @inheritdoc IPoolDataProvider - function getDebtCeiling(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); - } - - /// @inheritdoc IPoolDataProvider - function getDebtCeilingDecimals() external pure override returns (uint256) { - return ReserveConfiguration.DEBT_CEILING_DECIMALS; - } - - /// @inheritdoc IPoolDataProvider - function getReserveData( - address asset - ) - external - view - override - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - // @notice all stable debt related parameters deprecated in v3.2.0 - return ( - reserve.unbacked, - reserve.accruedToTreasury, - IERC20Detailed(reserve.aTokenAddress).totalSupply(), - 0, - IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), - reserve.currentLiquidityRate, - reserve.currentVariableBorrowRate, - 0, - 0, - reserve.liquidityIndex, - reserve.variableBorrowIndex, - reserve.lastUpdateTimestamp - ); - } - - /// @inheritdoc IPoolDataProvider - function getATokenTotalSupply(address asset) external view override returns (uint256) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.aTokenAddress).totalSupply(); - } - - /// @inheritdoc IPoolDataProvider - function getTotalDebt(address asset) external view override returns (uint256) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); - } - - /// @inheritdoc IPoolDataProvider - function getUserReserveData( - address asset, - address user - ) - external - view - override - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) - .getUserConfiguration(user); - - currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); - currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); - - // @notice all stable debt related parameters deprecated in v3.2.0 - currentStableDebt = principalStableDebt = stableBorrowRate = stableRateLastUpdated = 0; - - scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); - liquidityRate = reserve.currentLiquidityRate; - usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); - } - - /// @inheritdoc IPoolDataProvider - function getReserveTokensAddresses( - address asset - ) - external - view - override - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - // @notice all stable debt related parameters deprecated in v3.2.0 - return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); - } - - /// @inheritdoc IPoolDataProvider - function getInterestRateStrategyAddress( - address asset - ) external view override returns (address irStrategyAddress) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - return (reserve.interestRateStrategyAddress); - } - - /// @inheritdoc IPoolDataProvider - function getFlashLoanEnabled(address asset) external view override returns (bool) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - return configuration.getFlashLoanEnabled(); - } - - /// @inheritdoc IPoolDataProvider - function getIsVirtualAccActive(address asset) external view override returns (bool) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - return configuration.getIsVirtualAccActive(); - } - - /// @inheritdoc IPoolDataProvider - function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); - } -} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 01e1bcaf..00000000 --- a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,833 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol deleted file mode 100644 index a9df8903..00000000 --- a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol +++ /dev/null @@ -1,250 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPoolDataProvider - * @author Aave - * @notice Defines the basic interface of a PoolDataProvider - */ -interface IPoolDataProvider { - struct TokenData { - string symbol; - address tokenAddress; - } - - /** - * @notice Returns the address for the PoolAddressesProvider contract. - * @return The address for the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the list of the existing reserves in the pool. - * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. - * @return The list of reserves, pairs of symbols and addresses - */ - function getAllReservesTokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the list of the existing ATokens in the pool. - * @return The list of ATokens, pairs of symbols and addresses - */ - function getAllATokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the configuration data of the reserve - * @dev Not returning borrow and supply caps for compatibility, nor pause flag - * @param asset The address of the underlying asset of the reserve - * @return decimals The number of decimals of the reserve - * @return ltv The ltv of the reserve - * @return liquidationThreshold The liquidationThreshold of the reserve - * @return liquidationBonus The liquidationBonus of the reserve - * @return reserveFactor The reserveFactor of the reserve - * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise - * @return borrowingEnabled True if borrowing is enabled, false otherwise - * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise - * @return isActive True if it is active, false otherwise - * @return isFrozen True if it is frozen, false otherwise - */ - function getReserveConfigurationData( - address asset - ) - external - view - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ); - - /** - * @notice Returns the caps parameters of the reserve - * @param asset The address of the underlying asset of the reserve - * @return borrowCap The borrow cap of the reserve - * @return supplyCap The supply cap of the reserve - */ - function getReserveCaps( - address asset - ) external view returns (uint256 borrowCap, uint256 supplyCap); - - /** - * @notice Returns if the pool is paused - * @param asset The address of the underlying asset of the reserve - * @return isPaused True if the pool is paused, false otherwise - */ - function getPaused(address asset) external view returns (bool isPaused); - - /** - * @notice Returns the siloed borrowing flag - * @param asset The address of the underlying asset of the reserve - * @return True if the asset is siloed for borrowing - */ - function getSiloedBorrowing(address asset) external view returns (bool); - - /** - * @notice Returns the protocol fee on the liquidation bonus - * @param asset The address of the underlying asset of the reserve - * @return The protocol fee on liquidation - */ - function getLiquidationProtocolFee(address asset) external view returns (uint256); - - /** - * @notice Returns the unbacked mint cap of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The unbacked mint cap of the reserve - */ - function getUnbackedMintCap(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The debt ceiling of the reserve - */ - function getDebtCeiling(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling decimals - * @return The debt ceiling decimals - */ - function getDebtCeilingDecimals() external pure returns (uint256); - - /** - * @notice Returns the reserve data - * @param asset The address of the underlying asset of the reserve - * @return unbacked The amount of unbacked tokens - * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted - * @return totalAToken The total supply of the aToken - * @return totalStableDebt The total stable debt of the reserve - * @return totalVariableDebt The total variable debt of the reserve - * @return liquidityRate The liquidity rate of the reserve - * @return variableBorrowRate The variable borrow rate of the reserve - * @return stableBorrowRate The stable borrow rate of the reserve - * @return averageStableBorrowRate The average stable borrow rate of the reserve - * @return liquidityIndex The liquidity index of the reserve - * @return variableBorrowIndex The variable borrow index of the reserve - * @return lastUpdateTimestamp The timestamp of the last update of the reserve - */ - function getReserveData( - address asset - ) - external - view - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ); - - /** - * @notice Returns the total supply of aTokens for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total supply of the aToken - */ - function getATokenTotalSupply(address asset) external view returns (uint256); - - /** - * @notice Returns the total debt for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total debt for asset - */ - function getTotalDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the user data in a reserve - * @param asset The address of the underlying asset of the reserve - * @param user The address of the user - * @return currentATokenBalance The current AToken balance of the user - * @return currentStableDebt The current stable debt of the user - * @return currentVariableDebt The current variable debt of the user - * @return principalStableDebt The principal stable debt of the user - * @return scaledVariableDebt The scaled variable debt of the user - * @return stableBorrowRate The stable borrow rate of the user - * @return liquidityRate The liquidity rate of the reserve - * @return stableRateLastUpdated The timestamp of the last update of the user stable rate - * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false - * otherwise - */ - function getUserReserveData( - address asset, - address user - ) - external - view - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ); - - /** - * @notice Returns the token addresses of the reserve - * @param asset The address of the underlying asset of the reserve - * @return aTokenAddress The AToken address of the reserve - * @return stableDebtTokenAddress DEPRECATED in v3.2.0 - * @return variableDebtTokenAddress The VariableDebtToken address of the reserve - */ - function getReserveTokensAddresses( - address asset - ) - external - view - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ); - - /** - * @notice Returns the address of the Interest Rate strategy - * @param asset The address of the underlying asset of the reserve - * @return irStrategyAddress The address of the Interest Rate strategy - */ - function getInterestRateStrategyAddress( - address asset - ) external view returns (address irStrategyAddress); - - /** - * @notice Returns whether the reserve has FlashLoans enabled or disabled - * @param asset The address of the underlying asset of the reserve - * @return True if FlashLoans are enabled, false otherwise - */ - function getFlashLoanEnabled(address asset) external view returns (bool); - - /** - * @notice Returns whether virtual accounting is enabled/not for a reserve - * @param asset The address of the underlying asset of the reserve - * @return True if active, false otherwise - */ - function getIsVirtualAccActive(address asset) external view returns (bool); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 43987f47..00000000 --- a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,583 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/ARBITRUM/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/ACL_MANAGER.sol b/downloads/ARBITRUM/ACL_MANAGER.sol deleted file mode 100644 index 9ff4476a..00000000 --- a/downloads/ARBITRUM/ACL_MANAGER.sol +++ /dev/null @@ -1,1066 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity =0.8.10; - -// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol - -/** - * @dev Interface of the ERC165 standard, as defined in the - * https://eips.ethereum.org/EIPS/eip-165[EIP]. - * - * Implementers can declare support of contract interfaces, which can then be - * queried by others ({ERC165Checker}). - * - * For an implementation, see {ERC165}. - */ -interface IERC165 { - /** - * @dev Returns true if this contract implements the interface defined by - * `interfaceId`. See the corresponding - * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] - * to learn more about how these ids are created. - * - * This function call must use less than 30 000 gas. - */ - function supportsInterface(bytes4 interfaceId) external view returns (bool); -} - -// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol - -/** - * @dev String operations. - */ -library Strings { - bytes16 private constant _HEX_SYMBOLS = '0123456789abcdef'; - - /** - * @dev Converts a `uint256` to its ASCII `string` decimal representation. - */ - function toString(uint256 value) internal pure returns (string memory) { - // Inspired by OraclizeAPI's implementation - MIT licence - // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol - - if (value == 0) { - return '0'; - } - uint256 temp = value; - uint256 digits; - while (temp != 0) { - digits++; - temp /= 10; - } - bytes memory buffer = new bytes(digits); - while (value != 0) { - digits -= 1; - buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); - value /= 10; - } - return string(buffer); - } - - /** - * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. - */ - function toHexString(uint256 value) internal pure returns (string memory) { - if (value == 0) { - return '0x00'; - } - uint256 temp = value; - uint256 length = 0; - while (temp != 0) { - length++; - temp >>= 8; - } - return toHexString(value, length); - } - - /** - * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. - */ - function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { - bytes memory buffer = new bytes(2 * length + 2); - buffer[0] = '0'; - buffer[1] = 'x'; - for (uint256 i = 2 * length + 1; i > 1; --i) { - buffer[i] = _HEX_SYMBOLS[value & 0xf]; - value >>= 4; - } - require(value == 0, 'Strings: hex length insufficient'); - return string(buffer); - } -} - -// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - **/ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - **/ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - **/ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - **/ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - **/ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - **/ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - **/ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - **/ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - **/ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' - string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 -} - -// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol - -/** - * @dev Implementation of the {IERC165} interface. - * - * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check - * for the additional interface id that will be supported. For example: - * - * ```solidity - * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); - * } - * ``` - * - * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. - */ -abstract contract ERC165 is IERC165 { - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IERC165).interfaceId; - } -} - -// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - **/ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an admin as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol - -/** - * @dev Contract module that allows children to implement role-based access - * control mechanisms. This is a lightweight version that doesn't allow enumerating role - * members except through off-chain means by accessing the contract event logs. Some - * applications may benefit from on-chain enumerability, for those cases see - * {AccessControlEnumerable}. - * - * Roles are referred to by their `bytes32` identifier. These should be exposed - * in the external API and be unique. The best way to achieve this is by - * using `public constant` hash digests: - * - * ``` - * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); - * ``` - * - * Roles can be used to represent a set of permissions. To restrict access to a - * function call, use {hasRole}: - * - * ``` - * function foo() public { - * require(hasRole(MY_ROLE, msg.sender)); - * ... - * } - * ``` - * - * Roles can be granted and revoked dynamically via the {grantRole} and - * {revokeRole} functions. Each role has an associated admin role, and only - * accounts that have a role's admin role can call {grantRole} and {revokeRole}. - * - * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means - * that only accounts with this role will be able to grant or revoke other - * roles. More complex role relationships can be created by using - * {_setRoleAdmin}. - * - * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to - * grant and revoke this role. Extra precautions should be taken to secure - * accounts that have been granted it. - */ -abstract contract AccessControl is Context, IAccessControl, ERC165 { - struct RoleData { - mapping(address => bool) members; - bytes32 adminRole; - } - - mapping(bytes32 => RoleData) private _roles; - - bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; - - /** - * @dev Modifier that checks that an account has a specific role. Reverts - * with a standardized message including the required role. - * - * The format of the revert reason is given by the following regular expression: - * - * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ - * - * _Available since v4.1._ - */ - modifier onlyRole(bytes32 role) { - _checkRole(role, _msgSender()); - _; - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) public view override returns (bool) { - return _roles[role].members[account]; - } - - /** - * @dev Revert with a standard message if `account` is missing `role`. - * - * The format of the revert reason is given by the following regular expression: - * - * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ - */ - function _checkRole(bytes32 role, address account) internal view { - if (!hasRole(role, account)) { - revert( - string( - abi.encodePacked( - 'AccessControl: account ', - Strings.toHexString(uint160(account), 20), - ' is missing role ', - Strings.toHexString(uint256(role), 32) - ) - ) - ); - } - } - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) public view override returns (bytes32) { - return _roles[role].adminRole; - } - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole( - bytes32 role, - address account - ) public virtual override onlyRole(getRoleAdmin(role)) { - _grantRole(role, account); - } - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole( - bytes32 role, - address account - ) public virtual override onlyRole(getRoleAdmin(role)) { - _revokeRole(role, account); - } - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) public virtual override { - require(account == _msgSender(), 'AccessControl: can only renounce roles for self'); - - _revokeRole(role, account); - } - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. Note that unlike {grantRole}, this function doesn't perform any - * checks on the calling account. - * - * [WARNING] - * ==== - * This function should only be called from the constructor when setting - * up the initial roles for the system. - * - * Using this function in any other way is effectively circumventing the admin - * system imposed by {AccessControl}. - * ==== - */ - function _setupRole(bytes32 role, address account) internal virtual { - _grantRole(role, account); - } - - /** - * @dev Sets `adminRole` as ``role``'s admin role. - * - * Emits a {RoleAdminChanged} event. - */ - function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { - bytes32 previousAdminRole = getRoleAdmin(role); - _roles[role].adminRole = adminRole; - emit RoleAdminChanged(role, previousAdminRole, adminRole); - } - - function _grantRole(bytes32 role, address account) private { - if (!hasRole(role, account)) { - _roles[role].members[account] = true; - emit RoleGranted(role, account, _msgSender()); - } - } - - function _revokeRole(bytes32 role, address account) private { - if (hasRole(role, account)) { - _roles[role].members[account] = false; - emit RoleRevoked(role, account, _msgSender()); - } - } -} - -// downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol - -/** - * @title ACLManager - * @author Aave - * @notice Access Control List Manager. Main registry of system roles and permissions. - */ -contract ACLManager is AccessControl, IACLManager { - bytes32 public constant override POOL_ADMIN_ROLE = keccak256('POOL_ADMIN'); - bytes32 public constant override EMERGENCY_ADMIN_ROLE = keccak256('EMERGENCY_ADMIN'); - bytes32 public constant override RISK_ADMIN_ROLE = keccak256('RISK_ADMIN'); - bytes32 public constant override FLASH_BORROWER_ROLE = keccak256('FLASH_BORROWER'); - bytes32 public constant override BRIDGE_ROLE = keccak256('BRIDGE'); - bytes32 public constant override ASSET_LISTING_ADMIN_ROLE = keccak256('ASSET_LISTING_ADMIN'); - - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @dev Constructor - * @dev The ACL admin should be initialized at the addressesProvider beforehand - * @param provider The address of the PoolAddressesProvider - */ - constructor(IPoolAddressesProvider provider) { - ADDRESSES_PROVIDER = provider; - address aclAdmin = provider.getACLAdmin(); - require(aclAdmin != address(0), Errors.ACL_ADMIN_CANNOT_BE_ZERO); - _setupRole(DEFAULT_ADMIN_ROLE, aclAdmin); - } - - /// @inheritdoc IACLManager - function setRoleAdmin( - bytes32 role, - bytes32 adminRole - ) external override onlyRole(DEFAULT_ADMIN_ROLE) { - _setRoleAdmin(role, adminRole); - } - - /// @inheritdoc IACLManager - function addPoolAdmin(address admin) external override { - grantRole(POOL_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removePoolAdmin(address admin) external override { - revokeRole(POOL_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isPoolAdmin(address admin) external view override returns (bool) { - return hasRole(POOL_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function addEmergencyAdmin(address admin) external override { - grantRole(EMERGENCY_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removeEmergencyAdmin(address admin) external override { - revokeRole(EMERGENCY_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isEmergencyAdmin(address admin) external view override returns (bool) { - return hasRole(EMERGENCY_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function addRiskAdmin(address admin) external override { - grantRole(RISK_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removeRiskAdmin(address admin) external override { - revokeRole(RISK_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isRiskAdmin(address admin) external view override returns (bool) { - return hasRole(RISK_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function addFlashBorrower(address borrower) external override { - grantRole(FLASH_BORROWER_ROLE, borrower); - } - - /// @inheritdoc IACLManager - function removeFlashBorrower(address borrower) external override { - revokeRole(FLASH_BORROWER_ROLE, borrower); - } - - /// @inheritdoc IACLManager - function isFlashBorrower(address borrower) external view override returns (bool) { - return hasRole(FLASH_BORROWER_ROLE, borrower); - } - - /// @inheritdoc IACLManager - function addBridge(address bridge) external override { - grantRole(BRIDGE_ROLE, bridge); - } - - /// @inheritdoc IACLManager - function removeBridge(address bridge) external override { - revokeRole(BRIDGE_ROLE, bridge); - } - - /// @inheritdoc IACLManager - function isBridge(address bridge) external view override returns (bool) { - return hasRole(BRIDGE_ROLE, bridge); - } - - /// @inheritdoc IACLManager - function addAssetListingAdmin(address admin) external override { - grantRole(ASSET_LISTING_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removeAssetListingAdmin(address admin) external override { - revokeRole(ASSET_LISTING_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isAssetListingAdmin(address admin) external view override returns (bool) { - return hasRole(ASSET_LISTING_ADMIN_ROLE, admin); - } -} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol deleted file mode 100644 index d7834c71..00000000 --- a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.10; - -import './IAccessControl.sol'; -import './Context.sol'; -import './Strings.sol'; -import './ERC165.sol'; - -/** - * @dev Contract module that allows children to implement role-based access - * control mechanisms. This is a lightweight version that doesn't allow enumerating role - * members except through off-chain means by accessing the contract event logs. Some - * applications may benefit from on-chain enumerability, for those cases see - * {AccessControlEnumerable}. - * - * Roles are referred to by their `bytes32` identifier. These should be exposed - * in the external API and be unique. The best way to achieve this is by - * using `public constant` hash digests: - * - * ``` - * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); - * ``` - * - * Roles can be used to represent a set of permissions. To restrict access to a - * function call, use {hasRole}: - * - * ``` - * function foo() public { - * require(hasRole(MY_ROLE, msg.sender)); - * ... - * } - * ``` - * - * Roles can be granted and revoked dynamically via the {grantRole} and - * {revokeRole} functions. Each role has an associated admin role, and only - * accounts that have a role's admin role can call {grantRole} and {revokeRole}. - * - * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means - * that only accounts with this role will be able to grant or revoke other - * roles. More complex role relationships can be created by using - * {_setRoleAdmin}. - * - * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to - * grant and revoke this role. Extra precautions should be taken to secure - * accounts that have been granted it. - */ -abstract contract AccessControl is Context, IAccessControl, ERC165 { - struct RoleData { - mapping(address => bool) members; - bytes32 adminRole; - } - - mapping(bytes32 => RoleData) private _roles; - - bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; - - /** - * @dev Modifier that checks that an account has a specific role. Reverts - * with a standardized message including the required role. - * - * The format of the revert reason is given by the following regular expression: - * - * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ - * - * _Available since v4.1._ - */ - modifier onlyRole(bytes32 role) { - _checkRole(role, _msgSender()); - _; - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) public view override returns (bool) { - return _roles[role].members[account]; - } - - /** - * @dev Revert with a standard message if `account` is missing `role`. - * - * The format of the revert reason is given by the following regular expression: - * - * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ - */ - function _checkRole(bytes32 role, address account) internal view { - if (!hasRole(role, account)) { - revert( - string( - abi.encodePacked( - 'AccessControl: account ', - Strings.toHexString(uint160(account), 20), - ' is missing role ', - Strings.toHexString(uint256(role), 32) - ) - ) - ); - } - } - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) public view override returns (bytes32) { - return _roles[role].adminRole; - } - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) - public - virtual - override - onlyRole(getRoleAdmin(role)) - { - _grantRole(role, account); - } - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) - public - virtual - override - onlyRole(getRoleAdmin(role)) - { - _revokeRole(role, account); - } - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) public virtual override { - require(account == _msgSender(), 'AccessControl: can only renounce roles for self'); - - _revokeRole(role, account); - } - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. Note that unlike {grantRole}, this function doesn't perform any - * checks on the calling account. - * - * [WARNING] - * ==== - * This function should only be called from the constructor when setting - * up the initial roles for the system. - * - * Using this function in any other way is effectively circumventing the admin - * system imposed by {AccessControl}. - * ==== - */ - function _setupRole(bytes32 role, address account) internal virtual { - _grantRole(role, account); - } - - /** - * @dev Sets `adminRole` as ``role``'s admin role. - * - * Emits a {RoleAdminChanged} event. - */ - function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { - bytes32 previousAdminRole = getRoleAdmin(role); - _roles[role].adminRole = adminRole; - emit RoleAdminChanged(role, previousAdminRole, adminRole); - } - - function _grantRole(bytes32 role, address account) private { - if (!hasRole(role, account)) { - _roles[role].members[account] = true; - emit RoleGranted(role, account, _msgSender()); - } - } - - function _revokeRole(bytes32 role, address account) private { - if (hasRole(role, account)) { - _roles[role].members[account] = false; - emit RoleRevoked(role, account, _msgSender()); - } - } -} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 445ee640..00000000 --- a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol deleted file mode 100644 index 15336e7e..00000000 --- a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.10; - -import './IERC165.sol'; - -/** - * @dev Implementation of the {IERC165} interface. - * - * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check - * for the additional interface id that will be supported. For example: - * - * ```solidity - * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); - * } - * ``` - * - * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. - */ -abstract contract ERC165 is IERC165 { - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IERC165).interfaceId; - } -} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index c6f35263..00000000 --- a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol deleted file mode 100644 index ce3c290e..00000000 --- a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.10; - -/** - * @dev Interface of the ERC165 standard, as defined in the - * https://eips.ethereum.org/EIPS/eip-165[EIP]. - * - * Implementers can declare support of contract interfaces, which can then be - * queried by others ({ERC165Checker}). - * - * For an implementation, see {ERC165}. - */ -interface IERC165 { - /** - * @dev Returns true if this contract implements the interface defined by - * `interfaceId`. See the corresponding - * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] - * to learn more about how these ids are created. - * - * This function call must use less than 30 000 gas. - */ - function supportsInterface(bytes4 interfaceId) external view returns (bool); -} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol deleted file mode 100644 index bcb1ee6a..00000000 --- a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.10; - -/** - * @dev String operations. - */ -library Strings { - bytes16 private constant _HEX_SYMBOLS = '0123456789abcdef'; - - /** - * @dev Converts a `uint256` to its ASCII `string` decimal representation. - */ - function toString(uint256 value) internal pure returns (string memory) { - // Inspired by OraclizeAPI's implementation - MIT licence - // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol - - if (value == 0) { - return '0'; - } - uint256 temp = value; - uint256 digits; - while (temp != 0) { - digits++; - temp /= 10; - } - bytes memory buffer = new bytes(digits); - while (value != 0) { - digits -= 1; - buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); - value /= 10; - } - return string(buffer); - } - - /** - * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. - */ - function toHexString(uint256 value) internal pure returns (string memory) { - if (value == 0) { - return '0x00'; - } - uint256 temp = value; - uint256 length = 0; - while (temp != 0) { - length++; - temp >>= 8; - } - return toHexString(value, length); - } - - /** - * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. - */ - function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { - bytes memory buffer = new bytes(2 * length + 2); - buffer[0] = '0'; - buffer[1] = 'x'; - for (uint256 i = 2 * length + 1; i > 1; --i) { - buffer[i] = _HEX_SYMBOLS[value & 0xf]; - value >>= 4; - } - require(value == 0, 'Strings: hex length insufficient'); - return string(buffer); - } -} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 4bb6e645..00000000 --- a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - **/ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an admin as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index 01a126bd..00000000 --- a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - **/ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - **/ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - **/ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - **/ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - **/ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - **/ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - **/ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - **/ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - **/ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol deleted file mode 100644 index 7b03541d..00000000 --- a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol +++ /dev/null @@ -1,134 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {AccessControl} from '../../dependencies/openzeppelin/contracts/AccessControl.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {IACLManager} from '../../interfaces/IACLManager.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; - -/** - * @title ACLManager - * @author Aave - * @notice Access Control List Manager. Main registry of system roles and permissions. - */ -contract ACLManager is AccessControl, IACLManager { - bytes32 public constant override POOL_ADMIN_ROLE = keccak256('POOL_ADMIN'); - bytes32 public constant override EMERGENCY_ADMIN_ROLE = keccak256('EMERGENCY_ADMIN'); - bytes32 public constant override RISK_ADMIN_ROLE = keccak256('RISK_ADMIN'); - bytes32 public constant override FLASH_BORROWER_ROLE = keccak256('FLASH_BORROWER'); - bytes32 public constant override BRIDGE_ROLE = keccak256('BRIDGE'); - bytes32 public constant override ASSET_LISTING_ADMIN_ROLE = keccak256('ASSET_LISTING_ADMIN'); - - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @dev Constructor - * @dev The ACL admin should be initialized at the addressesProvider beforehand - * @param provider The address of the PoolAddressesProvider - */ - constructor(IPoolAddressesProvider provider) { - ADDRESSES_PROVIDER = provider; - address aclAdmin = provider.getACLAdmin(); - require(aclAdmin != address(0), Errors.ACL_ADMIN_CANNOT_BE_ZERO); - _setupRole(DEFAULT_ADMIN_ROLE, aclAdmin); - } - - /// @inheritdoc IACLManager - function setRoleAdmin(bytes32 role, bytes32 adminRole) - external - override - onlyRole(DEFAULT_ADMIN_ROLE) - { - _setRoleAdmin(role, adminRole); - } - - /// @inheritdoc IACLManager - function addPoolAdmin(address admin) external override { - grantRole(POOL_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removePoolAdmin(address admin) external override { - revokeRole(POOL_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isPoolAdmin(address admin) external view override returns (bool) { - return hasRole(POOL_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function addEmergencyAdmin(address admin) external override { - grantRole(EMERGENCY_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removeEmergencyAdmin(address admin) external override { - revokeRole(EMERGENCY_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isEmergencyAdmin(address admin) external view override returns (bool) { - return hasRole(EMERGENCY_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function addRiskAdmin(address admin) external override { - grantRole(RISK_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removeRiskAdmin(address admin) external override { - revokeRole(RISK_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isRiskAdmin(address admin) external view override returns (bool) { - return hasRole(RISK_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function addFlashBorrower(address borrower) external override { - grantRole(FLASH_BORROWER_ROLE, borrower); - } - - /// @inheritdoc IACLManager - function removeFlashBorrower(address borrower) external override { - revokeRole(FLASH_BORROWER_ROLE, borrower); - } - - /// @inheritdoc IACLManager - function isFlashBorrower(address borrower) external view override returns (bool) { - return hasRole(FLASH_BORROWER_ROLE, borrower); - } - - /// @inheritdoc IACLManager - function addBridge(address bridge) external override { - grantRole(BRIDGE_ROLE, bridge); - } - - /// @inheritdoc IACLManager - function removeBridge(address bridge) external override { - revokeRole(BRIDGE_ROLE, bridge); - } - - /// @inheritdoc IACLManager - function isBridge(address bridge) external view override returns (bool) { - return hasRole(BRIDGE_ROLE, bridge); - } - - /// @inheritdoc IACLManager - function addAssetListingAdmin(address admin) external override { - grantRole(ASSET_LISTING_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removeAssetListingAdmin(address admin) external override { - revokeRole(ASSET_LISTING_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isAssetListingAdmin(address admin) external view override returns (bool) { - return hasRole(ASSET_LISTING_ADMIN_ROLE, admin); - } -} diff --git a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index 640e4632..00000000 --- a/downloads/ARBITRUM/ACL_MANAGER/ACLManager/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' - string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC.sol b/downloads/ARBITRUM/BORROW_LOGIC.sol deleted file mode 100644 index 58a89291..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC.sol +++ /dev/null @@ -1,5815 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} - -// downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol - -/** - * @title BorrowLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to borrowing - */ -library BorrowLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the - * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the - * isolated debt. - * @dev Emits the `Borrow()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the borrow function - */ - function executeBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteBorrowParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ( - bool isolationModeActive, - address isolationModeCollateralAddress, - uint256 isolationModeDebtCeiling - ) = userConfig.getIsolationModeState(reservesData, reservesList); - - ValidationLogic.validateBorrow( - reservesData, - reservesList, - eModeCategories, - DataTypes.ValidateBorrowParams({ - reserveCache: reserveCache, - userConfig: userConfig, - asset: params.asset, - userAddress: params.onBehalfOf, - amount: params.amount, - interestRateMode: params.interestRateMode, - reservesCount: params.reservesCount, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory, - priceOracleSentinel: params.priceOracleSentinel, - isolationModeActive: isolationModeActive, - isolationModeCollateralAddress: isolationModeCollateralAddress, - isolationModeDebtCeiling: isolationModeDebtCeiling - }) - ); - - bool isFirstBorrowing = false; - - (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); - - if (isFirstBorrowing) { - userConfig.setBorrowing(reserve.id, true); - } - - if (isolationModeActive) { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt += (params.amount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - 0, - params.releaseUnderlying ? params.amount : 0 - ); - - if (params.releaseUnderlying) { - IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); - } - - emit Borrow( - params.asset, - params.user, - params.onBehalfOf, - params.amount, - DataTypes.InterestRateMode.VARIABLE, - reserve.currentVariableBorrowRate, - params.referralCode - ); - } - - /** - * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the - * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also - * reduces the isolated debt. - * @dev Emits the `Repay()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the repay function - * @return The actual amount being repaid - */ - function executeRepay( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteRepayParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - - uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( - params.onBehalfOf - ); - - ValidationLogic.validateRepay( - reserveCache, - params.amount, - params.interestRateMode, - params.onBehalfOf, - variableDebt - ); - - uint256 paybackAmount = variableDebt; - - // Allows a user to repay with aTokens without leaving dust from interest. - if (params.useATokens && params.amount == type(uint256).max) { - params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); - } - - if (params.amount < paybackAmount) { - paybackAmount = params.amount; - } - - reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) - .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - params.useATokens ? 0 : paybackAmount, - 0 - ); - - if (variableDebt - paybackAmount == 0) { - userConfig.setBorrowing(reserve.id, false); - } - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - reserveCache, - paybackAmount - ); - - if (params.useATokens) { - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - reserveCache.aTokenAddress, - paybackAmount, - reserveCache.nextLiquidityIndex - ); - // in case of aToken repayment the msg.sender must always repay on behalf of itself - if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - } else { - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); - IAToken(reserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.onBehalfOf, - paybackAmount - ); - } - - emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); - - return paybackAmount; - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 01e1bcaf..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,833 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index e7ba8f7a..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 43987f47..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,583 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol deleted file mode 100644 index c4ed26ed..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {IsolationModeLogic} from './IsolationModeLogic.sol'; - -/** - * @title BorrowLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to borrowing - */ -library BorrowLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the - * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the - * isolated debt. - * @dev Emits the `Borrow()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the borrow function - */ - function executeBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteBorrowParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ( - bool isolationModeActive, - address isolationModeCollateralAddress, - uint256 isolationModeDebtCeiling - ) = userConfig.getIsolationModeState(reservesData, reservesList); - - ValidationLogic.validateBorrow( - reservesData, - reservesList, - eModeCategories, - DataTypes.ValidateBorrowParams({ - reserveCache: reserveCache, - userConfig: userConfig, - asset: params.asset, - userAddress: params.onBehalfOf, - amount: params.amount, - interestRateMode: params.interestRateMode, - reservesCount: params.reservesCount, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory, - priceOracleSentinel: params.priceOracleSentinel, - isolationModeActive: isolationModeActive, - isolationModeCollateralAddress: isolationModeCollateralAddress, - isolationModeDebtCeiling: isolationModeDebtCeiling - }) - ); - - bool isFirstBorrowing = false; - - (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); - - if (isFirstBorrowing) { - userConfig.setBorrowing(reserve.id, true); - } - - if (isolationModeActive) { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt += (params.amount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - 0, - params.releaseUnderlying ? params.amount : 0 - ); - - if (params.releaseUnderlying) { - IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); - } - - emit Borrow( - params.asset, - params.user, - params.onBehalfOf, - params.amount, - DataTypes.InterestRateMode.VARIABLE, - reserve.currentVariableBorrowRate, - params.referralCode - ); - } - - /** - * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the - * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also - * reduces the isolated debt. - * @dev Emits the `Repay()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the repay function - * @return The actual amount being repaid - */ - function executeRepay( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteRepayParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - - uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( - params.onBehalfOf - ); - - ValidationLogic.validateRepay( - reserveCache, - params.amount, - params.interestRateMode, - params.onBehalfOf, - variableDebt - ); - - uint256 paybackAmount = variableDebt; - - // Allows a user to repay with aTokens without leaving dust from interest. - if (params.useATokens && params.amount == type(uint256).max) { - params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); - } - - if (params.amount < paybackAmount) { - paybackAmount = params.amount; - } - - reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) - .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - params.useATokens ? 0 : paybackAmount, - 0 - ); - - if (variableDebt - paybackAmount == 0) { - userConfig.setBorrowing(reserve.id, false); - } - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - reserveCache, - paybackAmount - ); - - if (params.useATokens) { - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - reserveCache.aTokenAddress, - paybackAmount, - reserveCache.nextLiquidityIndex - ); - // in case of aToken repayment the msg.sender must always repay on behalf of itself - if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - } else { - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); - IAToken(reserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.onBehalfOf, - paybackAmount - ); - } - - emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); - - return paybackAmount; - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index 647fc7e7..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index cd5b83c6..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol deleted file mode 100644 index 473840ea..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index dd5c637d..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index e08a30e8..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index 9adca939..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/ARBITRUM/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC.sol b/downloads/ARBITRUM/BRIDGE_LOGIC.sol deleted file mode 100644 index 9220f632..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC.sol +++ /dev/null @@ -1,5671 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} - -// downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol - -library BridgeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. - * @dev Essentially a supply without transferring the underlying. - * @dev Emits the `MintUnbacked` event - * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param asset The address of the underlying asset to mint aTokens of - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function executeMintUnbacked( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, reserve, amount, onBehalfOf); - - uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); - uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); - - uint256 unbacked = reserve.unbacked += amount.toUint128(); - - require( - unbacked <= unbackedMintCap * (10 ** reserveDecimals), - Errors.UNBACKED_MINT_CAP_EXCEEDED - ); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, 0, 0); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - onBehalfOf, - amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration, - reserveCache.aTokenAddress - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); - } - } - - emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); - } - - /** - * @notice Back the current unbacked with `amount` and pay `fee`. - * @dev It is not possible to back more than the existing unbacked amount of the reserve - * @dev Emits the `BackUnbacked` event - * @param reserve The reserve to back unbacked for - * @param asset The address of the underlying asset to repay - * @param amount The amount to back - * @param fee The amount paid in fees - * @param protocolFeeBps The fraction of fees in basis points paid to the protocol - * @return The backed amount - */ - function executeBackUnbacked( - DataTypes.ReserveData storage reserve, - address asset, - uint256 amount, - uint256 fee, - uint256 protocolFeeBps - ) external returns (uint256) { - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; - - uint256 feeToProtocol = fee.percentMul(protocolFeeBps); - uint256 feeToLP = fee - feeToProtocol; - uint256 added = backingAmount + fee; - - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply() + - uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), - feeToLP - ); - - reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - - reserve.unbacked -= backingAmount.toUint128(); - reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, added, 0); - - IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); - - emit BackUnbacked(asset, msg.sender, backingAmount, fee); - - return backingAmount; - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 01e1bcaf..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,833 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index e7ba8f7a..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 43987f47..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,583 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol deleted file mode 100644 index 3b4d469b..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol +++ /dev/null @@ -1,150 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -library BridgeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. - * @dev Essentially a supply without transferring the underlying. - * @dev Emits the `MintUnbacked` event - * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param asset The address of the underlying asset to mint aTokens of - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function executeMintUnbacked( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, reserve, amount, onBehalfOf); - - uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); - uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); - - uint256 unbacked = reserve.unbacked += amount.toUint128(); - - require( - unbacked <= unbackedMintCap * (10 ** reserveDecimals), - Errors.UNBACKED_MINT_CAP_EXCEEDED - ); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, 0, 0); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - onBehalfOf, - amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration, - reserveCache.aTokenAddress - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); - } - } - - emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); - } - - /** - * @notice Back the current unbacked with `amount` and pay `fee`. - * @dev It is not possible to back more than the existing unbacked amount of the reserve - * @dev Emits the `BackUnbacked` event - * @param reserve The reserve to back unbacked for - * @param asset The address of the underlying asset to repay - * @param amount The amount to back - * @param fee The amount paid in fees - * @param protocolFeeBps The fraction of fees in basis points paid to the protocol - * @return The backed amount - */ - function executeBackUnbacked( - DataTypes.ReserveData storage reserve, - address asset, - uint256 amount, - uint256 fee, - uint256 protocolFeeBps - ) external returns (uint256) { - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; - - uint256 feeToProtocol = fee.percentMul(protocolFeeBps); - uint256 feeToLP = fee - feeToProtocol; - uint256 added = backingAmount + fee; - - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply() + - uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), - feeToLP - ); - - reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - - reserve.unbacked -= backingAmount.toUint128(); - reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, added, 0); - - IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); - - emit BackUnbacked(asset, msg.sender, backingAmount, fee); - - return backingAmount; - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index 647fc7e7..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index cd5b83c6..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index dd5c637d..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index e08a30e8..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index 9adca939..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/ARBITRUM/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL.sol b/downloads/ARBITRUM/COLLECTOR_IMPL.sol deleted file mode 100644 index 752e048f..00000000 --- a/downloads/ARBITRUM/COLLECTOR_IMPL.sol +++ /dev/null @@ -1,1161 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.0 ^0.8.0 ^0.8.1; - -// downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/ReentrancyGuard.sol - -// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) - -/** - * @dev Contract module that helps prevent reentrant calls to a function. - * - * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier - * available, which can be applied to functions to make sure there are no nested - * (reentrant) calls to them. - * - * Note that because there is a single `nonReentrant` guard, functions marked as - * `nonReentrant` may not call one another. This can be worked around by making - * those functions `private`, and then adding `external` `nonReentrant` entry - * points to them. - * - * TIP: If you would like to learn more about reentrancy and alternative ways - * to protect against it, check out our blog post - * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. - */ -abstract contract ReentrancyGuard { - // Booleans are more expensive than uint256 or any type that takes up a full - // word because each write operation emits an extra SLOAD to first read the - // slot's contents, replace the bits taken up by the boolean, and then write - // back. This is the compiler's defense against contract upgrades and - // pointer aliasing, and it cannot be disabled. - - // The values being non-zero value makes deployment a bit more expensive, - // but in exchange the refund on every call to nonReentrant will be lower in - // amount. Since refunds are capped to a percentage of the total - // transaction's gas, it is best to keep them low in cases like this one, to - // increase the likelihood of the full refund coming into effect. - uint256 private constant _NOT_ENTERED = 1; - uint256 private constant _ENTERED = 2; - - uint256 private _status; - - constructor() { - _status = _NOT_ENTERED; - } - - /** - * @dev Prevents a contract from calling itself, directly or indirectly. - * Calling a `nonReentrant` function from another `nonReentrant` - * function is not supported. It is possible to prevent this from happening - * by making the `nonReentrant` function external, and making it call a - * `private` function that does the actual work. - */ - modifier nonReentrant() { - // On the first call to nonReentrant, _notEntered will be true - require(_status != _ENTERED, 'ReentrancyGuard: reentrant call'); - - // Any calls to nonReentrant after this point will fail - _status = _ENTERED; - - _; - - // By storing the original value once again, a refund is triggered (see - // https://eips.ethereum.org/EIPS/eip-2200) - _status = _NOT_ENTERED; - } - - /** - * @dev As we use the guard with the proxy we need to init it with the empty value - */ - function _initGuard() internal { - _status = _NOT_ENTERED; - } -} - -// downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/VersionedInitializable.sol - -/** - * @title VersionedInitializable - * - * @dev Helper contract to support initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - * - * @author Aave, inspired by the OpenZeppelin Initializable contract - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 internal lastInitializedRevision = 0; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require(revision > lastInitializedRevision, 'Contract instance has already been initialized'); - - lastInitializedRevision = revision; - - _; - } - - /// @dev returns the revision number of the contract. - /// Needs to be defined in the inherited class as a constant. - function getRevision() internal pure virtual returns (uint256); - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} - -// lib/solidity-utils/src/contracts/oz-common/Address.sol - -// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) -// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/8b778fa20d6d76340c5fac1ed66c80273f05b95a - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - * - * [IMPORTANT] - * ==== - * You shouldn't rely on `isContract` to protect against flash loan attacks! - * - * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets - * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract - * constructor. - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize/address.code.length, which returns 0 - // for contracts in construction, since the code is only stored at the end - // of the constructor execution. - - return account.code.length > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResultFromTarget(target, success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResultFromTarget(target, success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResultFromTarget(target, success, returndata, errorMessage); - } - - /** - * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling - * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. - * - * _Available since v4.8._ - */ - function verifyCallResultFromTarget( - address target, - bool success, - bytes memory returndata, - string memory errorMessage - ) internal view returns (bytes memory) { - if (success) { - if (returndata.length == 0) { - // only check isContract if the call was successful and the return data is empty - // otherwise we already know that it was a contract - require(isContract(target), 'Address: call to non-contract'); - } - return returndata; - } else { - _revert(returndata, errorMessage); - } - } - - /** - * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason or using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - _revert(returndata, errorMessage); - } - } - - function _revert(bytes memory returndata, string memory errorMessage) private pure { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - /// @solidity memory-safe-assembly - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } -} - -// lib/solidity-utils/src/contracts/oz-common/interfaces/IERC20.sol - -// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) -// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/a035b235b4f2c9af4ba88edc4447f02e37f8d124 - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); - - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `to`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address to, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `from` to `to` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address from, address to, uint256 amount) external returns (bool); -} - -// lib/solidity-utils/src/contracts/oz-common/interfaces/IERC20Permit.sol - -// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) -// Modified from https://github.com/OpenZeppelin/openzeppelin-contracts/commit/00cbf5a236564c3b7aacdad1f378cae22d890ca6 - -/** - * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in - * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. - * - * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by - * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't - * need to send a transaction, and thus is not required to hold Ether at all. - */ -interface IERC20Permit { - /** - * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, - * given ``owner``'s signed approval. - * - * IMPORTANT: The same issues {IERC20-approve} has related to transaction - * ordering also apply here. - * - * Emits an {Approval} event. - * - * Requirements: - * - * - `spender` cannot be the zero address. - * - `deadline` must be a timestamp in the future. - * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` - * over the EIP712-formatted function arguments. - * - the signature must use ``owner``'s current nonce (see {nonces}). - * - * For more information on the signature format, see the - * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP - * section]. - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @dev Returns the current nonce for `owner`. This value must be - * included whenever a signature is generated for {permit}. - * - * Every successful call to {permit} increases ``owner``'s nonce by one. This - * prevents a signature from being used multiple times. - */ - function nonces(address owner) external view returns (uint256); - - /** - * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. - */ - // solhint-disable-next-line func-name-mixedcase - function DOMAIN_SEPARATOR() external view returns (bytes32); -} - -// downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/interfaces/ICollector.sol - -interface ICollector { - struct Stream { - uint256 deposit; - uint256 ratePerSecond; - uint256 remainingBalance; - uint256 startTime; - uint256 stopTime; - address recipient; - address sender; - address tokenAddress; - bool isEntity; - } - - /** @notice Emitted when the funds admin changes - * @param fundsAdmin The new funds admin. - **/ - event NewFundsAdmin(address indexed fundsAdmin); - - /** @notice Emitted when the new stream is created - * @param streamId The identifier of the stream. - * @param sender The address of the collector. - * @param recipient The address towards which the money is streamed. - * @param deposit The amount of money to be streamed. - * @param tokenAddress The ERC20 token to use as streaming currency. - * @param startTime The unix timestamp for when the stream starts. - * @param stopTime The unix timestamp for when the stream stops. - **/ - event CreateStream( - uint256 indexed streamId, - address indexed sender, - address indexed recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime - ); - - /** - * @notice Emmitted when withdraw happens from the contract to the recipient's account. - * @param streamId The id of the stream to withdraw tokens from. - * @param recipient The address towards which the money is streamed. - * @param amount The amount of tokens to withdraw. - */ - event WithdrawFromStream(uint256 indexed streamId, address indexed recipient, uint256 amount); - - /** - * @notice Emmitted when the stream is canceled. - * @param streamId The id of the stream to withdraw tokens from. - * @param sender The address of the collector. - * @param recipient The address towards which the money is streamed. - * @param senderBalance The sender's balance at the moment of cancelling. - * @param recipientBalance The recipient's balance at the moment of cancelling. - */ - event CancelStream( - uint256 indexed streamId, - address indexed sender, - address indexed recipient, - uint256 senderBalance, - uint256 recipientBalance - ); - - /** @notice Returns the mock ETH reference address - * @return address The address - **/ - function ETH_MOCK_ADDRESS() external pure returns (address); - - /** @notice Initializes the contracts - * @param fundsAdmin Funds admin address - * @param nextStreamId StreamId to set, applied if greater than 0 - **/ - function initialize(address fundsAdmin, uint256 nextStreamId) external; - - /** - * @notice Return the funds admin, only entity to be able to interact with this contract (controller of reserve) - * @return address The address of the funds admin - **/ - function getFundsAdmin() external view returns (address); - - /** - * @notice Returns the available funds for the given stream id and address. - * @param streamId The id of the stream for which to query the balance. - * @param who The address for which to query the balance. - * @notice Returns the total funds allocated to `who` as uint256. - */ - function balanceOf(uint256 streamId, address who) external view returns (uint256 balance); - - /** - * @dev Function for the funds admin to give ERC20 allowance to other parties - * @param token The address of the token to give allowance from - * @param recipient Allowance's recipient - * @param amount Allowance to approve - **/ - function approve(IERC20 token, address recipient, uint256 amount) external; - - /** - * @notice Function for the funds admin to transfer ERC20 tokens to other parties - * @param token The address of the token to transfer - * @param recipient Transfer's recipient - * @param amount Amount to transfer - **/ - function transfer(IERC20 token, address recipient, uint256 amount) external; - - /** - * @dev Transfer the ownership of the funds administrator role. - This function should only be callable by the current funds administrator. - * @param admin The address of the new funds administrator - */ - function setFundsAdmin(address admin) external; - - /** - * @notice Creates a new stream funded by this contracts itself and paid towards `recipient`. - * @param recipient The address towards which the money is streamed. - * @param deposit The amount of money to be streamed. - * @param tokenAddress The ERC20 token to use as streaming currency. - * @param startTime The unix timestamp for when the stream starts. - * @param stopTime The unix timestamp for when the stream stops. - * @return streamId the uint256 id of the newly created stream. - */ - function createStream( - address recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime - ) external returns (uint256 streamId); - - /** - * @notice Returns the stream with all its properties. - * @dev Throws if the id does not point to a valid stream. - * @param streamId The id of the stream to query. - * @notice Returns the stream object. - */ - function getStream( - uint256 streamId - ) - external - view - returns ( - address sender, - address recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime, - uint256 remainingBalance, - uint256 ratePerSecond - ); - - /** - * @notice Withdraws from the contract to the recipient's account. - * @param streamId The id of the stream to withdraw tokens from. - * @param amount The amount of tokens to withdraw. - * @return bool Returns true if successful. - */ - function withdrawFromStream(uint256 streamId, uint256 amount) external returns (bool); - - /** - * @notice Cancels the stream and transfers the tokens back on a pro rata basis. - * @param streamId The id of the stream to cancel. - * @return bool Returns true if successful. - */ - function cancelStream(uint256 streamId) external returns (bool); - - /** - * @notice Returns the next available stream id - * @return nextStreamId Returns the stream id. - */ - function getNextStreamId() external view returns (uint256); -} - -// lib/solidity-utils/src/contracts/oz-common/SafeERC20.sol - -// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol) -// Modified From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/00cbf5a236564c3b7aacdad1f378cae22d890ca6 - -/** - * @title SafeERC20 - * @dev Wrappers around ERC20 operations that throw on failure (when the token - * contract returns false). Tokens that return no value (and instead revert or - * throw on failure) are also supported, non-reverting calls are assumed to be - * successful. - * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, - * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. - */ -library SafeERC20 { - using Address for address; - - /** - * @dev An operation with an ERC20 token failed. - */ - error SafeERC20FailedOperation(address token); - - /** - * @dev Indicates a failed `decreaseAllowance` request. - */ - error SafeERC20FailedDecreaseAllowance( - address spender, - uint256 currentAllowance, - uint256 requestedDecrease - ); - - /** - * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, - * non-reverting calls are assumed to be successful. - */ - function safeTransfer(IERC20 token, address to, uint256 value) internal { - _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); - } - - /** - * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the - * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. - */ - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); - } - - /** - * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, - * non-reverting calls are assumed to be successful. - */ - function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { - uint256 oldAllowance = token.allowance(address(this), spender); - forceApprove(token, spender, oldAllowance + value); - } - - /** - * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no value, - * non-reverting calls are assumed to be successful. - */ - function safeDecreaseAllowance( - IERC20 token, - address spender, - uint256 requestedDecrease - ) internal { - unchecked { - uint256 currentAllowance = token.allowance(address(this), spender); - if (currentAllowance < requestedDecrease) { - revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); - } - forceApprove(token, spender, currentAllowance - requestedDecrease); - } - } - - /** - * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, - * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval - * to be set to zero before setting it to a non-zero value, such as USDT. - */ - function forceApprove(IERC20 token, address spender, uint256 value) internal { - bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); - - if (!_callOptionalReturnBool(token, approvalCall)) { - _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); - _callOptionalReturn(token, approvalCall); - } - } - - /** - * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. - * Revert on invalid signature. - */ - function safePermit( - IERC20Permit token, - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) internal { - uint256 nonceBefore = token.nonces(owner); - token.permit(owner, spender, value, deadline, v, r, s); - uint256 nonceAfter = token.nonces(owner); - if (nonceAfter != nonceBefore + 1) { - revert SafeERC20FailedOperation(address(token)); - } - } - - /** - * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement - * on the return value: the return value is optional (but if data is returned, it must not be false). - * @param token The token targeted by the call. - * @param data The call data (encoded using abi.encode or one of its variants). - */ - function _callOptionalReturn(IERC20 token, bytes memory data) private { - // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since - // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that - // the target address contains contract code and also asserts for success in the low-level call. - - bytes memory returndata = address(token).functionCall(data); - if (returndata.length != 0 && !abi.decode(returndata, (bool))) { - revert SafeERC20FailedOperation(address(token)); - } - } - - /** - * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement - * on the return value: the return value is optional (but if data is returned, it must not be false). - * @param token The token targeted by the call. - * @param data The call data (encoded using abi.encode or one of its variants). - * - * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. - */ - function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { - // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since - // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false - // and not revert is the subcall reverts. - - (bool success, bytes memory returndata) = address(token).call(data); - return - success && - (returndata.length == 0 || abi.decode(returndata, (bool))) && - address(token).code.length > 0; - } -} - -// downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/contracts/Collector.sol - -/** - * @title Collector - * @notice Stores ERC20 tokens of an ecosystem reserve and allows to dispose of them via approval - * or transfer dynamics or streaming capabilities. - * Modification of Sablier https://github.com/sablierhq/sablier/blob/develop/packages/protocol/contracts/Sablier.sol - * Original can be found also deployed on https://etherscan.io/address/0xCD18eAa163733Da39c232722cBC4E8940b1D8888 - * Modifications: - * - Sablier "pulls" the funds from the creator of the stream at creation. In the Aave case, we already have the funds. - * - Anybody can create streams on Sablier. Here, only the funds admin (Aave governance via controller) can - * - Adapted codebase to Solidity 0.8.11, mainly removing SafeMath and CarefulMath to use native safe math - * - Same as with creation, on Sablier the `sender` and `recipient` can cancel a stream. Here, only fund admin and recipient - * @author BGD Labs - **/ -contract Collector is VersionedInitializable, ICollector, ReentrancyGuard { - using SafeERC20 for IERC20; - using Address for address payable; - - /*** Storage Properties ***/ - - /** - * @notice Address of the current funds admin. - */ - address internal _fundsAdmin; - - /** - * @notice Current revision of the contract. - */ - uint256 public constant REVISION = 5; - - /** - * @notice Counter for new stream ids. - */ - uint256 private _nextStreamId; - - /** - * @notice The stream objects identifiable by their unsigned integer ids. - */ - mapping(uint256 => Stream) private _streams; - - /// @inheritdoc ICollector - address public constant ETH_MOCK_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /*** Modifiers ***/ - - /** - * @dev Throws if the caller is not the funds admin. - */ - modifier onlyFundsAdmin() { - require(msg.sender == _fundsAdmin, 'ONLY_BY_FUNDS_ADMIN'); - _; - } - - /** - * @dev Throws if the caller is not the funds admin of the recipient of the stream. - * @param streamId The id of the stream to query. - */ - modifier onlyAdminOrRecipient(uint256 streamId) { - require( - msg.sender == _fundsAdmin || msg.sender == _streams[streamId].recipient, - 'caller is not the funds admin or the recipient of the stream' - ); - _; - } - - /** - * @dev Throws if the provided id does not point to a valid stream. - */ - modifier streamExists(uint256 streamId) { - require(_streams[streamId].isEntity, 'stream does not exist'); - _; - } - - /*** Contract Logic Starts Here */ - - /// @inheritdoc ICollector - function initialize(address fundsAdmin, uint256 nextStreamId) external initializer { - if (nextStreamId != 0) { - _nextStreamId = nextStreamId; - } - - // can be removed after first deployment - _initGuard(); - _setFundsAdmin(fundsAdmin); - } - - /*** View Functions ***/ - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure override returns (uint256) { - return REVISION; - } - - /// @inheritdoc ICollector - function getFundsAdmin() external view returns (address) { - return _fundsAdmin; - } - - /// @inheritdoc ICollector - function getNextStreamId() external view returns (uint256) { - return _nextStreamId; - } - - /// @inheritdoc ICollector - function getStream( - uint256 streamId - ) - external - view - streamExists(streamId) - returns ( - address sender, - address recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime, - uint256 remainingBalance, - uint256 ratePerSecond - ) - { - sender = _streams[streamId].sender; - recipient = _streams[streamId].recipient; - deposit = _streams[streamId].deposit; - tokenAddress = _streams[streamId].tokenAddress; - startTime = _streams[streamId].startTime; - stopTime = _streams[streamId].stopTime; - remainingBalance = _streams[streamId].remainingBalance; - ratePerSecond = _streams[streamId].ratePerSecond; - } - - /** - * @notice Returns either the delta in seconds between `block.timestamp` and `startTime` or - * between `stopTime` and `startTime, whichever is smaller. If `block.timestamp` is before - * `startTime`, it returns 0. - * @dev Throws if the id does not point to a valid stream. - * @param streamId The id of the stream for which to query the delta. - * @notice Returns the time delta in seconds. - */ - function deltaOf(uint256 streamId) public view streamExists(streamId) returns (uint256 delta) { - Stream memory stream = _streams[streamId]; - if (block.timestamp <= stream.startTime) return 0; - if (block.timestamp < stream.stopTime) return block.timestamp - stream.startTime; - return stream.stopTime - stream.startTime; - } - - struct BalanceOfLocalVars { - uint256 recipientBalance; - uint256 withdrawalAmount; - uint256 senderBalance; - } - - /// @inheritdoc ICollector - function balanceOf( - uint256 streamId, - address who - ) public view streamExists(streamId) returns (uint256 balance) { - Stream memory stream = _streams[streamId]; - BalanceOfLocalVars memory vars; - - uint256 delta = deltaOf(streamId); - vars.recipientBalance = delta * stream.ratePerSecond; - - /* - * If the stream `balance` does not equal `deposit`, it means there have been withdrawals. - * We have to subtract the total amount withdrawn from the amount of money that has been - * streamed until now. - */ - if (stream.deposit > stream.remainingBalance) { - vars.withdrawalAmount = stream.deposit - stream.remainingBalance; - vars.recipientBalance = vars.recipientBalance - vars.withdrawalAmount; - } - - if (who == stream.recipient) return vars.recipientBalance; - if (who == stream.sender) { - vars.senderBalance = stream.remainingBalance - vars.recipientBalance; - return vars.senderBalance; - } - return 0; - } - - /*** Public Effects & Interactions Functions ***/ - - /// @inheritdoc ICollector - function approve(IERC20 token, address recipient, uint256 amount) external onlyFundsAdmin { - token.safeApprove(recipient, amount); - } - - /// @inheritdoc ICollector - function transfer(IERC20 token, address recipient, uint256 amount) external onlyFundsAdmin { - require(recipient != address(0), 'INVALID_0X_RECIPIENT'); - - if (address(token) == ETH_MOCK_ADDRESS) { - payable(recipient).sendValue(amount); - } else { - token.safeTransfer(recipient, amount); - } - } - - /// @dev needed in order to receive ETH from the Aave v1 ecosystem reserve - receive() external payable {} - - /// @inheritdoc ICollector - function setFundsAdmin(address admin) external onlyFundsAdmin { - _setFundsAdmin(admin); - } - - /** - * @dev Transfer the ownership of the funds administrator role. - * @param admin The address of the new funds administrator - */ - function _setFundsAdmin(address admin) internal { - _fundsAdmin = admin; - emit NewFundsAdmin(admin); - } - - struct CreateStreamLocalVars { - uint256 duration; - uint256 ratePerSecond; - } - - /// @inheritdoc ICollector - /** - * @dev Throws if the recipient is the zero address, the contract itself or the caller. - * Throws if the deposit is 0. - * Throws if the start time is before `block.timestamp`. - * Throws if the stop time is before the start time. - * Throws if the duration calculation has a math error. - * Throws if the deposit is smaller than the duration. - * Throws if the deposit is not a multiple of the duration. - * Throws if the rate calculation has a math error. - * Throws if the next stream id calculation has a math error. - * Throws if the contract is not allowed to transfer enough tokens. - * Throws if there is a token transfer failure. - */ - function createStream( - address recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime - ) external onlyFundsAdmin returns (uint256) { - require(recipient != address(0), 'stream to the zero address'); - require(recipient != address(this), 'stream to the contract itself'); - require(recipient != msg.sender, 'stream to the caller'); - require(deposit > 0, 'deposit is zero'); - require(startTime >= block.timestamp, 'start time before block.timestamp'); - require(stopTime > startTime, 'stop time before the start time'); - - CreateStreamLocalVars memory vars; - vars.duration = stopTime - startTime; - - /* Without this, the rate per second would be zero. */ - require(deposit >= vars.duration, 'deposit smaller than time delta'); - - /* This condition avoids dealing with remainders */ - require(deposit % vars.duration == 0, 'deposit not multiple of time delta'); - - vars.ratePerSecond = deposit / vars.duration; - - /* Create and store the stream object. */ - uint256 streamId = _nextStreamId; - _streams[streamId] = Stream({ - remainingBalance: deposit, - deposit: deposit, - isEntity: true, - ratePerSecond: vars.ratePerSecond, - recipient: recipient, - sender: address(this), - startTime: startTime, - stopTime: stopTime, - tokenAddress: tokenAddress - }); - - /* Increment the next stream id. */ - _nextStreamId++; - - emit CreateStream( - streamId, - address(this), - recipient, - deposit, - tokenAddress, - startTime, - stopTime - ); - return streamId; - } - - /// @inheritdoc ICollector - /** - * @dev Throws if the id does not point to a valid stream. - * Throws if the caller is not the funds admin or the recipient of the stream. - * Throws if the amount exceeds the available balance. - * Throws if there is a token transfer failure. - */ - function withdrawFromStream( - uint256 streamId, - uint256 amount - ) external nonReentrant streamExists(streamId) onlyAdminOrRecipient(streamId) returns (bool) { - require(amount > 0, 'amount is zero'); - Stream memory stream = _streams[streamId]; - - uint256 balance = balanceOf(streamId, stream.recipient); - require(balance >= amount, 'amount exceeds the available balance'); - - _streams[streamId].remainingBalance = stream.remainingBalance - amount; - - if (_streams[streamId].remainingBalance == 0) delete _streams[streamId]; - - IERC20(stream.tokenAddress).safeTransfer(stream.recipient, amount); - emit WithdrawFromStream(streamId, stream.recipient, amount); - return true; - } - - /// @inheritdoc ICollector - /** - * @dev Throws if the id does not point to a valid stream. - * Throws if the caller is not the funds admin or the recipient of the stream. - * Throws if there is a token transfer failure. - */ - function cancelStream( - uint256 streamId - ) external nonReentrant streamExists(streamId) onlyAdminOrRecipient(streamId) returns (bool) { - Stream memory stream = _streams[streamId]; - uint256 senderBalance = balanceOf(streamId, stream.sender); - uint256 recipientBalance = balanceOf(streamId, stream.recipient); - - delete _streams[streamId]; - - IERC20 token = IERC20(stream.tokenAddress); - if (recipientBalance > 0) token.safeTransfer(stream.recipient, recipientBalance); - - emit CancelStream(streamId, stream.sender, stream.recipient, senderBalance, recipientBalance); - return true; - } -} diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/Address.sol b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/Address.sol deleted file mode 100644 index 2460f0ea..00000000 --- a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/Address.sol +++ /dev/null @@ -1,249 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) -// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/8b778fa20d6d76340c5fac1ed66c80273f05b95a - -pragma solidity ^0.8.1; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - * - * [IMPORTANT] - * ==== - * You shouldn't rely on `isContract` to protect against flash loan attacks! - * - * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets - * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract - * constructor. - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize/address.code.length, which returns 0 - // for contracts in construction, since the code is only stored at the end - // of the constructor execution. - - return account.code.length > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResultFromTarget(target, success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall(address target, bytes memory data) - internal - view - returns (bytes memory) - { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResultFromTarget(target, success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResultFromTarget(target, success, returndata, errorMessage); - } - - /** - * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling - * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. - * - * _Available since v4.8._ - */ - function verifyCallResultFromTarget( - address target, - bool success, - bytes memory returndata, - string memory errorMessage - ) internal view returns (bytes memory) { - if (success) { - if (returndata.length == 0) { - // only check isContract if the call was successful and the return data is empty - // otherwise we already know that it was a contract - require(isContract(target), 'Address: call to non-contract'); - } - return returndata; - } else { - _revert(returndata, errorMessage); - } - } - - /** - * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason or using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - _revert(returndata, errorMessage); - } - } - - function _revert(bytes memory returndata, string memory errorMessage) private pure { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - /// @solidity memory-safe-assembly - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } -} diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/SafeERC20.sol b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/SafeERC20.sol deleted file mode 100644 index 78ad44ec..00000000 --- a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/SafeERC20.sol +++ /dev/null @@ -1,117 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) -// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/3dac7bbed7b4c0dbf504180c33e8ed8e350b93eb - -pragma solidity ^0.8.0; - -import "./interfaces/IERC20.sol"; -import "./interfaces/draft-IERC20Permit.sol"; -import "./Address.sol"; - -/** - * @title SafeERC20 - * @dev Wrappers around ERC20 operations that throw on failure (when the token - * contract returns false). Tokens that return no value (and instead revert or - * throw on failure) are also supported, non-reverting calls are assumed to be - * successful. - * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, - * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. - */ -library SafeERC20 { - using Address for address; - - function safeTransfer( - IERC20 token, - address to, - uint256 value - ) internal { - _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); - } - - function safeTransferFrom( - IERC20 token, - address from, - address to, - uint256 value - ) internal { - _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); - } - - /** - * @dev Deprecated. This function has issues similar to the ones found in - * {IERC20-approve}, and its usage is discouraged. - * - * Whenever possible, use {safeIncreaseAllowance} and - * {safeDecreaseAllowance} instead. - */ - function safeApprove( - IERC20 token, - address spender, - uint256 value - ) internal { - // safeApprove should only be called when setting an initial allowance, - // or when resetting it to zero. To increase and decrease it, use - // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' - require( - (value == 0) || (token.allowance(address(this), spender) == 0), - "SafeERC20: approve from non-zero to non-zero allowance" - ); - _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); - } - - function safeIncreaseAllowance( - IERC20 token, - address spender, - uint256 value - ) internal { - uint256 newAllowance = token.allowance(address(this), spender) + value; - _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); - } - - function safeDecreaseAllowance( - IERC20 token, - address spender, - uint256 value - ) internal { - unchecked { - uint256 oldAllowance = token.allowance(address(this), spender); - require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); - uint256 newAllowance = oldAllowance - value; - _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); - } - } - - function safePermit( - IERC20Permit token, - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) internal { - uint256 nonceBefore = token.nonces(owner); - token.permit(owner, spender, value, deadline, v, r, s); - uint256 nonceAfter = token.nonces(owner); - require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); - } - - /** - * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement - * on the return value: the return value is optional (but if data is returned, it must not be false). - * @param token The token targeted by the call. - * @param data The call data (encoded using abi.encode or one of its variants). - */ - function _callOptionalReturn(IERC20 token, bytes memory data) private { - // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since - // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that - // the target address contains contract code and also asserts for success in the low-level call. - - bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); - if (returndata.length > 0) { - // Return data is optional - require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); - } - } -} \ No newline at end of file diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/interfaces/IERC20.sol b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/interfaces/IERC20.sol deleted file mode 100644 index 053588c2..00000000 --- a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/interfaces/IERC20.sol +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) -// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/a035b235b4f2c9af4ba88edc4447f02e37f8d124 - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); - - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `to`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address to, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `from` to `to` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom( - address from, - address to, - uint256 amount - ) external returns (bool); -} \ No newline at end of file diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/interfaces/draft-IERC20Permit.sol b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/interfaces/draft-IERC20Permit.sol deleted file mode 100644 index 298fd2aa..00000000 --- a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/lib/solidity-utils/src/contracts/oz-common/interfaces/draft-IERC20Permit.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) -// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/6bd6b76d1156e20e45d1016f355d154141c7e5b9 - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in - * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. - * - * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by - * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't - * need to send a transaction, and thus is not required to hold Ether at all. - */ -interface IERC20Permit { - /** - * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, - * given ``owner``'s signed approval. - * - * IMPORTANT: The same issues {IERC20-approve} has related to transaction - * ordering also apply here. - * - * Emits an {Approval} event. - * - * Requirements: - * - * - `spender` cannot be the zero address. - * - `deadline` must be a timestamp in the future. - * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` - * over the EIP712-formatted function arguments. - * - the signature must use ``owner``'s current nonce (see {nonces}). - * - * For more information on the signature format, see the - * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP - * section]. - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @dev Returns the current nonce for `owner`. This value must be - * included whenever a signature is generated for {permit}. - * - * Every successful call to {permit} increases ``owner``'s nonce by one. This - * prevents a signature from being used multiple times. - */ - function nonces(address owner) external view returns (uint256); - - /** - * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. - */ - // solhint-disable-next-line func-name-mixedcase - function DOMAIN_SEPARATOR() external view returns (bytes32); -} \ No newline at end of file diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/contracts/Collector.sol b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/contracts/Collector.sol deleted file mode 100644 index eee55aee..00000000 --- a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/contracts/Collector.sol +++ /dev/null @@ -1,346 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; -import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; -import {Address} from 'solidity-utils/contracts/oz-common/Address.sol'; -import {ICollector} from '../interfaces/ICollector.sol'; -import {VersionedInitializable} from '../libs/VersionedInitializable.sol'; -import {ReentrancyGuard} from '../libs/ReentrancyGuard.sol'; - -/** - * @title Collector - * @notice Stores ERC20 tokens of an ecosystem reserve and allows to dispose of them via approval - * or transfer dynamics or streaming capabilities. - * Modification of Sablier https://github.com/sablierhq/sablier/blob/develop/packages/protocol/contracts/Sablier.sol - * Original can be found also deployed on https://etherscan.io/address/0xCD18eAa163733Da39c232722cBC4E8940b1D8888 - * Modifications: - * - Sablier "pulls" the funds from the creator of the stream at creation. In the Aave case, we already have the funds. - * - Anybody can create streams on Sablier. Here, only the funds admin (Aave governance via controller) can - * - Adapted codebase to Solidity 0.8.11, mainly removing SafeMath and CarefulMath to use native safe math - * - Same as with creation, on Sablier the `sender` and `recipient` can cancel a stream. Here, only fund admin and recipient - * @author BGD Labs - **/ -contract Collector is VersionedInitializable, ICollector, ReentrancyGuard { - using SafeERC20 for IERC20; - using Address for address payable; - - /*** Storage Properties ***/ - - /** - * @notice Address of the current funds admin. - */ - address internal _fundsAdmin; - - /** - * @notice Current revision of the contract. - */ - uint256 public constant REVISION = 5; - - /** - * @notice Counter for new stream ids. - */ - uint256 private _nextStreamId; - - /** - * @notice The stream objects identifiable by their unsigned integer ids. - */ - mapping(uint256 => Stream) private _streams; - - /// @inheritdoc ICollector - address public constant ETH_MOCK_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /*** Modifiers ***/ - - /** - * @dev Throws if the caller is not the funds admin. - */ - modifier onlyFundsAdmin() { - require(msg.sender == _fundsAdmin, 'ONLY_BY_FUNDS_ADMIN'); - _; - } - - /** - * @dev Throws if the caller is not the funds admin of the recipient of the stream. - * @param streamId The id of the stream to query. - */ - modifier onlyAdminOrRecipient(uint256 streamId) { - require( - msg.sender == _fundsAdmin || msg.sender == _streams[streamId].recipient, - 'caller is not the funds admin or the recipient of the stream' - ); - _; - } - - /** - * @dev Throws if the provided id does not point to a valid stream. - */ - modifier streamExists(uint256 streamId) { - require(_streams[streamId].isEntity, 'stream does not exist'); - _; - } - - /*** Contract Logic Starts Here */ - - /// @inheritdoc ICollector - function initialize(address fundsAdmin, uint256 nextStreamId) external initializer { - if (nextStreamId != 0) { - _nextStreamId = nextStreamId; - } - - // can be removed after first deployment - _initGuard(); - _setFundsAdmin(fundsAdmin); - } - - /*** View Functions ***/ - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure override returns (uint256) { - return REVISION; - } - - /// @inheritdoc ICollector - function getFundsAdmin() external view returns (address) { - return _fundsAdmin; - } - - /// @inheritdoc ICollector - function getNextStreamId() external view returns (uint256) { - return _nextStreamId; - } - - /// @inheritdoc ICollector - function getStream( - uint256 streamId - ) - external - view - streamExists(streamId) - returns ( - address sender, - address recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime, - uint256 remainingBalance, - uint256 ratePerSecond - ) - { - sender = _streams[streamId].sender; - recipient = _streams[streamId].recipient; - deposit = _streams[streamId].deposit; - tokenAddress = _streams[streamId].tokenAddress; - startTime = _streams[streamId].startTime; - stopTime = _streams[streamId].stopTime; - remainingBalance = _streams[streamId].remainingBalance; - ratePerSecond = _streams[streamId].ratePerSecond; - } - - /** - * @notice Returns either the delta in seconds between `block.timestamp` and `startTime` or - * between `stopTime` and `startTime, whichever is smaller. If `block.timestamp` is before - * `startTime`, it returns 0. - * @dev Throws if the id does not point to a valid stream. - * @param streamId The id of the stream for which to query the delta. - * @notice Returns the time delta in seconds. - */ - function deltaOf(uint256 streamId) public view streamExists(streamId) returns (uint256 delta) { - Stream memory stream = _streams[streamId]; - if (block.timestamp <= stream.startTime) return 0; - if (block.timestamp < stream.stopTime) return block.timestamp - stream.startTime; - return stream.stopTime - stream.startTime; - } - - struct BalanceOfLocalVars { - uint256 recipientBalance; - uint256 withdrawalAmount; - uint256 senderBalance; - } - - /// @inheritdoc ICollector - function balanceOf( - uint256 streamId, - address who - ) public view streamExists(streamId) returns (uint256 balance) { - Stream memory stream = _streams[streamId]; - BalanceOfLocalVars memory vars; - - uint256 delta = deltaOf(streamId); - vars.recipientBalance = delta * stream.ratePerSecond; - - /* - * If the stream `balance` does not equal `deposit`, it means there have been withdrawals. - * We have to subtract the total amount withdrawn from the amount of money that has been - * streamed until now. - */ - if (stream.deposit > stream.remainingBalance) { - vars.withdrawalAmount = stream.deposit - stream.remainingBalance; - vars.recipientBalance = vars.recipientBalance - vars.withdrawalAmount; - } - - if (who == stream.recipient) return vars.recipientBalance; - if (who == stream.sender) { - vars.senderBalance = stream.remainingBalance - vars.recipientBalance; - return vars.senderBalance; - } - return 0; - } - - /*** Public Effects & Interactions Functions ***/ - - /// @inheritdoc ICollector - function approve(IERC20 token, address recipient, uint256 amount) external onlyFundsAdmin { - token.safeApprove(recipient, amount); - } - - /// @inheritdoc ICollector - function transfer(IERC20 token, address recipient, uint256 amount) external onlyFundsAdmin { - require(recipient != address(0), 'INVALID_0X_RECIPIENT'); - - if (address(token) == ETH_MOCK_ADDRESS) { - payable(recipient).sendValue(amount); - } else { - token.safeTransfer(recipient, amount); - } - } - - /// @dev needed in order to receive ETH from the Aave v1 ecosystem reserve - receive() external payable {} - - /// @inheritdoc ICollector - function setFundsAdmin(address admin) external onlyFundsAdmin { - _setFundsAdmin(admin); - } - - /** - * @dev Transfer the ownership of the funds administrator role. - * @param admin The address of the new funds administrator - */ - function _setFundsAdmin(address admin) internal { - _fundsAdmin = admin; - emit NewFundsAdmin(admin); - } - - struct CreateStreamLocalVars { - uint256 duration; - uint256 ratePerSecond; - } - - /// @inheritdoc ICollector - /** - * @dev Throws if the recipient is the zero address, the contract itself or the caller. - * Throws if the deposit is 0. - * Throws if the start time is before `block.timestamp`. - * Throws if the stop time is before the start time. - * Throws if the duration calculation has a math error. - * Throws if the deposit is smaller than the duration. - * Throws if the deposit is not a multiple of the duration. - * Throws if the rate calculation has a math error. - * Throws if the next stream id calculation has a math error. - * Throws if the contract is not allowed to transfer enough tokens. - * Throws if there is a token transfer failure. - */ - function createStream( - address recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime - ) external onlyFundsAdmin returns (uint256) { - require(recipient != address(0), 'stream to the zero address'); - require(recipient != address(this), 'stream to the contract itself'); - require(recipient != msg.sender, 'stream to the caller'); - require(deposit > 0, 'deposit is zero'); - require(startTime >= block.timestamp, 'start time before block.timestamp'); - require(stopTime > startTime, 'stop time before the start time'); - - CreateStreamLocalVars memory vars; - vars.duration = stopTime - startTime; - - /* Without this, the rate per second would be zero. */ - require(deposit >= vars.duration, 'deposit smaller than time delta'); - - /* This condition avoids dealing with remainders */ - require(deposit % vars.duration == 0, 'deposit not multiple of time delta'); - - vars.ratePerSecond = deposit / vars.duration; - - /* Create and store the stream object. */ - uint256 streamId = _nextStreamId; - _streams[streamId] = Stream({ - remainingBalance: deposit, - deposit: deposit, - isEntity: true, - ratePerSecond: vars.ratePerSecond, - recipient: recipient, - sender: address(this), - startTime: startTime, - stopTime: stopTime, - tokenAddress: tokenAddress - }); - - /* Increment the next stream id. */ - _nextStreamId++; - - emit CreateStream( - streamId, - address(this), - recipient, - deposit, - tokenAddress, - startTime, - stopTime - ); - return streamId; - } - - /// @inheritdoc ICollector - /** - * @dev Throws if the id does not point to a valid stream. - * Throws if the caller is not the funds admin or the recipient of the stream. - * Throws if the amount exceeds the available balance. - * Throws if there is a token transfer failure. - */ - function withdrawFromStream( - uint256 streamId, - uint256 amount - ) external nonReentrant streamExists(streamId) onlyAdminOrRecipient(streamId) returns (bool) { - require(amount > 0, 'amount is zero'); - Stream memory stream = _streams[streamId]; - - uint256 balance = balanceOf(streamId, stream.recipient); - require(balance >= amount, 'amount exceeds the available balance'); - - _streams[streamId].remainingBalance = stream.remainingBalance - amount; - - if (_streams[streamId].remainingBalance == 0) delete _streams[streamId]; - - IERC20(stream.tokenAddress).safeTransfer(stream.recipient, amount); - emit WithdrawFromStream(streamId, stream.recipient, amount); - return true; - } - - /// @inheritdoc ICollector - /** - * @dev Throws if the id does not point to a valid stream. - * Throws if the caller is not the funds admin or the recipient of the stream. - * Throws if there is a token transfer failure. - */ - function cancelStream( - uint256 streamId - ) external nonReentrant streamExists(streamId) onlyAdminOrRecipient(streamId) returns (bool) { - Stream memory stream = _streams[streamId]; - uint256 senderBalance = balanceOf(streamId, stream.sender); - uint256 recipientBalance = balanceOf(streamId, stream.recipient); - - delete _streams[streamId]; - - IERC20 token = IERC20(stream.tokenAddress); - if (recipientBalance > 0) token.safeTransfer(stream.recipient, recipientBalance); - - emit CancelStream(streamId, stream.sender, stream.recipient, senderBalance, recipientBalance); - return true; - } -} diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/interfaces/ICollector.sol b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/interfaces/ICollector.sol deleted file mode 100644 index b19516f7..00000000 --- a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/interfaces/ICollector.sol +++ /dev/null @@ -1,174 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; - -interface ICollector { - struct Stream { - uint256 deposit; - uint256 ratePerSecond; - uint256 remainingBalance; - uint256 startTime; - uint256 stopTime; - address recipient; - address sender; - address tokenAddress; - bool isEntity; - } - - /** @notice Emitted when the funds admin changes - * @param fundsAdmin The new funds admin. - **/ - event NewFundsAdmin(address indexed fundsAdmin); - - /** @notice Emitted when the new stream is created - * @param streamId The identifier of the stream. - * @param sender The address of the collector. - * @param recipient The address towards which the money is streamed. - * @param deposit The amount of money to be streamed. - * @param tokenAddress The ERC20 token to use as streaming currency. - * @param startTime The unix timestamp for when the stream starts. - * @param stopTime The unix timestamp for when the stream stops. - **/ - event CreateStream( - uint256 indexed streamId, - address indexed sender, - address indexed recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime - ); - - /** - * @notice Emmitted when withdraw happens from the contract to the recipient's account. - * @param streamId The id of the stream to withdraw tokens from. - * @param recipient The address towards which the money is streamed. - * @param amount The amount of tokens to withdraw. - */ - event WithdrawFromStream(uint256 indexed streamId, address indexed recipient, uint256 amount); - - /** - * @notice Emmitted when the stream is canceled. - * @param streamId The id of the stream to withdraw tokens from. - * @param sender The address of the collector. - * @param recipient The address towards which the money is streamed. - * @param senderBalance The sender's balance at the moment of cancelling. - * @param recipientBalance The recipient's balance at the moment of cancelling. - */ - event CancelStream( - uint256 indexed streamId, - address indexed sender, - address indexed recipient, - uint256 senderBalance, - uint256 recipientBalance - ); - - /** @notice Returns the mock ETH reference address - * @return address The address - **/ - function ETH_MOCK_ADDRESS() external pure returns (address); - - /** @notice Initializes the contracts - * @param fundsAdmin Funds admin address - * @param nextStreamId StreamId to set, applied if greater than 0 - **/ - function initialize(address fundsAdmin, uint256 nextStreamId) external; - - /** - * @notice Return the funds admin, only entity to be able to interact with this contract (controller of reserve) - * @return address The address of the funds admin - **/ - function getFundsAdmin() external view returns (address); - - /** - * @notice Returns the available funds for the given stream id and address. - * @param streamId The id of the stream for which to query the balance. - * @param who The address for which to query the balance. - * @notice Returns the total funds allocated to `who` as uint256. - */ - function balanceOf(uint256 streamId, address who) external view returns (uint256 balance); - - /** - * @dev Function for the funds admin to give ERC20 allowance to other parties - * @param token The address of the token to give allowance from - * @param recipient Allowance's recipient - * @param amount Allowance to approve - **/ - function approve(IERC20 token, address recipient, uint256 amount) external; - - /** - * @notice Function for the funds admin to transfer ERC20 tokens to other parties - * @param token The address of the token to transfer - * @param recipient Transfer's recipient - * @param amount Amount to transfer - **/ - function transfer(IERC20 token, address recipient, uint256 amount) external; - - /** - * @dev Transfer the ownership of the funds administrator role. - This function should only be callable by the current funds administrator. - * @param admin The address of the new funds administrator - */ - function setFundsAdmin(address admin) external; - - /** - * @notice Creates a new stream funded by this contracts itself and paid towards `recipient`. - * @param recipient The address towards which the money is streamed. - * @param deposit The amount of money to be streamed. - * @param tokenAddress The ERC20 token to use as streaming currency. - * @param startTime The unix timestamp for when the stream starts. - * @param stopTime The unix timestamp for when the stream stops. - * @return streamId the uint256 id of the newly created stream. - */ - function createStream( - address recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime - ) external returns (uint256 streamId); - - /** - * @notice Returns the stream with all its properties. - * @dev Throws if the id does not point to a valid stream. - * @param streamId The id of the stream to query. - * @notice Returns the stream object. - */ - function getStream( - uint256 streamId - ) - external - view - returns ( - address sender, - address recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime, - uint256 remainingBalance, - uint256 ratePerSecond - ); - - /** - * @notice Withdraws from the contract to the recipient's account. - * @param streamId The id of the stream to withdraw tokens from. - * @param amount The amount of tokens to withdraw. - * @return bool Returns true if successful. - */ - function withdrawFromStream(uint256 streamId, uint256 amount) external returns (bool); - - /** - * @notice Cancels the stream and transfers the tokens back on a pro rata basis. - * @param streamId The id of the stream to cancel. - * @return bool Returns true if successful. - */ - function cancelStream(uint256 streamId) external returns (bool); - - /** - * @notice Returns the next available stream id - * @return nextStreamId Returns the stream id. - */ - function getNextStreamId() external view returns (uint256); -} diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/ReentrancyGuard.sol b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/ReentrancyGuard.sol deleted file mode 100644 index d8b54911..00000000 --- a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/ReentrancyGuard.sol +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Contract module that helps prevent reentrant calls to a function. - * - * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier - * available, which can be applied to functions to make sure there are no nested - * (reentrant) calls to them. - * - * Note that because there is a single `nonReentrant` guard, functions marked as - * `nonReentrant` may not call one another. This can be worked around by making - * those functions `private`, and then adding `external` `nonReentrant` entry - * points to them. - * - * TIP: If you would like to learn more about reentrancy and alternative ways - * to protect against it, check out our blog post - * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. - */ -abstract contract ReentrancyGuard { - // Booleans are more expensive than uint256 or any type that takes up a full - // word because each write operation emits an extra SLOAD to first read the - // slot's contents, replace the bits taken up by the boolean, and then write - // back. This is the compiler's defense against contract upgrades and - // pointer aliasing, and it cannot be disabled. - - // The values being non-zero value makes deployment a bit more expensive, - // but in exchange the refund on every call to nonReentrant will be lower in - // amount. Since refunds are capped to a percentage of the total - // transaction's gas, it is best to keep them low in cases like this one, to - // increase the likelihood of the full refund coming into effect. - uint256 private constant _NOT_ENTERED = 1; - uint256 private constant _ENTERED = 2; - - uint256 private _status; - - constructor() { - _status = _NOT_ENTERED; - } - - /** - * @dev Prevents a contract from calling itself, directly or indirectly. - * Calling a `nonReentrant` function from another `nonReentrant` - * function is not supported. It is possible to prevent this from happening - * by making the `nonReentrant` function external, and making it call a - * `private` function that does the actual work. - */ - modifier nonReentrant() { - // On the first call to nonReentrant, _notEntered will be true - require(_status != _ENTERED, 'ReentrancyGuard: reentrant call'); - - // Any calls to nonReentrant after this point will fail - _status = _ENTERED; - - _; - - // By storing the original value once again, a refund is triggered (see - // https://eips.ethereum.org/EIPS/eip-2200) - _status = _NOT_ENTERED; - } - - /** - * @dev As we use the guard with the proxy we need to init it with the empty value - */ - function _initGuard() internal { - _status = _NOT_ENTERED; - } -} diff --git a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/VersionedInitializable.sol b/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/VersionedInitializable.sol deleted file mode 100644 index ab67b10d..00000000 --- a/downloads/ARBITRUM/COLLECTOR_IMPL/Collector/src/libs/VersionedInitializable.sol +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.0; - -/** - * @title VersionedInitializable - * - * @dev Helper contract to support initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - * - * @author Aave, inspired by the OpenZeppelin Initializable contract - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 internal lastInitializedRevision = 0; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require(revision > lastInitializedRevision, 'Contract instance has already been initialized'); - - lastInitializedRevision = revision; - - _; - } - - /// @dev returns the revision number of the contract. - /// Needs to be defined in the inherited class as a constant. - function getRevision() internal pure virtual returns (uint256); - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC.sol deleted file mode 100644 index b92a1a12..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC.sol +++ /dev/null @@ -1,3165 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol - -/** - * @title Proxy - * @dev Implements delegation of calls to other contracts, with proper - * forwarding of return values and bubbling of failures. - * It defines a fallback function that delegates all calls to the address - * returned by the abstract _implementation() internal function. - */ -abstract contract Proxy { - /** - * @dev Fallback function. - * Will run if no other function in the contract matches the call data. - * Implemented entirely in `_fallback`. - */ - fallback() external payable { - _fallback(); - } - - /** - * @dev Fallback function that will run if call data is empty. - * IMPORTANT. receive() on implementation contracts will be unreachable - */ - receive() external payable { - _fallback(); - } - - /** - * @return The Address of the implementation. - */ - function _implementation() internal view virtual returns (address); - - /** - * @dev Delegates execution to an implementation contract. - * This is a low level function that doesn't return to its internal call site. - * It will return to the external caller whatever the implementation returns. - * @param implementation Address to delegate. - */ - function _delegate(address implementation) internal { - //solium-disable-next-line - assembly { - // Copy msg.data. We take full control of memory in this inline assembly - // block because it will not return to Solidity code. We overwrite the - // Solidity scratch pad at memory position 0. - calldatacopy(0, 0, calldatasize()) - - // Call the implementation. - // out and outsize are 0 because we don't know the size yet. - let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) - - // Copy the returned data. - returndatacopy(0, 0, returndatasize()) - - switch result - // delegatecall returns 0 on error. - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } - } - } - - /** - * @dev Function that is run as the first thing in the fallback function. - * Can be redefined in derived contracts to add functionality. - * Redefinitions must call super._willFallback(). - */ - function _willFallback() internal virtual {} - - /** - * @dev fallback implementation. - * Extracted to enable manual triggering. - */ - function _fallback() internal { - _willFallback(); - _delegate(_implementation()); - } -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol - -library ConfiguratorInputTypes { - struct InitReserveInput { - address aTokenImpl; - address stableDebtTokenImpl; - address variableDebtTokenImpl; - bool useVirtualBalance; - address interestRateStrategyAddress; - address underlyingAsset; - address treasury; - address incentivesController; - string aTokenName; - string aTokenSymbol; - string variableDebtTokenName; - string variableDebtTokenSymbol; - string stableDebtTokenName; - string stableDebtTokenSymbol; - bytes params; - bytes interestRateData; - } - - struct UpdateATokenInput { - address asset; - address treasury; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } - - struct UpdateDebtTokenInput { - address asset; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - //the current stable borrow rate. Expressed in ray - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - //stableDebtToken address - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - //the current stable borrow rate. Expressed in ray - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - //stableDebtToken address - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // each eMode category may or may not have a custom oracle to override the individual assets price oracles - address priceSource; - string label; - } - - enum InterestRateMode { - NONE, - STABLE, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currPrincipalStableDebt; - uint256 currAvgStableBorrowRate; - uint256 currTotalStableDebt; - uint256 nextAvgStableBorrowRate; - uint256 nextTotalStableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address stableDebtTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - uint40 stableDebtLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 maxStableLoanPercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalStableDebt; - uint256 totalVariableDebt; - uint256 averageStableBorrowRate; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address stableDebtAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return stableBorrowRate The stable borrow rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256, uint256); -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol - -/** - * @title BaseUpgradeabilityProxy - * @dev This contract implements a proxy that allows to change the - * implementation address to which it will delegate. - * Such a change is called an implementation upgrade. - */ -contract BaseUpgradeabilityProxy is Proxy { - /** - * @dev Emitted when the implementation is upgraded. - * @param implementation Address of the new implementation. - */ - event Upgraded(address indexed implementation); - - /** - * @dev Storage slot with the address of the current implementation. - * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant IMPLEMENTATION_SLOT = - 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /** - * @dev Returns the current implementation. - * @return impl Address of the current implementation - */ - function _implementation() internal view override returns (address impl) { - bytes32 slot = IMPLEMENTATION_SLOT; - //solium-disable-next-line - assembly { - impl := sload(slot) - } - } - - /** - * @dev Upgrades the proxy to a new implementation. - * @param newImplementation Address of the new implementation. - */ - function _upgradeTo(address newImplementation) internal { - _setImplementation(newImplementation); - emit Upgraded(newImplementation); - } - - /** - * @dev Sets the implementation address of the proxy. - * @param newImplementation Address of the new implementation. - */ - function _setImplementation(address newImplementation) internal { - require( - Address.isContract(newImplementation), - 'Cannot set a proxy implementation to a non-contract address' - ); - - bytes32 slot = IMPLEMENTATION_SLOT; - - //solium-disable-next-line - assembly { - sstore(slot, newImplementation) - } - } -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on swapBorrowRateMode() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user swapping his rate mode - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - */ - event SwapBorrowRateMode( - address indexed reserve, - address indexed user, - DataTypes.InterestRateMode interestRateMode - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on rebalanceStableBorrowRate() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user for which the rebalance has been executed - */ - event RebalanceStableBorrowRate(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the - * corresponding debt token (StableDebtToken or VariableDebtToken) - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 stable/variable debt tokens, depending on the `interestRateMode` - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa - * @param asset The address of the underlying asset borrowed - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - */ - function swapBorrowRateMode(address asset, uint256 interestRateMode) external; - - /** - * @notice Permissionless method which allows anyone to swap a users stable debt to variable debt - * @dev Introduced in favor of stable rate deprecation - * @param asset The address of the underlying asset borrowed - * @param user The address of the user whose debt will be swapped from stable to variable - */ - function swapToVariable(address asset, address user) external; - - /** - * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. - * - Users can be rebalanced if the following conditions are satisfied: - * 1. Usage ratio is above 95% - * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too - * much has been borrowed at a stable rate and suppliers are not earning enough - * @param asset The address of the underlying asset borrowed - * @param user The address of the user to be rebalanced - */ - function rebalanceStableBorrowRate(address asset, address user) external; - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address stableDebtAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new category for the eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; - - /** - * @notice Returns the data of an eMode category - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate - * @return The percentage of available liquidity to borrow, expressed in bps - */ - function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external returns (address); -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant STABLE_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant EMODE_CATEGORY_MASK = 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant STABLE_BORROWING_ENABLED_START_BIT_POSITION = 59; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - uint256 internal constant EMODE_CATEGORY_START_BIT_POSITION = 168; - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_EMODE_CATEGORY = 255; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables stable rate borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the stable rate borrowing needs to be enabled, false otherwise - */ - function setStableRateBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & STABLE_BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << STABLE_BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the stable rate borrowing state of the reserve - * @param self The reserve configuration - * @return The stable rate borrowing state - */ - function getStableRateBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~STABLE_BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the eMode asset category - * @param self The reserve configuration - * @param category The asset category when the user selects the eMode - */ - function setEModeCategory( - DataTypes.ReserveConfigurationMap memory self, - uint256 category - ) internal pure { - require(category <= MAX_VALID_EMODE_CATEGORY, Errors.INVALID_EMODE_CATEGORY); - - self.data = (self.data & EMODE_CATEGORY_MASK) | (category << EMODE_CATEGORY_START_BIT_POSITION); - } - - /** - * @dev Gets the eMode asset category - * @param self The reserve configuration - * @return The eMode category for the asset - */ - function getEModeCategory( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing stableRateBorrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~STABLE_BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - * @return The state param representing eMode category - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION, - (dataLocal & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol - -/** - * @title InitializableUpgradeabilityProxy - * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing - * implementation and init data. - */ -contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { - /** - * @dev Contract initializer. - * @param _logic Address of the initial implementation. - * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. - */ - function initialize(address _logic, bytes memory _data) public payable { - require(_implementation() == address(0)); - assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); - _setImplementation(_logic); - if (_data.length > 0) { - (bool success, ) = _logic.delegatecall(_data); - require(success); - } - } -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol - -/** - * @title BaseImmutableAdminUpgradeabilityProxy - * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern - * @notice This contract combines an upgradeability proxy with an authorization - * mechanism for administrative tasks. - * @dev The admin role is stored in an immutable, which helps saving transactions costs - * All external functions in this contract must be guarded by the - * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity - * feature proposal that would enable this to be done automatically. - */ -contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - address internal immutable _admin; - - /** - * @dev Constructor. - * @param admin_ The address of the admin - */ - constructor(address admin_) { - _admin = admin_; - } - - modifier ifAdmin() { - if (msg.sender == _admin) { - _; - } else { - _fallback(); - } - } - - /** - * @notice Return the admin address - * @return The address of the proxy admin. - */ - function admin() external ifAdmin returns (address) { - return _admin; - } - - /** - * @notice Return the implementation address - * @return The address of the implementation. - */ - function implementation() external ifAdmin returns (address) { - return _implementation(); - } - - /** - * @notice Upgrade the backing implementation of the proxy. - * @dev Only the admin can call this function. - * @param newImplementation The address of the new implementation. - */ - function upgradeTo(address newImplementation) external ifAdmin { - _upgradeTo(newImplementation); - } - - /** - * @notice Upgrade the backing implementation of the proxy and call a function - * on the new implementation. - * @dev This is useful to initialize the proxied contract. - * @param newImplementation The address of the new implementation. - * @param data Data to send as msg.data in the low level call. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - */ - function upgradeToAndCall( - address newImplementation, - bytes calldata data - ) external payable ifAdmin { - _upgradeTo(newImplementation); - (bool success, ) = newImplementation.delegatecall(data); - require(success); - } - - /** - * @notice Only fall back when the sender is not the admin. - */ - function _willFallback() internal virtual override { - require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); - super._willFallback(); - } -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol - -/** - * @title InitializableAdminUpgradeabilityProxy - * @author Aave - * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function - */ -contract InitializableImmutableAdminUpgradeabilityProxy is - BaseImmutableAdminUpgradeabilityProxy, - InitializableUpgradeabilityProxy -{ - /** - * @dev Constructor. - * @param admin The address of the admin - */ - constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { - // Intentionally left blank - } - - /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy - function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { - BaseImmutableAdminUpgradeabilityProxy._willFallback(); - } -} - -// downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/logic/ConfiguratorLogic.sol - -/** - * @title ConfiguratorLogic library - * @author Aave - * @notice Implements the functions to initialize reserves and update aTokens and debtTokens - */ -library ConfiguratorLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPoolConfigurator` for descriptions - event ReserveInitialized( - address indexed asset, - address indexed aToken, - address stableDebtToken, - address variableDebtToken, - address interestRateStrategyAddress - ); - event ATokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - event StableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - event VariableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @notice Initialize a reserve by creating and initializing aToken, stable debt token and variable debt token - * @dev Emits the `ReserveInitialized` event - * @param pool The Pool in which the reserve will be initialized - * @param input The needed parameters for the initialization - */ - function executeInitReserve( - IPool pool, - ConfiguratorInputTypes.InitReserveInput calldata input - ) external { - // It is an assumption that the asset listed is non-malicious, and the external call doesn't create re-entrancies - uint8 underlyingAssetDecimals = IERC20Detailed(input.underlyingAsset).decimals(); - require(underlyingAssetDecimals > 5, Errors.INVALID_DECIMALS); - - address aTokenProxyAddress = _initTokenWithProxy( - input.aTokenImpl, - abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - pool, - input.treasury, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.aTokenName, - input.aTokenSymbol, - input.params - ) - ); - - address stableDebtTokenProxyAddress = _initTokenWithProxy( - input.stableDebtTokenImpl, - abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - pool, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.stableDebtTokenName, - input.stableDebtTokenSymbol, - input.params - ) - ); - - address variableDebtTokenProxyAddress = _initTokenWithProxy( - input.variableDebtTokenImpl, - abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - pool, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.variableDebtTokenName, - input.variableDebtTokenSymbol, - input.params - ) - ); - - pool.initReserve( - input.underlyingAsset, - aTokenProxyAddress, - stableDebtTokenProxyAddress, - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - - DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); - - currentConfig.setDecimals(underlyingAssetDecimals); - - currentConfig.setActive(true); - currentConfig.setPaused(false); - currentConfig.setFrozen(false); - currentConfig.setVirtualAccActive(input.useVirtualBalance); - - pool.setConfiguration(input.underlyingAsset, currentConfig); - - IReserveInterestRateStrategy(input.interestRateStrategyAddress).setInterestRateParams( - input.underlyingAsset, - input.interestRateData - ); - - emit ReserveInitialized( - input.underlyingAsset, - aTokenProxyAddress, - stableDebtTokenProxyAddress, - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - } - - /** - * @notice Updates the aToken implementation and initializes it - * @dev Emits the `ATokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the aToken - * @param input The parameters needed for the initialize call - */ - function executeUpdateAToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateATokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - cachedPool, - input.treasury, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); - - emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); - } - - /** - * @notice Updates the stable debt token implementation and initializes it - * @dev Emits the `StableDebtTokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the stable debt token - * @param input The parameters needed for the initialize call - */ - function executeUpdateStableDebtToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - cachedPool, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation( - reserveData.stableDebtTokenAddress, - input.implementation, - encodedCall - ); - - emit StableDebtTokenUpgraded( - input.asset, - reserveData.stableDebtTokenAddress, - input.implementation - ); - } - - /** - * @notice Updates the variable debt token implementation and initializes it - * @dev Emits the `VariableDebtTokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the variable debt token - * @param input The parameters needed for the initialize call - */ - function executeUpdateVariableDebtToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - cachedPool, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation( - reserveData.variableDebtTokenAddress, - input.implementation, - encodedCall - ); - - emit VariableDebtTokenUpgraded( - input.asset, - reserveData.variableDebtTokenAddress, - input.implementation - ); - } - - /** - * @notice Creates a new proxy and initializes the implementation - * @param implementation The address of the implementation - * @param initParams The parameters that is passed to the implementation to initialize - * @return The address of initialized proxy - */ - function _initTokenWithProxy( - address implementation, - bytes memory initParams - ) internal returns (address) { - InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( - address(this) - ); - - proxy.initialize(implementation, initParams); - - return address(proxy); - } - - /** - * @notice Upgrades the implementation and makes call to the proxy - * @dev The call is used to initialize the new implementation. - * @param proxyAddress The address of the proxy - * @param implementation The address of the new implementation - * @param initParams The parameters to the call after the upgrade - */ - function _upgradeTokenImplementation( - address proxyAddress, - address implementation, - bytes memory initParams - ) internal { - InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( - payable(proxyAddress) - ); - - proxy.upgradeToAndCall(implementation, initParams); - } -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol deleted file mode 100644 index aec817cb..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import './Proxy.sol'; -import '../contracts/Address.sol'; - -/** - * @title BaseUpgradeabilityProxy - * @dev This contract implements a proxy that allows to change the - * implementation address to which it will delegate. - * Such a change is called an implementation upgrade. - */ -contract BaseUpgradeabilityProxy is Proxy { - /** - * @dev Emitted when the implementation is upgraded. - * @param implementation Address of the new implementation. - */ - event Upgraded(address indexed implementation); - - /** - * @dev Storage slot with the address of the current implementation. - * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant IMPLEMENTATION_SLOT = - 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /** - * @dev Returns the current implementation. - * @return impl Address of the current implementation - */ - function _implementation() internal view override returns (address impl) { - bytes32 slot = IMPLEMENTATION_SLOT; - //solium-disable-next-line - assembly { - impl := sload(slot) - } - } - - /** - * @dev Upgrades the proxy to a new implementation. - * @param newImplementation Address of the new implementation. - */ - function _upgradeTo(address newImplementation) internal { - _setImplementation(newImplementation); - emit Upgraded(newImplementation); - } - - /** - * @dev Sets the implementation address of the proxy. - * @param newImplementation Address of the new implementation. - */ - function _setImplementation(address newImplementation) internal { - require( - Address.isContract(newImplementation), - 'Cannot set a proxy implementation to a non-contract address' - ); - - bytes32 slot = IMPLEMENTATION_SLOT; - - //solium-disable-next-line - assembly { - sstore(slot, newImplementation) - } - } -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol deleted file mode 100644 index 4b43fa6a..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import './BaseUpgradeabilityProxy.sol'; - -/** - * @title InitializableUpgradeabilityProxy - * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing - * implementation and init data. - */ -contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { - /** - * @dev Contract initializer. - * @param _logic Address of the initial implementation. - * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. - */ - function initialize(address _logic, bytes memory _data) public payable { - require(_implementation() == address(0)); - assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); - _setImplementation(_logic); - if (_data.length > 0) { - (bool success, ) = _logic.delegatecall(_data); - require(success); - } - } -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol deleted file mode 100644 index 53589441..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol +++ /dev/null @@ -1,81 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title Proxy - * @dev Implements delegation of calls to other contracts, with proper - * forwarding of return values and bubbling of failures. - * It defines a fallback function that delegates all calls to the address - * returned by the abstract _implementation() internal function. - */ -abstract contract Proxy { - /** - * @dev Fallback function. - * Will run if no other function in the contract matches the call data. - * Implemented entirely in `_fallback`. - */ - fallback() external payable { - _fallback(); - } - - /** - * @dev Fallback function that will run if call data is empty. - * IMPORTANT. receive() on implementation contracts will be unreachable - */ - receive() external payable { - _fallback(); - } - - /** - * @return The Address of the implementation. - */ - function _implementation() internal view virtual returns (address); - - /** - * @dev Delegates execution to an implementation contract. - * This is a low level function that doesn't return to its internal call site. - * It will return to the external caller whatever the implementation returns. - * @param implementation Address to delegate. - */ - function _delegate(address implementation) internal { - //solium-disable-next-line - assembly { - // Copy msg.data. We take full control of memory in this inline assembly - // block because it will not return to Solidity code. We overwrite the - // Solidity scratch pad at memory position 0. - calldatacopy(0, 0, calldatasize()) - - // Call the implementation. - // out and outsize are 0 because we don't know the size yet. - let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) - - // Copy the returned data. - returndatacopy(0, 0, returndatasize()) - - switch result - // delegatecall returns 0 on error. - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } - } - } - - /** - * @dev Function that is run as the first thing in the fallback function. - * Can be redefined in derived contracts to add functionality. - * Redefinitions must call super._willFallback(). - */ - function _willFallback() internal virtual {} - - /** - * @dev fallback implementation. - * Extracted to enable manual triggering. - */ - function _fallback() internal { - _willFallback(); - _delegate(_implementation()); - } -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPool.sol deleted file mode 100644 index 4e49aa40..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,835 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on swapBorrowRateMode() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user swapping his rate mode - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - */ - event SwapBorrowRateMode( - address indexed reserve, - address indexed user, - DataTypes.InterestRateMode interestRateMode - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on rebalanceStableBorrowRate() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user for which the rebalance has been executed - */ - event RebalanceStableBorrowRate(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the - * corresponding debt token (StableDebtToken or VariableDebtToken) - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 stable/variable debt tokens, depending on the `interestRateMode` - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa - * @param asset The address of the underlying asset borrowed - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - */ - function swapBorrowRateMode(address asset, uint256 interestRateMode) external; - - /** - * @notice Permissionless method which allows anyone to swap a users stable debt to variable debt - * @dev Introduced in favor of stable rate deprecation - * @param asset The address of the underlying asset borrowed - * @param user The address of the user whose debt will be swapped from stable to variable - */ - function swapToVariable(address asset, address user) external; - - /** - * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. - * - Users can be rebalanced if the following conditions are satisfied: - * 1. Usage ratio is above 95% - * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too - * much has been borrowed at a stable rate and suppliers are not earning enough - * @param asset The address of the underlying asset borrowed - * @param user The address of the user to be rebalanced - */ - function rebalanceStableBorrowRate(address asset, address user) external; - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address stableDebtAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new category for the eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; - - /** - * @notice Returns the data of an eMode category - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate - * @return The percentage of available liquidity to borrow, expressed in bps - */ - function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external returns (address); -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index cdd81565..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return stableBorrowRate The stable borrow rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256, uint256); -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol deleted file mode 100644 index 06d2f827..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {BaseUpgradeabilityProxy} from '../../../dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol'; - -/** - * @title BaseImmutableAdminUpgradeabilityProxy - * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern - * @notice This contract combines an upgradeability proxy with an authorization - * mechanism for administrative tasks. - * @dev The admin role is stored in an immutable, which helps saving transactions costs - * All external functions in this contract must be guarded by the - * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity - * feature proposal that would enable this to be done automatically. - */ -contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - address internal immutable _admin; - - /** - * @dev Constructor. - * @param admin_ The address of the admin - */ - constructor(address admin_) { - _admin = admin_; - } - - modifier ifAdmin() { - if (msg.sender == _admin) { - _; - } else { - _fallback(); - } - } - - /** - * @notice Return the admin address - * @return The address of the proxy admin. - */ - function admin() external ifAdmin returns (address) { - return _admin; - } - - /** - * @notice Return the implementation address - * @return The address of the implementation. - */ - function implementation() external ifAdmin returns (address) { - return _implementation(); - } - - /** - * @notice Upgrade the backing implementation of the proxy. - * @dev Only the admin can call this function. - * @param newImplementation The address of the new implementation. - */ - function upgradeTo(address newImplementation) external ifAdmin { - _upgradeTo(newImplementation); - } - - /** - * @notice Upgrade the backing implementation of the proxy and call a function - * on the new implementation. - * @dev This is useful to initialize the proxied contract. - * @param newImplementation The address of the new implementation. - * @param data Data to send as msg.data in the low level call. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - */ - function upgradeToAndCall( - address newImplementation, - bytes calldata data - ) external payable ifAdmin { - _upgradeTo(newImplementation); - (bool success, ) = newImplementation.delegatecall(data); - require(success); - } - - /** - * @notice Only fall back when the sender is not the admin. - */ - function _willFallback() internal virtual override { - require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); - super._willFallback(); - } -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol deleted file mode 100644 index 0deceb5b..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {InitializableUpgradeabilityProxy} from '../../../dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol'; -import {Proxy} from '../../../dependencies/openzeppelin/upgradeability/Proxy.sol'; -import {BaseImmutableAdminUpgradeabilityProxy} from './BaseImmutableAdminUpgradeabilityProxy.sol'; - -/** - * @title InitializableAdminUpgradeabilityProxy - * @author Aave - * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function - */ -contract InitializableImmutableAdminUpgradeabilityProxy is - BaseImmutableAdminUpgradeabilityProxy, - InitializableUpgradeabilityProxy -{ - /** - * @dev Constructor. - * @param admin The address of the admin - */ - constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { - // Intentionally left blank - } - - /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy - function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { - BaseImmutableAdminUpgradeabilityProxy._willFallback(); - } -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 0408f3ce..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,640 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant STABLE_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant EMODE_CATEGORY_MASK = 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant STABLE_BORROWING_ENABLED_START_BIT_POSITION = 59; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - uint256 internal constant EMODE_CATEGORY_START_BIT_POSITION = 168; - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_EMODE_CATEGORY = 255; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables stable rate borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the stable rate borrowing needs to be enabled, false otherwise - */ - function setStableRateBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & STABLE_BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << STABLE_BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the stable rate borrowing state of the reserve - * @param self The reserve configuration - * @return The stable rate borrowing state - */ - function getStableRateBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~STABLE_BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the eMode asset category - * @param self The reserve configuration - * @param category The asset category when the user selects the eMode - */ - function setEModeCategory( - DataTypes.ReserveConfigurationMap memory self, - uint256 category - ) internal pure { - require(category <= MAX_VALID_EMODE_CATEGORY, Errors.INVALID_EMODE_CATEGORY); - - self.data = (self.data & EMODE_CATEGORY_MASK) | (category << EMODE_CATEGORY_START_BIT_POSITION); - } - - /** - * @dev Gets the eMode asset category - * @param self The reserve configuration - * @return The eMode category for the asset - */ - function getEModeCategory( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing stableRateBorrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~STABLE_BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - * @return The state param representing eMode category - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION, - (dataLocal & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index 36b75308..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,108 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/logic/ConfiguratorLogic.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/logic/ConfiguratorLogic.sol deleted file mode 100644 index 01580d9e..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/logic/ConfiguratorLogic.sol +++ /dev/null @@ -1,281 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IPool} from '../../../interfaces/IPool.sol'; -import {IInitializableAToken} from '../../../interfaces/IInitializableAToken.sol'; -import {IInitializableDebtToken} from '../../../interfaces/IInitializableDebtToken.sol'; -import {InitializableImmutableAdminUpgradeabilityProxy} from '../aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {ConfiguratorInputTypes} from '../types/ConfiguratorInputTypes.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; - -/** - * @title ConfiguratorLogic library - * @author Aave - * @notice Implements the functions to initialize reserves and update aTokens and debtTokens - */ -library ConfiguratorLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPoolConfigurator` for descriptions - event ReserveInitialized( - address indexed asset, - address indexed aToken, - address stableDebtToken, - address variableDebtToken, - address interestRateStrategyAddress - ); - event ATokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - event StableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - event VariableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @notice Initialize a reserve by creating and initializing aToken, stable debt token and variable debt token - * @dev Emits the `ReserveInitialized` event - * @param pool The Pool in which the reserve will be initialized - * @param input The needed parameters for the initialization - */ - function executeInitReserve( - IPool pool, - ConfiguratorInputTypes.InitReserveInput calldata input - ) external { - // It is an assumption that the asset listed is non-malicious, and the external call doesn't create re-entrancies - uint8 underlyingAssetDecimals = IERC20Detailed(input.underlyingAsset).decimals(); - require(underlyingAssetDecimals > 5, Errors.INVALID_DECIMALS); - - address aTokenProxyAddress = _initTokenWithProxy( - input.aTokenImpl, - abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - pool, - input.treasury, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.aTokenName, - input.aTokenSymbol, - input.params - ) - ); - - address stableDebtTokenProxyAddress = _initTokenWithProxy( - input.stableDebtTokenImpl, - abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - pool, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.stableDebtTokenName, - input.stableDebtTokenSymbol, - input.params - ) - ); - - address variableDebtTokenProxyAddress = _initTokenWithProxy( - input.variableDebtTokenImpl, - abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - pool, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.variableDebtTokenName, - input.variableDebtTokenSymbol, - input.params - ) - ); - - pool.initReserve( - input.underlyingAsset, - aTokenProxyAddress, - stableDebtTokenProxyAddress, - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - - DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); - - currentConfig.setDecimals(underlyingAssetDecimals); - - currentConfig.setActive(true); - currentConfig.setPaused(false); - currentConfig.setFrozen(false); - currentConfig.setVirtualAccActive(input.useVirtualBalance); - - pool.setConfiguration(input.underlyingAsset, currentConfig); - - IReserveInterestRateStrategy(input.interestRateStrategyAddress).setInterestRateParams( - input.underlyingAsset, - input.interestRateData - ); - - emit ReserveInitialized( - input.underlyingAsset, - aTokenProxyAddress, - stableDebtTokenProxyAddress, - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - } - - /** - * @notice Updates the aToken implementation and initializes it - * @dev Emits the `ATokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the aToken - * @param input The parameters needed for the initialize call - */ - function executeUpdateAToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateATokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - cachedPool, - input.treasury, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); - - emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); - } - - /** - * @notice Updates the stable debt token implementation and initializes it - * @dev Emits the `StableDebtTokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the stable debt token - * @param input The parameters needed for the initialize call - */ - function executeUpdateStableDebtToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - cachedPool, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation( - reserveData.stableDebtTokenAddress, - input.implementation, - encodedCall - ); - - emit StableDebtTokenUpgraded( - input.asset, - reserveData.stableDebtTokenAddress, - input.implementation - ); - } - - /** - * @notice Updates the variable debt token implementation and initializes it - * @dev Emits the `VariableDebtTokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the variable debt token - * @param input The parameters needed for the initialize call - */ - function executeUpdateVariableDebtToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - cachedPool, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation( - reserveData.variableDebtTokenAddress, - input.implementation, - encodedCall - ); - - emit VariableDebtTokenUpgraded( - input.asset, - reserveData.variableDebtTokenAddress, - input.implementation - ); - } - - /** - * @notice Creates a new proxy and initializes the implementation - * @param implementation The address of the implementation - * @param initParams The parameters that is passed to the implementation to initialize - * @return The address of initialized proxy - */ - function _initTokenWithProxy( - address implementation, - bytes memory initParams - ) internal returns (address) { - InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( - address(this) - ); - - proxy.initialize(implementation, initParams); - - return address(proxy); - } - - /** - * @notice Upgrades the implementation and makes call to the proxy - * @dev The call is used to initialize the new implementation. - * @param proxyAddress The address of the proxy - * @param implementation The address of the new implementation - * @param initParams The parameters to the call after the upgrade - */ - function _upgradeTokenImplementation( - address proxyAddress, - address implementation, - bytes memory initParams - ) internal { - InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( - payable(proxyAddress) - ); - - proxy.upgradeToAndCall(implementation, initParams); - } -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol deleted file mode 100644 index 7a80594e..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library ConfiguratorInputTypes { - struct InitReserveInput { - address aTokenImpl; - address stableDebtTokenImpl; - address variableDebtTokenImpl; - bool useVirtualBalance; - address interestRateStrategyAddress; - address underlyingAsset; - address treasury; - address incentivesController; - string aTokenName; - string aTokenSymbol; - string variableDebtTokenName; - string variableDebtTokenSymbol; - string stableDebtTokenName; - string stableDebtTokenSymbol; - bytes params; - bytes interestRateData; - } - - struct UpdateATokenInput { - address asset; - address treasury; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } - - struct UpdateDebtTokenInput { - address asset; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } -} diff --git a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 64f3e891..00000000 --- a/downloads/ARBITRUM/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/core/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - //the current stable borrow rate. Expressed in ray - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - //stableDebtToken address - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - //the current stable borrow rate. Expressed in ray - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - //stableDebtToken address - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // each eMode category may or may not have a custom oracle to override the individual assets price oracles - address priceSource; - string label; - } - - enum InterestRateMode { - NONE, - STABLE, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currPrincipalStableDebt; - uint256 currAvgStableBorrowRate; - uint256 currTotalStableDebt; - uint256 nextAvgStableBorrowRate; - uint256 nextTotalStableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address stableDebtTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - uint40 stableDebtLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 maxStableLoanPercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalStableDebt; - uint256 totalVariableDebt; - uint256 averageStableBorrowRate; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address stableDebtAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL.sol deleted file mode 100644 index efb0fd4a..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL.sol +++ /dev/null @@ -1,3210 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity =0.8.10 ^0.8.0; - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - //the current stable borrow rate. Expressed in ray - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - //stableDebtToken address - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62-63: reserved - //bit 64-79: reserve factor - //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167 liquidation protocol fee - //bit 168-175 eMode category - //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // each eMode category may or may not have a custom oracle to override the individual assets price oracles - address priceSource; - string label; - } - - enum InterestRateMode { - NONE, - STABLE, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currPrincipalStableDebt; - uint256 currAvgStableBorrowRate; - uint256 currTotalStableDebt; - uint256 nextAvgStableBorrowRate; - uint256 nextTotalStableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address stableDebtTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - uint40 stableDebtLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address addressesProvider; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 maxStableLoanPercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalStableDebt; - uint256 totalVariableDebt; - uint256 averageStableBorrowRate; - uint256 reserveFactor; - address reserve; - address aToken; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address stableDebtAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol - -/** - * @title EIP712Base - * @author Aave - * @notice Base contract implementation of EIP712. - */ -abstract contract EIP712Base { - bytes public constant EIP712_REVISION = bytes('1'); - bytes32 internal constant EIP712_DOMAIN = - keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); - - // Map of address nonces (address => nonce) - mapping(address => uint256) internal _nonces; - - bytes32 internal _domainSeparator; - uint256 internal immutable _chainId; - - /** - * @dev Constructor. - */ - constructor() { - _chainId = block.chainid; - } - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { - if (block.chainid == _chainId) { - return _domainSeparator; - } - return _calculateDomainSeparator(); - } - - /** - * @notice Returns the nonce value for address specified as parameter - * @param owner The address for which the nonce is being returned - * @return The nonce value for the input address` - */ - function nonces(address owner) public view virtual returns (uint256) { - return _nonces[owner]; - } - - /** - * @notice Compute the current domain separator - * @return The domain separator for the token - */ - function _calculateDomainSeparator() internal view returns (bytes32) { - return - keccak256( - abi.encode( - EIP712_DOMAIN, - keccak256(bytes(_EIP712BaseId())), - keccak256(EIP712_REVISION), - block.chainid, - address(this) - ) - ); - } - - /** - * @notice Returns the user readable name of signing domain (e.g. token name) - * @return The name of the signing domain - */ - function _EIP712BaseId() internal view virtual returns (string memory); -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on swapBorrowRateMode() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user swapping his rate mode - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - */ - event SwapBorrowRateMode( - address indexed reserve, - address indexed user, - DataTypes.InterestRateMode interestRateMode - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on rebalanceStableBorrowRate() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user for which the rebalance has been executed - */ - event RebalanceStableBorrowRate(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the - * corresponding debt token (StableDebtToken or VariableDebtToken) - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 stable/variable debt tokens, depending on the `interestRateMode` - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa - * @param asset The address of the underlying asset borrowed - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - */ - function swapBorrowRateMode(address asset, uint256 interestRateMode) external; - - /** - * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. - * - Users can be rebalanced if the following conditions are satisfied: - * 1. Usage ratio is above 95% - * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too - * much has been borrowed at a stable rate and suppliers are not earning enough - * @param asset The address of the underlying asset borrowed - * @param user The address of the user to be rebalanced - */ - function rebalanceStableBorrowRate(address asset, address user) external; - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address stableDebtAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new category for the eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; - - /** - * @notice Returns the data of an eMode category - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate - * @return The percentage of available liquidity to borrow, expressed in bps - */ - function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. StableDebtTokens use - * this field to store the user's stable rate. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor(IPool pool, string memory name, string memory symbol, uint8 decimals) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name; - _symbol = symbol; - _decimals = decimals; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol - -/** - * @title MintableIncentivizedERC20 - * @author Aave - * @notice Implements mint and burn functions for IncentivizedERC20 - */ -abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) IncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /** - * @notice Mints tokens to an account and apply incentives if defined - * @param account The address receiving tokens - * @param amount The amount of tokens to mint - */ - function _mint(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply + amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } - - /** - * @notice Burns tokens from an account and apply incentives if defined - * @param account The account whose tokens are burnt - * @param amount The amount of tokens to burn - */ - function _burn(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply - amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance - amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol - -/** - * @title ScaledBalanceTokenBase - * @author Aave - * @notice Basic ERC20 implementation of scaled balance token - */ -abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) MintableIncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /// @inheritdoc IScaledBalanceToken - function scaledBalanceOf(address user) external view override returns (uint256) { - return super.balanceOf(user); - } - - /// @inheritdoc IScaledBalanceToken - function getScaledUserBalanceAndSupply( - address user - ) external view override returns (uint256, uint256) { - return (super.balanceOf(user), super.totalSupply()); - } - - /// @inheritdoc IScaledBalanceToken - function scaledTotalSupply() public view virtual override returns (uint256) { - return super.totalSupply(); - } - - /// @inheritdoc IScaledBalanceToken - function getPreviousIndex(address user) external view virtual override returns (uint256) { - return _userState[user].additionalData; - } - - /** - * @notice Implements the basic logic to mint a scaled balance token. - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the scaled tokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function _mintScaled( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) internal returns (bool) { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); - - uint256 scaledBalance = super.balanceOf(onBehalfOf); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[onBehalfOf].additionalData); - - _userState[onBehalfOf].additionalData = index.toUint128(); - - _mint(onBehalfOf, amountScaled.toUint128()); - - uint256 amountToMint = amount + balanceIncrease; - emit Transfer(address(0), onBehalfOf, amountToMint); - emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); - - return (scaledBalance == 0); - } - - /** - * @notice Implements the basic logic to burn a scaled balance token. - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param user The user which debt is burnt - * @param target The address that will receive the underlying, if any - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - */ - function _burnScaled(address user, address target, uint256 amount, uint256 index) internal { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); - - uint256 scaledBalance = super.balanceOf(user); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[user].additionalData); - - _userState[user].additionalData = index.toUint128(); - - _burn(user, amountScaled.toUint128()); - - if (balanceIncrease > amount) { - uint256 amountToMint = balanceIncrease - amount; - emit Transfer(address(0), user, amountToMint); - emit Mint(user, user, amountToMint, balanceIncrease, index); - } else { - uint256 amountToBurn = amount - balanceIncrease; - emit Transfer(user, address(0), amountToBurn); - emit Burn(user, target, amountToBurn, balanceIncrease, index); - } - } - - /** - * @notice Implements the basic logic to transfer scaled balance tokens between two users - * @dev It emits a mint event with the interest accrued per user - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - * @param index The next liquidity index of the reserve - */ - function _transfer(address sender, address recipient, uint256 amount, uint256 index) internal { - uint256 senderScaledBalance = super.balanceOf(sender); - uint256 senderBalanceIncrease = senderScaledBalance.rayMul(index) - - senderScaledBalance.rayMul(_userState[sender].additionalData); - - uint256 recipientScaledBalance = super.balanceOf(recipient); - uint256 recipientBalanceIncrease = recipientScaledBalance.rayMul(index) - - recipientScaledBalance.rayMul(_userState[recipient].additionalData); - - _userState[sender].additionalData = index.toUint128(); - _userState[recipient].additionalData = index.toUint128(); - - super._transfer(sender, recipient, amount.rayDiv(index).toUint128()); - - if (senderBalanceIncrease > 0) { - emit Transfer(address(0), sender, senderBalanceIncrease); - emit Mint(_msgSender(), sender, senderBalanceIncrease, senderBalanceIncrease, index); - } - - if (sender != recipient && recipientBalanceIncrease > 0) { - emit Transfer(address(0), recipient, recipientBalanceIncrease); - emit Mint(_msgSender(), recipient, recipientBalanceIncrease, recipientBalanceIncrease, index); - } - - emit Transfer(sender, recipient, amount); - } -} - -// downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol - -/** - * @title Aave ERC20 AToken - * @author Aave - * @notice Implementation of the interest bearing token for the Aave protocol - */ -contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, IAToken { - using WadRayMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - - bytes32 public constant PERMIT_TYPEHASH = - keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); - - uint256 public constant ATOKEN_REVISION = 0x2; - - address internal _treasury; - address internal _underlyingAsset; - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return ATOKEN_REVISION; - } - - /** - * @dev Constructor. - * @param pool The address of the Pool contract - */ - constructor( - IPool pool - ) ScaledBalanceTokenBase(pool, 'ATOKEN_IMPL', 'ATOKEN_IMPL', 0) EIP712Base() { - // Intentionally left blank - } - - /// @inheritdoc IInitializableAToken - function initialize( - IPool initializingPool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) public virtual override initializer { - require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); - _setName(aTokenName); - _setSymbol(aTokenSymbol); - _setDecimals(aTokenDecimals); - - _treasury = treasury; - _underlyingAsset = underlyingAsset; - _incentivesController = incentivesController; - - _domainSeparator = _calculateDomainSeparator(); - - emit Initialized( - underlyingAsset, - address(POOL), - treasury, - address(incentivesController), - aTokenDecimals, - aTokenName, - aTokenSymbol, - params - ); - } - - /// @inheritdoc IAToken - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external virtual override onlyPool returns (bool) { - return _mintScaled(caller, onBehalfOf, amount, index); - } - - /// @inheritdoc IAToken - function burn( - address from, - address receiverOfUnderlying, - uint256 amount, - uint256 index - ) external virtual override onlyPool { - _burnScaled(from, receiverOfUnderlying, amount, index); - if (receiverOfUnderlying != address(this)) { - IERC20(_underlyingAsset).safeTransfer(receiverOfUnderlying, amount); - } - } - - /// @inheritdoc IAToken - function mintToTreasury(uint256 amount, uint256 index) external virtual override onlyPool { - if (amount == 0) { - return; - } - _mintScaled(address(POOL), _treasury, amount, index); - } - - /// @inheritdoc IAToken - function transferOnLiquidation( - address from, - address to, - uint256 value - ) external virtual override onlyPool { - // Being a normal transfer, the Transfer() and BalanceTransfer() are emitted - // so no need to emit a specific event here - _transfer(from, to, value, false); - } - - /// @inheritdoc IERC20 - function balanceOf( - address user - ) public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { - return super.balanceOf(user).rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { - uint256 currentSupplyScaled = super.totalSupply(); - - if (currentSupplyScaled == 0) { - return 0; - } - - return currentSupplyScaled.rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); - } - - /// @inheritdoc IAToken - function RESERVE_TREASURY_ADDRESS() external view override returns (address) { - return _treasury; - } - - /// @inheritdoc IAToken - function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { - return _underlyingAsset; - } - - /// @inheritdoc IAToken - function transferUnderlyingTo(address target, uint256 amount) external virtual override onlyPool { - IERC20(_underlyingAsset).safeTransfer(target, amount); - } - - /// @inheritdoc IAToken - function handleRepayment( - address user, - address onBehalfOf, - uint256 amount - ) external virtual override onlyPool { - // Intentionally left blank - } - - /// @inheritdoc IAToken - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external override { - require(owner != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - //solium-disable-next-line - require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); - uint256 currentValidNonce = _nonces[owner]; - bytes32 digest = keccak256( - abi.encodePacked( - '\x19\x01', - DOMAIN_SEPARATOR(), - keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentValidNonce, deadline)) - ) - ); - require(owner == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); - _nonces[owner] = currentValidNonce + 1; - _approve(owner, spender, value); - } - - /** - * @notice Transfers the aTokens between two users. Validates the transfer - * (ie checks for valid HF after the transfer) if required - * @param from The source address - * @param to The destination address - * @param amount The amount getting transferred - * @param validate True if the transfer needs to be validated, false otherwise - */ - function _transfer(address from, address to, uint256 amount, bool validate) internal virtual { - address underlyingAsset = _underlyingAsset; - - uint256 index = POOL.getReserveNormalizedIncome(underlyingAsset); - - uint256 fromBalanceBefore = super.balanceOf(from).rayMul(index); - uint256 toBalanceBefore = super.balanceOf(to).rayMul(index); - - super._transfer(from, to, amount, index); - - if (validate) { - POOL.finalizeTransfer(underlyingAsset, from, to, amount, fromBalanceBefore, toBalanceBefore); - } - - emit BalanceTransfer(from, to, amount.rayDiv(index), index); - } - - /** - * @notice Overrides the parent _transfer to force validated transfer() and transferFrom() - * @param from The source address - * @param to The destination address - * @param amount The amount getting transferred - */ - function _transfer(address from, address to, uint128 amount) internal virtual override { - _transfer(from, to, amount, true); - } - - /** - * @dev Overrides the base function to fully implement IAToken - * @dev see `EIP712Base.DOMAIN_SEPARATOR()` for more detailed documentation - */ - function DOMAIN_SEPARATOR() public view override(IAToken, EIP712Base) returns (bytes32) { - return super.DOMAIN_SEPARATOR(); - } - - /** - * @dev Overrides the base function to fully implement IAToken - * @dev see `EIP712Base.nonces()` for more detailed documentation - */ - function nonces(address owner) public view override(IAToken, EIP712Base) returns (uint256) { - return super.nonces(owner); - } - - /// @inheritdoc EIP712Base - function _EIP712BaseId() internal view override returns (string memory) { - return name(); - } - - /// @inheritdoc IAToken - function rescueTokens(address token, address to, uint256 amount) external override onlyPoolAdmin { - require(token != _underlyingAsset, Errors.UNDERLYING_CANNOT_BE_RESCUED); - IERC20(token).safeTransfer(to, amount); - } -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index c58fdb09..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity 0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 445ee640..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 1d470e01..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index 6303454f..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index 6d708093..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity 0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol deleted file mode 100644 index d5d97ceb..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAToken.sol deleted file mode 100644 index 1379dff6..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index c06c605a..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index 0b16baa8..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPool.sol deleted file mode 100644 index ef306e73..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,737 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on swapBorrowRateMode() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user swapping his rate mode - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - */ - event SwapBorrowRateMode( - address indexed reserve, - address indexed user, - DataTypes.InterestRateMode interestRateMode - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on rebalanceStableBorrowRate() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user for which the rebalance has been executed - */ - event RebalanceStableBorrowRate(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the - * corresponding debt token (StableDebtToken or VariableDebtToken) - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 stable/variable debt tokens, depending on the `interestRateMode` - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa - * @param asset The address of the underlying asset borrowed - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - */ - function swapBorrowRateMode(address asset, uint256 interestRateMode) external; - - /** - * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. - * - Users can be rebalanced if the following conditions are satisfied: - * 1. Usage ratio is above 95% - * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too - * much has been borrowed at a stable rate and suppliers are not earning enough - * @param asset The address of the underlying asset borrowed - * @param user The address of the user to be rebalanced - */ - function rebalanceStableBorrowRate(address asset, address user) external; - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address stableDebtAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new category for the eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; - - /** - * @notice Returns the data of an eMode category - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate - * @return The percentage of available liquidity to borrow, expressed in bps - */ - function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index 587a0d0b..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index fe311fbb..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol deleted file mode 100644 index d24312bf..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index 990069e0..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 8589dc0a..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,264 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -library DataTypes { - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - //the current stable borrow rate. Expressed in ray - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - //stableDebtToken address - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62-63: reserved - //bit 64-79: reserve factor - //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167 liquidation protocol fee - //bit 168-175 eMode category - //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // each eMode category may or may not have a custom oracle to override the individual assets price oracles - address priceSource; - string label; - } - - enum InterestRateMode {NONE, STABLE, VARIABLE} - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currPrincipalStableDebt; - uint256 currAvgStableBorrowRate; - uint256 currTotalStableDebt; - uint256 nextAvgStableBorrowRate; - uint256 nextTotalStableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address stableDebtTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - uint40 stableDebtLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address addressesProvider; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 maxStableLoanPercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalStableDebt; - uint256 totalVariableDebt; - uint256 averageStableBorrowRate; - uint256 reserveFactor; - address reserve; - address aToken; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address stableDebtAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol deleted file mode 100644 index 845b09fd..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {VersionedInitializable} from '../libraries/aave-upgradeability/VersionedInitializable.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; -import {WadRayMath} from '../libraries/math/WadRayMath.sol'; -import {IPool} from '../../interfaces/IPool.sol'; -import {IAToken} from '../../interfaces/IAToken.sol'; -import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; -import {IInitializableAToken} from '../../interfaces/IInitializableAToken.sol'; -import {ScaledBalanceTokenBase} from './base/ScaledBalanceTokenBase.sol'; -import {IncentivizedERC20} from './base/IncentivizedERC20.sol'; -import {EIP712Base} from './base/EIP712Base.sol'; - -/** - * @title Aave ERC20 AToken - * @author Aave - * @notice Implementation of the interest bearing token for the Aave protocol - */ -contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, IAToken { - using WadRayMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - - bytes32 public constant PERMIT_TYPEHASH = - keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); - - uint256 public constant ATOKEN_REVISION = 0x2; - - address internal _treasury; - address internal _underlyingAsset; - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return ATOKEN_REVISION; - } - - /** - * @dev Constructor. - * @param pool The address of the Pool contract - */ - constructor( - IPool pool - ) ScaledBalanceTokenBase(pool, 'ATOKEN_IMPL', 'ATOKEN_IMPL', 0) EIP712Base() { - // Intentionally left blank - } - - /// @inheritdoc IInitializableAToken - function initialize( - IPool initializingPool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) public virtual override initializer { - require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); - _setName(aTokenName); - _setSymbol(aTokenSymbol); - _setDecimals(aTokenDecimals); - - _treasury = treasury; - _underlyingAsset = underlyingAsset; - _incentivesController = incentivesController; - - _domainSeparator = _calculateDomainSeparator(); - - emit Initialized( - underlyingAsset, - address(POOL), - treasury, - address(incentivesController), - aTokenDecimals, - aTokenName, - aTokenSymbol, - params - ); - } - - /// @inheritdoc IAToken - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external virtual override onlyPool returns (bool) { - return _mintScaled(caller, onBehalfOf, amount, index); - } - - /// @inheritdoc IAToken - function burn( - address from, - address receiverOfUnderlying, - uint256 amount, - uint256 index - ) external virtual override onlyPool { - _burnScaled(from, receiverOfUnderlying, amount, index); - if (receiverOfUnderlying != address(this)) { - IERC20(_underlyingAsset).safeTransfer(receiverOfUnderlying, amount); - } - } - - /// @inheritdoc IAToken - function mintToTreasury(uint256 amount, uint256 index) external virtual override onlyPool { - if (amount == 0) { - return; - } - _mintScaled(address(POOL), _treasury, amount, index); - } - - /// @inheritdoc IAToken - function transferOnLiquidation( - address from, - address to, - uint256 value - ) external virtual override onlyPool { - // Being a normal transfer, the Transfer() and BalanceTransfer() are emitted - // so no need to emit a specific event here - _transfer(from, to, value, false); - } - - /// @inheritdoc IERC20 - function balanceOf( - address user - ) public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { - return super.balanceOf(user).rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { - uint256 currentSupplyScaled = super.totalSupply(); - - if (currentSupplyScaled == 0) { - return 0; - } - - return currentSupplyScaled.rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); - } - - /// @inheritdoc IAToken - function RESERVE_TREASURY_ADDRESS() external view override returns (address) { - return _treasury; - } - - /// @inheritdoc IAToken - function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { - return _underlyingAsset; - } - - /// @inheritdoc IAToken - function transferUnderlyingTo(address target, uint256 amount) external virtual override onlyPool { - IERC20(_underlyingAsset).safeTransfer(target, amount); - } - - /// @inheritdoc IAToken - function handleRepayment( - address user, - address onBehalfOf, - uint256 amount - ) external virtual override onlyPool { - // Intentionally left blank - } - - /// @inheritdoc IAToken - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external override { - require(owner != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - //solium-disable-next-line - require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); - uint256 currentValidNonce = _nonces[owner]; - bytes32 digest = keccak256( - abi.encodePacked( - '\x19\x01', - DOMAIN_SEPARATOR(), - keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentValidNonce, deadline)) - ) - ); - require(owner == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); - _nonces[owner] = currentValidNonce + 1; - _approve(owner, spender, value); - } - - /** - * @notice Transfers the aTokens between two users. Validates the transfer - * (ie checks for valid HF after the transfer) if required - * @param from The source address - * @param to The destination address - * @param amount The amount getting transferred - * @param validate True if the transfer needs to be validated, false otherwise - */ - function _transfer(address from, address to, uint256 amount, bool validate) internal virtual { - address underlyingAsset = _underlyingAsset; - - uint256 index = POOL.getReserveNormalizedIncome(underlyingAsset); - - uint256 fromBalanceBefore = super.balanceOf(from).rayMul(index); - uint256 toBalanceBefore = super.balanceOf(to).rayMul(index); - - super._transfer(from, to, amount, index); - - if (validate) { - POOL.finalizeTransfer(underlyingAsset, from, to, amount, fromBalanceBefore, toBalanceBefore); - } - - emit BalanceTransfer(from, to, amount.rayDiv(index), index); - } - - /** - * @notice Overrides the parent _transfer to force validated transfer() and transferFrom() - * @param from The source address - * @param to The destination address - * @param amount The amount getting transferred - */ - function _transfer(address from, address to, uint128 amount) internal virtual override { - _transfer(from, to, amount, true); - } - - /** - * @dev Overrides the base function to fully implement IAToken - * @dev see `EIP712Base.DOMAIN_SEPARATOR()` for more detailed documentation - */ - function DOMAIN_SEPARATOR() public view override(IAToken, EIP712Base) returns (bytes32) { - return super.DOMAIN_SEPARATOR(); - } - - /** - * @dev Overrides the base function to fully implement IAToken - * @dev see `EIP712Base.nonces()` for more detailed documentation - */ - function nonces(address owner) public view override(IAToken, EIP712Base) returns (uint256) { - return super.nonces(owner); - } - - /// @inheritdoc EIP712Base - function _EIP712BaseId() internal view override returns (string memory) { - return name(); - } - - /// @inheritdoc IAToken - function rescueTokens(address token, address to, uint256 amount) external override onlyPoolAdmin { - require(token != _underlyingAsset, Errors.UNDERLYING_CANNOT_BE_RESCUED); - IERC20(token).safeTransfer(to, amount); - } -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol deleted file mode 100644 index afe9dd8b..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -/** - * @title EIP712Base - * @author Aave - * @notice Base contract implementation of EIP712. - */ -abstract contract EIP712Base { - bytes public constant EIP712_REVISION = bytes('1'); - bytes32 internal constant EIP712_DOMAIN = - keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); - - // Map of address nonces (address => nonce) - mapping(address => uint256) internal _nonces; - - bytes32 internal _domainSeparator; - uint256 internal immutable _chainId; - - /** - * @dev Constructor. - */ - constructor() { - _chainId = block.chainid; - } - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { - if (block.chainid == _chainId) { - return _domainSeparator; - } - return _calculateDomainSeparator(); - } - - /** - * @notice Returns the nonce value for address specified as parameter - * @param owner The address for which the nonce is being returned - * @return The nonce value for the input address` - */ - function nonces(address owner) public view virtual returns (uint256) { - return _nonces[owner]; - } - - /** - * @notice Compute the current domain separator - * @return The domain separator for the token - */ - function _calculateDomainSeparator() internal view returns (bytes32) { - return - keccak256( - abi.encode( - EIP712_DOMAIN, - keccak256(bytes(_EIP712BaseId())), - keccak256(EIP712_REVISION), - block.chainid, - address(this) - ) - ); - } - - /** - * @notice Returns the user readable name of signing domain (e.g. token name) - * @return The name of the signing domain - */ - function _EIP712BaseId() internal view virtual returns (string memory); -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 08a219e0..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,235 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. StableDebtTokens use - * this field to store the user's stable rate. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor(IPool pool, string memory name, string memory symbol, uint8 decimals) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name; - _symbol = symbol; - _decimals = decimals; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol deleted file mode 100644 index 6d2120e3..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IncentivizedERC20} from './IncentivizedERC20.sol'; - -/** - * @title MintableIncentivizedERC20 - * @author Aave - * @notice Implements mint and burn functions for IncentivizedERC20 - */ -abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) IncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /** - * @notice Mints tokens to an account and apply incentives if defined - * @param account The address receiving tokens - * @param amount The amount of tokens to mint - */ - function _mint(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply + amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } - - /** - * @notice Burns tokens from an account and apply incentives if defined - * @param account The account whose tokens are burnt - * @param amount The amount of tokens to burn - */ - function _burn(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply - amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance - amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } -} diff --git a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol b/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol deleted file mode 100644 index d0010e5f..00000000 --- a/downloads/ARBITRUM/DEFAULT_A_TOKEN_IMPL/AToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol +++ /dev/null @@ -1,156 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {MintableIncentivizedERC20} from './MintableIncentivizedERC20.sol'; - -/** - * @title ScaledBalanceTokenBase - * @author Aave - * @notice Basic ERC20 implementation of scaled balance token - */ -abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) MintableIncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /// @inheritdoc IScaledBalanceToken - function scaledBalanceOf(address user) external view override returns (uint256) { - return super.balanceOf(user); - } - - /// @inheritdoc IScaledBalanceToken - function getScaledUserBalanceAndSupply( - address user - ) external view override returns (uint256, uint256) { - return (super.balanceOf(user), super.totalSupply()); - } - - /// @inheritdoc IScaledBalanceToken - function scaledTotalSupply() public view virtual override returns (uint256) { - return super.totalSupply(); - } - - /// @inheritdoc IScaledBalanceToken - function getPreviousIndex(address user) external view virtual override returns (uint256) { - return _userState[user].additionalData; - } - - /** - * @notice Implements the basic logic to mint a scaled balance token. - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the scaled tokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function _mintScaled( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) internal returns (bool) { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); - - uint256 scaledBalance = super.balanceOf(onBehalfOf); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[onBehalfOf].additionalData); - - _userState[onBehalfOf].additionalData = index.toUint128(); - - _mint(onBehalfOf, amountScaled.toUint128()); - - uint256 amountToMint = amount + balanceIncrease; - emit Transfer(address(0), onBehalfOf, amountToMint); - emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); - - return (scaledBalance == 0); - } - - /** - * @notice Implements the basic logic to burn a scaled balance token. - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param user The user which debt is burnt - * @param target The address that will receive the underlying, if any - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - */ - function _burnScaled(address user, address target, uint256 amount, uint256 index) internal { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); - - uint256 scaledBalance = super.balanceOf(user); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[user].additionalData); - - _userState[user].additionalData = index.toUint128(); - - _burn(user, amountScaled.toUint128()); - - if (balanceIncrease > amount) { - uint256 amountToMint = balanceIncrease - amount; - emit Transfer(address(0), user, amountToMint); - emit Mint(user, user, amountToMint, balanceIncrease, index); - } else { - uint256 amountToBurn = amount - balanceIncrease; - emit Transfer(user, address(0), amountToBurn); - emit Burn(user, target, amountToBurn, balanceIncrease, index); - } - } - - /** - * @notice Implements the basic logic to transfer scaled balance tokens between two users - * @dev It emits a mint event with the interest accrued per user - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - * @param index The next liquidity index of the reserve - */ - function _transfer(address sender, address recipient, uint256 amount, uint256 index) internal { - uint256 senderScaledBalance = super.balanceOf(sender); - uint256 senderBalanceIncrease = senderScaledBalance.rayMul(index) - - senderScaledBalance.rayMul(_userState[sender].additionalData); - - uint256 recipientScaledBalance = super.balanceOf(recipient); - uint256 recipientBalanceIncrease = recipientScaledBalance.rayMul(index) - - recipientScaledBalance.rayMul(_userState[recipient].additionalData); - - _userState[sender].additionalData = index.toUint128(); - _userState[recipient].additionalData = index.toUint128(); - - super._transfer(sender, recipient, amount.rayDiv(index).toUint128()); - - if (senderBalanceIncrease > 0) { - emit Transfer(address(0), sender, senderBalanceIncrease); - emit Mint(_msgSender(), sender, senderBalanceIncrease, senderBalanceIncrease, index); - } - - if (sender != recipient && recipientBalanceIncrease > 0) { - emit Transfer(address(0), recipient, recipientBalanceIncrease); - emit Mint(_msgSender(), recipient, recipientBalanceIncrease, recipientBalanceIncrease, index); - } - - emit Transfer(sender, recipient, amount); - } -} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol deleted file mode 100644 index 8c00995f..00000000 --- a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol +++ /dev/null @@ -1,1852 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity =0.8.10 ^0.8.0 ^0.8.10; - -// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaledbalance token. - **/ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted scaled balance tokens - * @param value The amount being minted (user entered amount + balance increase from interest) - * @param balanceIncrease The increase in balance since the last action of the user - * @param index The next liquidity index of the reserve - **/ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after scaled balance tokens are burned - * @param from The address from which the scaled tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in balance since the last action of the user - * @param index The next liquidity index of the reserve - **/ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - **/ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - **/ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - **/ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - **/ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - **/ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - **/ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} - -// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/misc/interfaces/IEACAggregatorProxy.sol - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} - -// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsDistributor.sol - -/** - * @title IRewardsDistributor - * @author Aave - * @notice Defines the basic interface for a Rewards Distributor. - */ -interface IRewardsDistributor { - /** - * @dev Emitted when the configuration of the rewards of an asset is updated. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param oldEmission The old emissions per second value of the reward distribution - * @param newEmission The new emissions per second value of the reward distribution - * @param oldDistributionEnd The old end timestamp of the reward distribution - * @param newDistributionEnd The new end timestamp of the reward distribution - * @param assetIndex The index of the asset distribution - */ - event AssetConfigUpdated( - address indexed asset, - address indexed reward, - uint256 oldEmission, - uint256 newEmission, - uint256 oldDistributionEnd, - uint256 newDistributionEnd, - uint256 assetIndex - ); - - /** - * @dev Emitted when rewards of an asset are accrued on behalf of a user. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param user The address of the user that rewards are accrued on behalf of - * @param assetIndex The index of the asset distribution - * @param userIndex The index of the asset distribution on behalf of the user - * @param rewardsAccrued The amount of rewards accrued - */ - event Accrued( - address indexed asset, - address indexed reward, - address indexed user, - uint256 assetIndex, - uint256 userIndex, - uint256 rewardsAccrued - ); - - /** - * @dev Sets the end date for the distribution - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Gets the end date for the distribution - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The timestamp with the end of the distribution, in unix time format - **/ - function getDistributionEnd(address asset, address reward) external view returns (uint256); - - /** - * @dev Returns the index of a user on a reward distribution - * @param user Address of the user - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The current user asset index, not including new distributions - **/ - function getUserAssetIndex( - address user, - address asset, - address reward - ) external view returns (uint256); - - /** - * @dev Returns the configuration of the distribution reward for a certain asset - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The index of the asset distribution - * @return The emission per second of the reward distribution - * @return The timestamp of the last update of the index - * @return The timestamp of the distribution end - **/ - function getRewardsData( - address asset, - address reward - ) external view returns (uint256, uint256, uint256, uint256); - - /** - * @dev Calculates the next value of an specific distribution index, with validations. - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The old index of the asset distribution - * @return The new index of the asset distribution - **/ - function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); - - /** - * @dev Returns the list of available reward token addresses of an incentivized asset - * @param asset The incentivized asset - * @return List of rewards addresses of the input asset - **/ - function getRewardsByAsset(address asset) external view returns (address[] memory); - - /** - * @dev Returns the list of available reward addresses - * @return List of rewards supported in this contract - **/ - function getRewardsList() external view returns (address[] memory); - - /** - * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. - * @param user The address of the user - * @param reward The address of the reward token - * @return Unclaimed rewards, not including new distributions - **/ - function getUserAccruedRewards(address user, address reward) external view returns (uint256); - - /** - * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @param reward The address of the reward token - * @return The rewards amount - **/ - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view returns (uint256); - - /** - * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @return The list of reward addresses - * @return The list of unclaimed amount of rewards - **/ - function getAllUserRewards( - address[] calldata assets, - address user - ) external view returns (address[] memory, uint256[] memory); - - /** - * @dev Returns the decimals of an asset to calculate the distribution delta - * @param asset The address to retrieve decimals - * @return The decimals of an underlying asset - */ - function getAssetDecimals(address asset) external view returns (uint8); - - /** - * @dev Returns the address of the emission manager - * @return The address of the EmissionManager - */ - function EMISSION_MANAGER() external view returns (address); - - /** - * @dev Returns the address of the emission manager. - * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. - * @return The address of the EmissionManager - */ - function getEmissionManager() external view returns (address); -} - -// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/ITransferStrategyBase.sol - -interface ITransferStrategyBase { - event EmergencyWithdrawal( - address indexed caller, - address indexed token, - address indexed to, - uint256 amount - ); - - /** - * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation - * @param to Account to transfer rewards - * @param reward Address of the reward token - * @param amount Amount to transfer to the "to" address parameter - * @return Returns true bool if transfer logic succeeds - */ - function performTransfer(address to, address reward, uint256 amount) external returns (bool); - - /** - * @return Returns the address of the Incentives Controller - */ - function getIncentivesController() external view returns (address); - - /** - * @return Returns the address of the Rewards admin - */ - function getRewardsAdmin() external view returns (address); - - /** - * @dev Perform an emergency token withdrawal only callable by the Rewards admin - * @param token Address of the token to withdraw funds from this contract - * @param to Address of the recipient of the withdrawal - * @param amount Amount of the withdrawal - */ - function emergencyWithdrawal(address token, address to, uint256 amount) external; -} - -// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/libraries/RewardsDataTypes.sol - -library RewardsDataTypes { - struct RewardsConfigInput { - uint88 emissionPerSecond; - uint256 totalSupply; - uint32 distributionEnd; - address asset; - address reward; - ITransferStrategyBase transferStrategy; - IEACAggregatorProxy rewardOracle; - } - - struct UserAssetBalance { - address asset; - uint256 userBalance; - uint256 totalSupply; - } - - struct UserData { - // Liquidity index of the reward distribution for the user - uint104 index; - // Amount of accrued rewards for the user since last user index update - uint128 accrued; - } - - struct RewardData { - // Liquidity index of the reward distribution - uint104 index; - // Amount of reward tokens distributed per second - uint88 emissionPerSecond; - // Timestamp of the last reward index update - uint32 lastUpdateTimestamp; - // The end of the distribution of rewards (in seconds) - uint32 distributionEnd; - // Map of user addresses and their rewards data (userAddress => userData) - mapping(address => UserData) usersData; - } - - struct AssetData { - // Map of reward token addresses and their data (rewardTokenAddress => rewardData) - mapping(address => RewardData) rewards; - // List of reward token addresses for the asset - mapping(uint128 => address) availableRewards; - // Count of reward tokens for the asset - uint128 availableRewardsCount; - // Number of decimals of the asset - uint8 decimals; - } -} - -// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsController.sol - -/** - * @title IRewardsController - * @author Aave - * @notice Defines the basic interface for a Rewards Controller. - */ -interface IRewardsController is IRewardsDistributor { - /** - * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user - * @param user The address of the user - * @param claimer The address of the claimer - */ - event ClaimerSet(address indexed user, address indexed claimer); - - /** - * @dev Emitted when rewards are claimed - * @param user The address of the user rewards has been claimed on behalf of - * @param reward The address of the token reward is claimed - * @param to The address of the receiver of the rewards - * @param claimer The address of the claimer - * @param amount The amount of rewards claimed - */ - event RewardsClaimed( - address indexed user, - address indexed reward, - address indexed to, - address claimer, - uint256 amount - ); - - /** - * @dev Emitted when a transfer strategy is installed for the reward distribution - * @param reward The address of the token reward - * @param transferStrategy The address of TransferStrategy contract - */ - event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); - - /** - * @dev Emitted when the reward oracle is updated - * @param reward The address of the token reward - * @param rewardOracle The address of oracle - */ - event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Get the price aggregator oracle address - * @param reward The address of the reward - * @return The price oracle of the reward - */ - function getRewardOracle(address reward) external view returns (address); - - /** - * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) - * @param user The address of the user - * @return The claimer address - */ - function getClaimer(address user) external view returns (address); - - /** - * @dev Returns the Transfer Strategy implementation contract address being used for a reward address - * @param reward The address of the reward - * @return The address of the TransferStrategy contract - */ - function getTransferStrategy(address reward) external view returns (address); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - **/ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - - /** - * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The - * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external returns (uint256); - - /** - * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" - **/ - function claimAllRewards( - address[] calldata assets, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must - * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsToSelf( - address[] calldata assets - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); -} - -// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsDistributor.sol - -/** - * @title RewardsDistributor - * @notice Accounting contract to manage multiple staking distributions with multiple rewards - * @author Aave - **/ -abstract contract RewardsDistributor is IRewardsDistributor { - using SafeCast for uint256; - - // Manager of incentives - address public immutable EMISSION_MANAGER; - // Deprecated: This storage slot is kept for backwards compatibility purposes. - address internal _emissionManager; - - // Map of rewarded asset addresses and their data (assetAddress => assetData) - mapping(address => RewardsDataTypes.AssetData) internal _assets; - - // Map of reward assets (rewardAddress => enabled) - mapping(address => bool) internal _isRewardEnabled; - - // Rewards list - address[] internal _rewardsList; - - // Assets list - address[] internal _assetsList; - - modifier onlyEmissionManager() { - require(msg.sender == EMISSION_MANAGER, 'ONLY_EMISSION_MANAGER'); - _; - } - - constructor(address emissionManager) { - EMISSION_MANAGER = emissionManager; - } - - /// @inheritdoc IRewardsDistributor - function getRewardsData( - address asset, - address reward - ) public view override returns (uint256, uint256, uint256, uint256) { - return ( - _assets[asset].rewards[reward].index, - _assets[asset].rewards[reward].emissionPerSecond, - _assets[asset].rewards[reward].lastUpdateTimestamp, - _assets[asset].rewards[reward].distributionEnd - ); - } - - /// @inheritdoc IRewardsDistributor - function getAssetIndex( - address asset, - address reward - ) external view override returns (uint256, uint256) { - RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; - return - _getAssetIndex( - rewardData, - IScaledBalanceToken(asset).scaledTotalSupply(), - 10 ** _assets[asset].decimals - ); - } - - /// @inheritdoc IRewardsDistributor - function getDistributionEnd( - address asset, - address reward - ) external view override returns (uint256) { - return _assets[asset].rewards[reward].distributionEnd; - } - - /// @inheritdoc IRewardsDistributor - function getRewardsByAsset(address asset) external view override returns (address[] memory) { - uint128 rewardsCount = _assets[asset].availableRewardsCount; - address[] memory availableRewards = new address[](rewardsCount); - - for (uint128 i = 0; i < rewardsCount; i++) { - availableRewards[i] = _assets[asset].availableRewards[i]; - } - return availableRewards; - } - - /// @inheritdoc IRewardsDistributor - function getRewardsList() external view override returns (address[] memory) { - return _rewardsList; - } - - /// @inheritdoc IRewardsDistributor - function getUserAssetIndex( - address user, - address asset, - address reward - ) public view override returns (uint256) { - return _assets[asset].rewards[reward].usersData[user].index; - } - - /// @inheritdoc IRewardsDistributor - function getUserAccruedRewards( - address user, - address reward - ) external view override returns (uint256) { - uint256 totalAccrued; - for (uint256 i = 0; i < _assetsList.length; i++) { - totalAccrued += _assets[_assetsList[i]].rewards[reward].usersData[user].accrued; - } - - return totalAccrued; - } - - /// @inheritdoc IRewardsDistributor - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view override returns (uint256) { - return _getUserReward(user, reward, _getUserAssetBalances(assets, user)); - } - - /// @inheritdoc IRewardsDistributor - function getAllUserRewards( - address[] calldata assets, - address user - ) - external - view - override - returns (address[] memory rewardsList, uint256[] memory unclaimedAmounts) - { - RewardsDataTypes.UserAssetBalance[] memory userAssetBalances = _getUserAssetBalances( - assets, - user - ); - rewardsList = new address[](_rewardsList.length); - unclaimedAmounts = new uint256[](rewardsList.length); - - // Add unrealized rewards from user to unclaimedRewards - for (uint256 i = 0; i < userAssetBalances.length; i++) { - for (uint256 r = 0; r < rewardsList.length; r++) { - rewardsList[r] = _rewardsList[r]; - unclaimedAmounts[r] += _assets[userAssetBalances[i].asset] - .rewards[rewardsList[r]] - .usersData[user] - .accrued; - - if (userAssetBalances[i].userBalance == 0) { - continue; - } - unclaimedAmounts[r] += _getPendingRewards(user, rewardsList[r], userAssetBalances[i]); - } - } - return (rewardsList, unclaimedAmounts); - } - - /// @inheritdoc IRewardsDistributor - function setDistributionEnd( - address asset, - address reward, - uint32 newDistributionEnd - ) external override onlyEmissionManager { - uint256 oldDistributionEnd = _assets[asset].rewards[reward].distributionEnd; - _assets[asset].rewards[reward].distributionEnd = newDistributionEnd; - - emit AssetConfigUpdated( - asset, - reward, - _assets[asset].rewards[reward].emissionPerSecond, - _assets[asset].rewards[reward].emissionPerSecond, - oldDistributionEnd, - newDistributionEnd, - _assets[asset].rewards[reward].index - ); - } - - /// @inheritdoc IRewardsDistributor - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external override onlyEmissionManager { - require(rewards.length == newEmissionsPerSecond.length, 'INVALID_INPUT'); - for (uint256 i = 0; i < rewards.length; i++) { - RewardsDataTypes.AssetData storage assetConfig = _assets[asset]; - RewardsDataTypes.RewardData storage rewardConfig = _assets[asset].rewards[rewards[i]]; - uint256 decimals = assetConfig.decimals; - require( - decimals != 0 && rewardConfig.lastUpdateTimestamp != 0, - 'DISTRIBUTION_DOES_NOT_EXIST' - ); - - (uint256 newIndex, ) = _updateRewardData( - rewardConfig, - IScaledBalanceToken(asset).scaledTotalSupply(), - 10 ** decimals - ); - - uint256 oldEmissionPerSecond = rewardConfig.emissionPerSecond; - rewardConfig.emissionPerSecond = newEmissionsPerSecond[i]; - - emit AssetConfigUpdated( - asset, - rewards[i], - oldEmissionPerSecond, - newEmissionsPerSecond[i], - rewardConfig.distributionEnd, - rewardConfig.distributionEnd, - newIndex - ); - } - } - - /** - * @dev Configure the _assets for a specific emission - * @param rewardsInput The array of each asset configuration - **/ - function _configureAssets(RewardsDataTypes.RewardsConfigInput[] memory rewardsInput) internal { - for (uint256 i = 0; i < rewardsInput.length; i++) { - if (_assets[rewardsInput[i].asset].decimals == 0) { - //never initialized before, adding to the list of assets - _assetsList.push(rewardsInput[i].asset); - } - - uint256 decimals = _assets[rewardsInput[i].asset].decimals = IERC20Detailed( - rewardsInput[i].asset - ).decimals(); - - RewardsDataTypes.RewardData storage rewardConfig = _assets[rewardsInput[i].asset].rewards[ - rewardsInput[i].reward - ]; - - // Add reward address to asset available rewards if latestUpdateTimestamp is zero - if (rewardConfig.lastUpdateTimestamp == 0) { - _assets[rewardsInput[i].asset].availableRewards[ - _assets[rewardsInput[i].asset].availableRewardsCount - ] = rewardsInput[i].reward; - _assets[rewardsInput[i].asset].availableRewardsCount++; - } - - // Add reward address to global rewards list if still not enabled - if (_isRewardEnabled[rewardsInput[i].reward] == false) { - _isRewardEnabled[rewardsInput[i].reward] = true; - _rewardsList.push(rewardsInput[i].reward); - } - - // Due emissions is still zero, updates only latestUpdateTimestamp - (uint256 newIndex, ) = _updateRewardData( - rewardConfig, - rewardsInput[i].totalSupply, - 10 ** decimals - ); - - // Configure emission and distribution end of the reward per asset - uint88 oldEmissionsPerSecond = rewardConfig.emissionPerSecond; - uint32 oldDistributionEnd = rewardConfig.distributionEnd; - rewardConfig.emissionPerSecond = rewardsInput[i].emissionPerSecond; - rewardConfig.distributionEnd = rewardsInput[i].distributionEnd; - - emit AssetConfigUpdated( - rewardsInput[i].asset, - rewardsInput[i].reward, - oldEmissionsPerSecond, - rewardsInput[i].emissionPerSecond, - oldDistributionEnd, - rewardsInput[i].distributionEnd, - newIndex - ); - } - } - - /** - * @dev Updates the state of the distribution for the specified reward - * @param rewardData Storage pointer to the distribution reward config - * @param totalSupply Current total of underlying assets for this distribution - * @param assetUnit One unit of asset (10**decimals) - * @return The new distribution index - * @return True if the index was updated, false otherwise - **/ - function _updateRewardData( - RewardsDataTypes.RewardData storage rewardData, - uint256 totalSupply, - uint256 assetUnit - ) internal returns (uint256, bool) { - (uint256 oldIndex, uint256 newIndex) = _getAssetIndex(rewardData, totalSupply, assetUnit); - bool indexUpdated; - if (newIndex != oldIndex) { - require(newIndex <= type(uint104).max, 'INDEX_OVERFLOW'); - indexUpdated = true; - - //optimization: storing one after another saves one SSTORE - rewardData.index = uint104(newIndex); - rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); - } else { - rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); - } - - return (newIndex, indexUpdated); - } - - /** - * @dev Updates the state of the distribution for the specific user - * @param rewardData Storage pointer to the distribution reward config - * @param user The address of the user - * @param userBalance The user balance of the asset - * @param newAssetIndex The new index of the asset distribution - * @param assetUnit One unit of asset (10**decimals) - * @return The rewards accrued since the last update - **/ - function _updateUserData( - RewardsDataTypes.RewardData storage rewardData, - address user, - uint256 userBalance, - uint256 newAssetIndex, - uint256 assetUnit - ) internal returns (uint256, bool) { - uint256 userIndex = rewardData.usersData[user].index; - uint256 rewardsAccrued; - bool dataUpdated; - if ((dataUpdated = userIndex != newAssetIndex)) { - // already checked for overflow in _updateRewardData - rewardData.usersData[user].index = uint104(newAssetIndex); - if (userBalance != 0) { - rewardsAccrued = _getRewards(userBalance, newAssetIndex, userIndex, assetUnit); - - rewardData.usersData[user].accrued += rewardsAccrued.toUint128(); - } - } - return (rewardsAccrued, dataUpdated); - } - - /** - * @dev Iterates and accrues all the rewards for asset of the specific user - * @param asset The address of the reference asset of the distribution - * @param user The user address - * @param userBalance The current user asset balance - * @param totalSupply Total supply of the asset - **/ - function _updateData( - address asset, - address user, - uint256 userBalance, - uint256 totalSupply - ) internal { - uint256 assetUnit; - uint256 numAvailableRewards = _assets[asset].availableRewardsCount; - unchecked { - assetUnit = 10 ** _assets[asset].decimals; - } - - if (numAvailableRewards == 0) { - return; - } - unchecked { - for (uint128 r = 0; r < numAvailableRewards; r++) { - address reward = _assets[asset].availableRewards[r]; - RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; - - (uint256 newAssetIndex, bool rewardDataUpdated) = _updateRewardData( - rewardData, - totalSupply, - assetUnit - ); - - (uint256 rewardsAccrued, bool userDataUpdated) = _updateUserData( - rewardData, - user, - userBalance, - newAssetIndex, - assetUnit - ); - - if (rewardDataUpdated || userDataUpdated) { - emit Accrued(asset, reward, user, newAssetIndex, newAssetIndex, rewardsAccrued); - } - } - } - } - - /** - * @dev Accrues all the rewards of the assets specified in the userAssetBalances list - * @param user The address of the user - * @param userAssetBalances List of structs with the user balance and total supply of a set of assets - **/ - function _updateDataMultiple( - address user, - RewardsDataTypes.UserAssetBalance[] memory userAssetBalances - ) internal { - for (uint256 i = 0; i < userAssetBalances.length; i++) { - _updateData( - userAssetBalances[i].asset, - user, - userAssetBalances[i].userBalance, - userAssetBalances[i].totalSupply - ); - } - } - - /** - * @dev Return the accrued unclaimed amount of a reward from a user over a list of distribution - * @param user The address of the user - * @param reward The address of the reward token - * @param userAssetBalances List of structs with the user balance and total supply of a set of assets - * @return unclaimedRewards The accrued rewards for the user until the moment - **/ - function _getUserReward( - address user, - address reward, - RewardsDataTypes.UserAssetBalance[] memory userAssetBalances - ) internal view returns (uint256 unclaimedRewards) { - // Add unrealized rewards - for (uint256 i = 0; i < userAssetBalances.length; i++) { - if (userAssetBalances[i].userBalance == 0) { - unclaimedRewards += _assets[userAssetBalances[i].asset] - .rewards[reward] - .usersData[user] - .accrued; - } else { - unclaimedRewards += - _getPendingRewards(user, reward, userAssetBalances[i]) + - _assets[userAssetBalances[i].asset].rewards[reward].usersData[user].accrued; - } - } - - return unclaimedRewards; - } - - /** - * @dev Calculates the pending (not yet accrued) rewards since the last user action - * @param user The address of the user - * @param reward The address of the reward token - * @param userAssetBalance struct with the user balance and total supply of the incentivized asset - * @return The pending rewards for the user since the last user action - **/ - function _getPendingRewards( - address user, - address reward, - RewardsDataTypes.UserAssetBalance memory userAssetBalance - ) internal view returns (uint256) { - RewardsDataTypes.RewardData storage rewardData = _assets[userAssetBalance.asset].rewards[ - reward - ]; - uint256 assetUnit = 10 ** _assets[userAssetBalance.asset].decimals; - (, uint256 nextIndex) = _getAssetIndex(rewardData, userAssetBalance.totalSupply, assetUnit); - - return - _getRewards( - userAssetBalance.userBalance, - nextIndex, - rewardData.usersData[user].index, - assetUnit - ); - } - - /** - * @dev Internal function for the calculation of user's rewards on a distribution - * @param userBalance Balance of the user asset on a distribution - * @param reserveIndex Current index of the distribution - * @param userIndex Index stored for the user, representation his staking moment - * @param assetUnit One unit of asset (10**decimals) - * @return The rewards - **/ - function _getRewards( - uint256 userBalance, - uint256 reserveIndex, - uint256 userIndex, - uint256 assetUnit - ) internal pure returns (uint256) { - uint256 result = userBalance * (reserveIndex - userIndex); - assembly { - result := div(result, assetUnit) - } - return result; - } - - /** - * @dev Calculates the next value of an specific distribution index, with validations - * @param rewardData Storage pointer to the distribution reward config - * @param totalSupply of the asset being rewarded - * @param assetUnit One unit of asset (10**decimals) - * @return The new index. - **/ - function _getAssetIndex( - RewardsDataTypes.RewardData storage rewardData, - uint256 totalSupply, - uint256 assetUnit - ) internal view returns (uint256, uint256) { - uint256 oldIndex = rewardData.index; - uint256 distributionEnd = rewardData.distributionEnd; - uint256 emissionPerSecond = rewardData.emissionPerSecond; - uint256 lastUpdateTimestamp = rewardData.lastUpdateTimestamp; - - if ( - emissionPerSecond == 0 || - totalSupply == 0 || - lastUpdateTimestamp == block.timestamp || - lastUpdateTimestamp >= distributionEnd - ) { - return (oldIndex, oldIndex); - } - - uint256 currentTimestamp = block.timestamp > distributionEnd - ? distributionEnd - : block.timestamp; - uint256 timeDelta = currentTimestamp - lastUpdateTimestamp; - uint256 firstTerm = emissionPerSecond * timeDelta * assetUnit; - assembly { - firstTerm := div(firstTerm, totalSupply) - } - return (oldIndex, (firstTerm + oldIndex)); - } - - /** - * @dev Get user balances and total supply of all the assets specified by the assets parameter - * @param assets List of assets to retrieve user balance and total supply - * @param user Address of the user - * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets - */ - function _getUserAssetBalances( - address[] calldata assets, - address user - ) internal view virtual returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances); - - /// @inheritdoc IRewardsDistributor - function getAssetDecimals(address asset) external view returns (uint8) { - return _assets[asset].decimals; - } - - /// @inheritdoc IRewardsDistributor - function getEmissionManager() external view returns (address) { - return EMISSION_MANAGER; - } -} - -// downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsController.sol - -/** - * @title RewardsController - * @notice Abstract contract template to build Distributors contracts for ERC20 rewards to protocol participants - * @author Aave - **/ -contract RewardsController is RewardsDistributor, VersionedInitializable, IRewardsController { - using SafeCast for uint256; - - uint256 public constant REVISION = 2; - - // This mapping allows whitelisted addresses to claim on behalf of others - // useful for contracts that hold tokens to be rewarded but don't have any native logic to claim Liquidity Mining rewards - mapping(address => address) internal _authorizedClaimers; - - // reward => transfer strategy implementation contract - // The TransferStrategy contract abstracts the logic regarding - // the source of the reward and how to transfer it to the user. - mapping(address => ITransferStrategyBase) internal _transferStrategy; - - // This mapping contains the price oracle per reward. - // A price oracle is enforced for integrators to be able to show incentives at - // the current Aave UI without the need to setup an external price registry - // At the moment of reward configuration, the Incentives Controller performs - // a check to see if the provided reward oracle contains `latestAnswer`. - mapping(address => IEACAggregatorProxy) internal _rewardOracle; - - modifier onlyAuthorizedClaimers(address claimer, address user) { - require(_authorizedClaimers[user] == claimer, 'CLAIMER_UNAUTHORIZED'); - _; - } - - constructor(address emissionManager) RewardsDistributor(emissionManager) {} - - /** - * @dev Initialize for RewardsController - * @dev It expects an address as argument since its initialized via PoolAddressesProvider._updateImpl() - **/ - function initialize(address) external initializer {} - - /// @inheritdoc IRewardsController - function getClaimer(address user) external view override returns (address) { - return _authorizedClaimers[user]; - } - - /** - * @dev Returns the revision of the implementation contract - * @return uint256, current revision version - */ - function getRevision() internal pure override returns (uint256) { - return REVISION; - } - - /// @inheritdoc IRewardsController - function getRewardOracle(address reward) external view override returns (address) { - return address(_rewardOracle[reward]); - } - - /// @inheritdoc IRewardsController - function getTransferStrategy(address reward) external view override returns (address) { - return address(_transferStrategy[reward]); - } - - /// @inheritdoc IRewardsController - function configureAssets( - RewardsDataTypes.RewardsConfigInput[] memory config - ) external override onlyEmissionManager { - for (uint256 i = 0; i < config.length; i++) { - // Get the current Scaled Total Supply of AToken or Debt token - config[i].totalSupply = IScaledBalanceToken(config[i].asset).scaledTotalSupply(); - - // Install TransferStrategy logic at IncentivesController - _installTransferStrategy(config[i].reward, config[i].transferStrategy); - - // Set reward oracle, enforces input oracle to have latestPrice function - _setRewardOracle(config[i].reward, config[i].rewardOracle); - } - _configureAssets(config); - } - - /// @inheritdoc IRewardsController - function setTransferStrategy( - address reward, - ITransferStrategyBase transferStrategy - ) external onlyEmissionManager { - _installTransferStrategy(reward, transferStrategy); - } - - /// @inheritdoc IRewardsController - function setRewardOracle( - address reward, - IEACAggregatorProxy rewardOracle - ) external onlyEmissionManager { - _setRewardOracle(reward, rewardOracle); - } - - /// @inheritdoc IRewardsController - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external override { - _updateData(msg.sender, user, userBalance, totalSupply); - } - - /// @inheritdoc IRewardsController - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external override returns (uint256) { - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimRewards(assets, amount, msg.sender, msg.sender, to, reward); - } - - /// @inheritdoc IRewardsController - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external override onlyAuthorizedClaimers(msg.sender, user) returns (uint256) { - require(user != address(0), 'INVALID_USER_ADDRESS'); - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimRewards(assets, amount, msg.sender, user, to, reward); - } - - /// @inheritdoc IRewardsController - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external override returns (uint256) { - return _claimRewards(assets, amount, msg.sender, msg.sender, msg.sender, reward); - } - - /// @inheritdoc IRewardsController - function claimAllRewards( - address[] calldata assets, - address to - ) external override returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimAllRewards(assets, msg.sender, msg.sender, to); - } - - /// @inheritdoc IRewardsController - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) - external - override - onlyAuthorizedClaimers(msg.sender, user) - returns (address[] memory rewardsList, uint256[] memory claimedAmounts) - { - require(user != address(0), 'INVALID_USER_ADDRESS'); - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimAllRewards(assets, msg.sender, user, to); - } - - /// @inheritdoc IRewardsController - function claimAllRewardsToSelf( - address[] calldata assets - ) external override returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { - return _claimAllRewards(assets, msg.sender, msg.sender, msg.sender); - } - - /// @inheritdoc IRewardsController - function setClaimer(address user, address caller) external override onlyEmissionManager { - _authorizedClaimers[user] = caller; - emit ClaimerSet(user, caller); - } - - /** - * @dev Get user balances and total supply of all the assets specified by the assets parameter - * @param assets List of assets to retrieve user balance and total supply - * @param user Address of the user - * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets - */ - function _getUserAssetBalances( - address[] calldata assets, - address user - ) internal view override returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances) { - userAssetBalances = new RewardsDataTypes.UserAssetBalance[](assets.length); - for (uint256 i = 0; i < assets.length; i++) { - userAssetBalances[i].asset = assets[i]; - (userAssetBalances[i].userBalance, userAssetBalances[i].totalSupply) = IScaledBalanceToken( - assets[i] - ).getScaledUserBalanceAndSupply(user); - } - return userAssetBalances; - } - - /** - * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount Amount of rewards to claim - * @param claimer Address of the claimer who claims rewards on behalf of user - * @param user Address to check and claim rewards - * @param to Address that will be receiving the rewards - * @param reward Address of the reward token - * @return Rewards claimed - **/ - function _claimRewards( - address[] calldata assets, - uint256 amount, - address claimer, - address user, - address to, - address reward - ) internal returns (uint256) { - if (amount == 0) { - return 0; - } - uint256 totalRewards; - - _updateDataMultiple(user, _getUserAssetBalances(assets, user)); - for (uint256 i = 0; i < assets.length; i++) { - address asset = assets[i]; - totalRewards += _assets[asset].rewards[reward].usersData[user].accrued; - - if (totalRewards <= amount) { - _assets[asset].rewards[reward].usersData[user].accrued = 0; - } else { - uint256 difference = totalRewards - amount; - totalRewards -= difference; - _assets[asset].rewards[reward].usersData[user].accrued = difference.toUint128(); - break; - } - } - - if (totalRewards == 0) { - return 0; - } - - _transferRewards(to, reward, totalRewards); - emit RewardsClaimed(user, reward, to, claimer, totalRewards); - - return totalRewards; - } - - /** - * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. - * @param assets List of assets to check eligible distributions before claiming rewards - * @param claimer Address of the claimer on behalf of user - * @param user Address to check and claim rewards - * @param to Address that will be receiving the rewards - * @return - * rewardsList List of reward addresses - * claimedAmount List of claimed amounts, follows "rewardsList" items order - **/ - function _claimAllRewards( - address[] calldata assets, - address claimer, - address user, - address to - ) internal returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { - uint256 rewardsListLength = _rewardsList.length; - rewardsList = new address[](rewardsListLength); - claimedAmounts = new uint256[](rewardsListLength); - - _updateDataMultiple(user, _getUserAssetBalances(assets, user)); - - for (uint256 i = 0; i < assets.length; i++) { - address asset = assets[i]; - for (uint256 j = 0; j < rewardsListLength; j++) { - if (rewardsList[j] == address(0)) { - rewardsList[j] = _rewardsList[j]; - } - uint256 rewardAmount = _assets[asset].rewards[rewardsList[j]].usersData[user].accrued; - if (rewardAmount != 0) { - claimedAmounts[j] += rewardAmount; - _assets[asset].rewards[rewardsList[j]].usersData[user].accrued = 0; - } - } - } - for (uint256 i = 0; i < rewardsListLength; i++) { - _transferRewards(to, rewardsList[i], claimedAmounts[i]); - emit RewardsClaimed(user, rewardsList[i], to, claimer, claimedAmounts[i]); - } - return (rewardsList, claimedAmounts); - } - - /** - * @dev Function to transfer rewards to the desired account using delegatecall and - * @param to Account address to send the rewards - * @param reward Address of the reward token - * @param amount Amount of rewards to transfer - */ - function _transferRewards(address to, address reward, uint256 amount) internal { - ITransferStrategyBase transferStrategy = _transferStrategy[reward]; - - bool success = transferStrategy.performTransfer(to, reward, amount); - - require(success == true, 'TRANSFER_ERROR'); - } - - /** - * @dev Returns true if `account` is a contract. - * @param account The address of the account - * @return bool, true if contract, false otherwise - */ - function _isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - // solhint-disable-next-line no-inline-assembly - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Internal function to call the optional install hook at the TransferStrategy - * @param reward The address of the reward token - * @param transferStrategy The address of the reward TransferStrategy - */ - function _installTransferStrategy( - address reward, - ITransferStrategyBase transferStrategy - ) internal { - require(address(transferStrategy) != address(0), 'STRATEGY_CAN_NOT_BE_ZERO'); - require(_isContract(address(transferStrategy)) == true, 'STRATEGY_MUST_BE_CONTRACT'); - - _transferStrategy[reward] = transferStrategy; - - emit TransferStrategyInstalled(reward, address(transferStrategy)); - } - - /** - * @dev Update the Price Oracle of a reward token. The Price Oracle must follow Chainlink IEACAggregatorProxy interface. - * @notice The Price Oracle of a reward is used for displaying correct data about the incentives at the UI frontend. - * @param reward The address of the reward token - * @param rewardOracle The address of the price oracle - */ - - function _setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) internal { - require(rewardOracle.latestAnswer() > 0, 'ORACLE_MUST_RETURN_PRICE'); - _rewardOracle[reward] = rewardOracle; - emit RewardOracleUpdated(reward, address(rewardOracle)); - } -} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 7dc55938..00000000 --- a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,80 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index 02693059..00000000 --- a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index 6d708093..00000000 --- a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity 0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 89ccddfd..00000000 --- a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaledbalance token. - **/ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted scaled balance tokens - * @param value The amount being minted (user entered amount + balance increase from interest) - * @param balanceIncrease The increase in balance since the last action of the user - * @param index The next liquidity index of the reserve - **/ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after scaled balance tokens are burned - * @param from The address from which the scaled tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in balance since the last action of the user - * @param index The next liquidity index of the reserve - **/ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - **/ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - **/ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - **/ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - **/ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol deleted file mode 100644 index 570c319e..00000000 --- a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - **/ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - **/ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/misc/interfaces/IEACAggregatorProxy.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/misc/interfaces/IEACAggregatorProxy.sol deleted file mode 100644 index 13fd0819..00000000 --- a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/misc/interfaces/IEACAggregatorProxy.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.10; - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsController.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsController.sol deleted file mode 100644 index 7e5aa1d3..00000000 --- a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsController.sol +++ /dev/null @@ -1,369 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '../../../aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {SafeCast} from '../../../aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IScaledBalanceToken} from '../../../aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol'; -import {RewardsDistributor} from './RewardsDistributor.sol'; -import {IRewardsController} from './interfaces/IRewardsController.sol'; -import {ITransferStrategyBase} from './interfaces/ITransferStrategyBase.sol'; -import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol'; -import {IEACAggregatorProxy} from '../misc/interfaces/IEACAggregatorProxy.sol'; - -/** - * @title RewardsController - * @notice Abstract contract template to build Distributors contracts for ERC20 rewards to protocol participants - * @author Aave - **/ -contract RewardsController is RewardsDistributor, VersionedInitializable, IRewardsController { - using SafeCast for uint256; - - uint256 public constant REVISION = 2; - - // This mapping allows whitelisted addresses to claim on behalf of others - // useful for contracts that hold tokens to be rewarded but don't have any native logic to claim Liquidity Mining rewards - mapping(address => address) internal _authorizedClaimers; - - // reward => transfer strategy implementation contract - // The TransferStrategy contract abstracts the logic regarding - // the source of the reward and how to transfer it to the user. - mapping(address => ITransferStrategyBase) internal _transferStrategy; - - // This mapping contains the price oracle per reward. - // A price oracle is enforced for integrators to be able to show incentives at - // the current Aave UI without the need to setup an external price registry - // At the moment of reward configuration, the Incentives Controller performs - // a check to see if the provided reward oracle contains `latestAnswer`. - mapping(address => IEACAggregatorProxy) internal _rewardOracle; - - modifier onlyAuthorizedClaimers(address claimer, address user) { - require(_authorizedClaimers[user] == claimer, 'CLAIMER_UNAUTHORIZED'); - _; - } - - constructor(address emissionManager) RewardsDistributor(emissionManager) {} - - /** - * @dev Initialize for RewardsController - * @dev It expects an address as argument since its initialized via PoolAddressesProvider._updateImpl() - **/ - function initialize(address) external initializer {} - - /// @inheritdoc IRewardsController - function getClaimer(address user) external view override returns (address) { - return _authorizedClaimers[user]; - } - - /** - * @dev Returns the revision of the implementation contract - * @return uint256, current revision version - */ - function getRevision() internal pure override returns (uint256) { - return REVISION; - } - - /// @inheritdoc IRewardsController - function getRewardOracle(address reward) external view override returns (address) { - return address(_rewardOracle[reward]); - } - - /// @inheritdoc IRewardsController - function getTransferStrategy(address reward) external view override returns (address) { - return address(_transferStrategy[reward]); - } - - /// @inheritdoc IRewardsController - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) - external - override - onlyEmissionManager - { - for (uint256 i = 0; i < config.length; i++) { - // Get the current Scaled Total Supply of AToken or Debt token - config[i].totalSupply = IScaledBalanceToken(config[i].asset).scaledTotalSupply(); - - // Install TransferStrategy logic at IncentivesController - _installTransferStrategy(config[i].reward, config[i].transferStrategy); - - // Set reward oracle, enforces input oracle to have latestPrice function - _setRewardOracle(config[i].reward, config[i].rewardOracle); - } - _configureAssets(config); - } - - /// @inheritdoc IRewardsController - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) - external - onlyEmissionManager - { - _installTransferStrategy(reward, transferStrategy); - } - - /// @inheritdoc IRewardsController - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) - external - onlyEmissionManager - { - _setRewardOracle(reward, rewardOracle); - } - - /// @inheritdoc IRewardsController - function handleAction( - address user, - uint256 totalSupply, - uint256 userBalance - ) external override { - _updateData(msg.sender, user, userBalance, totalSupply); - } - - /// @inheritdoc IRewardsController - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external override returns (uint256) { - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimRewards(assets, amount, msg.sender, msg.sender, to, reward); - } - - /// @inheritdoc IRewardsController - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external override onlyAuthorizedClaimers(msg.sender, user) returns (uint256) { - require(user != address(0), 'INVALID_USER_ADDRESS'); - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimRewards(assets, amount, msg.sender, user, to, reward); - } - - /// @inheritdoc IRewardsController - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external override returns (uint256) { - return _claimRewards(assets, amount, msg.sender, msg.sender, msg.sender, reward); - } - - /// @inheritdoc IRewardsController - function claimAllRewards(address[] calldata assets, address to) - external - override - returns (address[] memory rewardsList, uint256[] memory claimedAmounts) - { - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimAllRewards(assets, msg.sender, msg.sender, to); - } - - /// @inheritdoc IRewardsController - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) - external - override - onlyAuthorizedClaimers(msg.sender, user) - returns (address[] memory rewardsList, uint256[] memory claimedAmounts) - { - require(user != address(0), 'INVALID_USER_ADDRESS'); - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimAllRewards(assets, msg.sender, user, to); - } - - /// @inheritdoc IRewardsController - function claimAllRewardsToSelf(address[] calldata assets) - external - override - returns (address[] memory rewardsList, uint256[] memory claimedAmounts) - { - return _claimAllRewards(assets, msg.sender, msg.sender, msg.sender); - } - - /// @inheritdoc IRewardsController - function setClaimer(address user, address caller) external override onlyEmissionManager { - _authorizedClaimers[user] = caller; - emit ClaimerSet(user, caller); - } - - /** - * @dev Get user balances and total supply of all the assets specified by the assets parameter - * @param assets List of assets to retrieve user balance and total supply - * @param user Address of the user - * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets - */ - function _getUserAssetBalances(address[] calldata assets, address user) - internal - view - override - returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances) - { - userAssetBalances = new RewardsDataTypes.UserAssetBalance[](assets.length); - for (uint256 i = 0; i < assets.length; i++) { - userAssetBalances[i].asset = assets[i]; - (userAssetBalances[i].userBalance, userAssetBalances[i].totalSupply) = IScaledBalanceToken( - assets[i] - ).getScaledUserBalanceAndSupply(user); - } - return userAssetBalances; - } - - /** - * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount Amount of rewards to claim - * @param claimer Address of the claimer who claims rewards on behalf of user - * @param user Address to check and claim rewards - * @param to Address that will be receiving the rewards - * @param reward Address of the reward token - * @return Rewards claimed - **/ - function _claimRewards( - address[] calldata assets, - uint256 amount, - address claimer, - address user, - address to, - address reward - ) internal returns (uint256) { - if (amount == 0) { - return 0; - } - uint256 totalRewards; - - _updateDataMultiple(user, _getUserAssetBalances(assets, user)); - for (uint256 i = 0; i < assets.length; i++) { - address asset = assets[i]; - totalRewards += _assets[asset].rewards[reward].usersData[user].accrued; - - if (totalRewards <= amount) { - _assets[asset].rewards[reward].usersData[user].accrued = 0; - } else { - uint256 difference = totalRewards - amount; - totalRewards -= difference; - _assets[asset].rewards[reward].usersData[user].accrued = difference.toUint128(); - break; - } - } - - if (totalRewards == 0) { - return 0; - } - - _transferRewards(to, reward, totalRewards); - emit RewardsClaimed(user, reward, to, claimer, totalRewards); - - return totalRewards; - } - - /** - * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. - * @param assets List of assets to check eligible distributions before claiming rewards - * @param claimer Address of the claimer on behalf of user - * @param user Address to check and claim rewards - * @param to Address that will be receiving the rewards - * @return - * rewardsList List of reward addresses - * claimedAmount List of claimed amounts, follows "rewardsList" items order - **/ - function _claimAllRewards( - address[] calldata assets, - address claimer, - address user, - address to - ) internal returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { - uint256 rewardsListLength = _rewardsList.length; - rewardsList = new address[](rewardsListLength); - claimedAmounts = new uint256[](rewardsListLength); - - _updateDataMultiple(user, _getUserAssetBalances(assets, user)); - - for (uint256 i = 0; i < assets.length; i++) { - address asset = assets[i]; - for (uint256 j = 0; j < rewardsListLength; j++) { - if (rewardsList[j] == address(0)) { - rewardsList[j] = _rewardsList[j]; - } - uint256 rewardAmount = _assets[asset].rewards[rewardsList[j]].usersData[user].accrued; - if (rewardAmount != 0) { - claimedAmounts[j] += rewardAmount; - _assets[asset].rewards[rewardsList[j]].usersData[user].accrued = 0; - } - } - } - for (uint256 i = 0; i < rewardsListLength; i++) { - _transferRewards(to, rewardsList[i], claimedAmounts[i]); - emit RewardsClaimed(user, rewardsList[i], to, claimer, claimedAmounts[i]); - } - return (rewardsList, claimedAmounts); - } - - /** - * @dev Function to transfer rewards to the desired account using delegatecall and - * @param to Account address to send the rewards - * @param reward Address of the reward token - * @param amount Amount of rewards to transfer - */ - function _transferRewards( - address to, - address reward, - uint256 amount - ) internal { - ITransferStrategyBase transferStrategy = _transferStrategy[reward]; - - bool success = transferStrategy.performTransfer(to, reward, amount); - - require(success == true, 'TRANSFER_ERROR'); - } - - /** - * @dev Returns true if `account` is a contract. - * @param account The address of the account - * @return bool, true if contract, false otherwise - */ - function _isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - // solhint-disable-next-line no-inline-assembly - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Internal function to call the optional install hook at the TransferStrategy - * @param reward The address of the reward token - * @param transferStrategy The address of the reward TransferStrategy - */ - function _installTransferStrategy(address reward, ITransferStrategyBase transferStrategy) - internal - { - require(address(transferStrategy) != address(0), 'STRATEGY_CAN_NOT_BE_ZERO'); - require(_isContract(address(transferStrategy)) == true, 'STRATEGY_MUST_BE_CONTRACT'); - - _transferStrategy[reward] = transferStrategy; - - emit TransferStrategyInstalled(reward, address(transferStrategy)); - } - - /** - * @dev Update the Price Oracle of a reward token. The Price Oracle must follow Chainlink IEACAggregatorProxy interface. - * @notice The Price Oracle of a reward is used for displaying correct data about the incentives at the UI frontend. - * @param reward The address of the reward token - * @param rewardOracle The address of the price oracle - */ - - function _setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) internal { - require(rewardOracle.latestAnswer() > 0, 'ORACLE_MUST_RETURN_PRICE'); - _rewardOracle[reward] = rewardOracle; - emit RewardOracleUpdated(reward, address(rewardOracle)); - } -} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsDistributor.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsDistributor.sol deleted file mode 100644 index 639ebaa0..00000000 --- a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/RewardsDistributor.sol +++ /dev/null @@ -1,548 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IScaledBalanceToken} from '../../../aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol'; -import {IERC20Detailed} from '../../../aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IRewardsDistributor} from './interfaces/IRewardsDistributor.sol'; -import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol'; - -/** - * @title RewardsDistributor - * @notice Accounting contract to manage multiple staking distributions with multiple rewards - * @author Aave - **/ -abstract contract RewardsDistributor is IRewardsDistributor { - using SafeCast for uint256; - - // Manager of incentives - address public immutable EMISSION_MANAGER; - // Deprecated: This storage slot is kept for backwards compatibility purposes. - address internal _emissionManager; - - // Map of rewarded asset addresses and their data (assetAddress => assetData) - mapping(address => RewardsDataTypes.AssetData) internal _assets; - - // Map of reward assets (rewardAddress => enabled) - mapping(address => bool) internal _isRewardEnabled; - - // Rewards list - address[] internal _rewardsList; - - // Assets list - address[] internal _assetsList; - - modifier onlyEmissionManager() { - require(msg.sender == EMISSION_MANAGER, 'ONLY_EMISSION_MANAGER'); - _; - } - - constructor(address emissionManager) { - EMISSION_MANAGER = emissionManager; - } - - /// @inheritdoc IRewardsDistributor - function getRewardsData(address asset, address reward) - public - view - override - returns ( - uint256, - uint256, - uint256, - uint256 - ) - { - return ( - _assets[asset].rewards[reward].index, - _assets[asset].rewards[reward].emissionPerSecond, - _assets[asset].rewards[reward].lastUpdateTimestamp, - _assets[asset].rewards[reward].distributionEnd - ); - } - - /// @inheritdoc IRewardsDistributor - function getAssetIndex(address asset, address reward) - external - view - override - returns (uint256, uint256) - { - RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; - return - _getAssetIndex( - rewardData, - IScaledBalanceToken(asset).scaledTotalSupply(), - 10**_assets[asset].decimals - ); - } - - /// @inheritdoc IRewardsDistributor - function getDistributionEnd(address asset, address reward) - external - view - override - returns (uint256) - { - return _assets[asset].rewards[reward].distributionEnd; - } - - /// @inheritdoc IRewardsDistributor - function getRewardsByAsset(address asset) external view override returns (address[] memory) { - uint128 rewardsCount = _assets[asset].availableRewardsCount; - address[] memory availableRewards = new address[](rewardsCount); - - for (uint128 i = 0; i < rewardsCount; i++) { - availableRewards[i] = _assets[asset].availableRewards[i]; - } - return availableRewards; - } - - /// @inheritdoc IRewardsDistributor - function getRewardsList() external view override returns (address[] memory) { - return _rewardsList; - } - - /// @inheritdoc IRewardsDistributor - function getUserAssetIndex( - address user, - address asset, - address reward - ) public view override returns (uint256) { - return _assets[asset].rewards[reward].usersData[user].index; - } - - /// @inheritdoc IRewardsDistributor - function getUserAccruedRewards(address user, address reward) - external - view - override - returns (uint256) - { - uint256 totalAccrued; - for (uint256 i = 0; i < _assetsList.length; i++) { - totalAccrued += _assets[_assetsList[i]].rewards[reward].usersData[user].accrued; - } - - return totalAccrued; - } - - /// @inheritdoc IRewardsDistributor - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view override returns (uint256) { - return _getUserReward(user, reward, _getUserAssetBalances(assets, user)); - } - - /// @inheritdoc IRewardsDistributor - function getAllUserRewards(address[] calldata assets, address user) - external - view - override - returns (address[] memory rewardsList, uint256[] memory unclaimedAmounts) - { - RewardsDataTypes.UserAssetBalance[] memory userAssetBalances = _getUserAssetBalances( - assets, - user - ); - rewardsList = new address[](_rewardsList.length); - unclaimedAmounts = new uint256[](rewardsList.length); - - // Add unrealized rewards from user to unclaimedRewards - for (uint256 i = 0; i < userAssetBalances.length; i++) { - for (uint256 r = 0; r < rewardsList.length; r++) { - rewardsList[r] = _rewardsList[r]; - unclaimedAmounts[r] += _assets[userAssetBalances[i].asset] - .rewards[rewardsList[r]] - .usersData[user] - .accrued; - - if (userAssetBalances[i].userBalance == 0) { - continue; - } - unclaimedAmounts[r] += _getPendingRewards(user, rewardsList[r], userAssetBalances[i]); - } - } - return (rewardsList, unclaimedAmounts); - } - - /// @inheritdoc IRewardsDistributor - function setDistributionEnd( - address asset, - address reward, - uint32 newDistributionEnd - ) external override onlyEmissionManager { - uint256 oldDistributionEnd = _assets[asset].rewards[reward].distributionEnd; - _assets[asset].rewards[reward].distributionEnd = newDistributionEnd; - - emit AssetConfigUpdated( - asset, - reward, - _assets[asset].rewards[reward].emissionPerSecond, - _assets[asset].rewards[reward].emissionPerSecond, - oldDistributionEnd, - newDistributionEnd, - _assets[asset].rewards[reward].index - ); - } - - /// @inheritdoc IRewardsDistributor - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external override onlyEmissionManager { - require(rewards.length == newEmissionsPerSecond.length, 'INVALID_INPUT'); - for (uint256 i = 0; i < rewards.length; i++) { - RewardsDataTypes.AssetData storage assetConfig = _assets[asset]; - RewardsDataTypes.RewardData storage rewardConfig = _assets[asset].rewards[rewards[i]]; - uint256 decimals = assetConfig.decimals; - require( - decimals != 0 && rewardConfig.lastUpdateTimestamp != 0, - 'DISTRIBUTION_DOES_NOT_EXIST' - ); - - (uint256 newIndex, ) = _updateRewardData( - rewardConfig, - IScaledBalanceToken(asset).scaledTotalSupply(), - 10**decimals - ); - - uint256 oldEmissionPerSecond = rewardConfig.emissionPerSecond; - rewardConfig.emissionPerSecond = newEmissionsPerSecond[i]; - - emit AssetConfigUpdated( - asset, - rewards[i], - oldEmissionPerSecond, - newEmissionsPerSecond[i], - rewardConfig.distributionEnd, - rewardConfig.distributionEnd, - newIndex - ); - } - } - - /** - * @dev Configure the _assets for a specific emission - * @param rewardsInput The array of each asset configuration - **/ - function _configureAssets(RewardsDataTypes.RewardsConfigInput[] memory rewardsInput) internal { - for (uint256 i = 0; i < rewardsInput.length; i++) { - if (_assets[rewardsInput[i].asset].decimals == 0) { - //never initialized before, adding to the list of assets - _assetsList.push(rewardsInput[i].asset); - } - - uint256 decimals = _assets[rewardsInput[i].asset].decimals = IERC20Detailed( - rewardsInput[i].asset - ).decimals(); - - RewardsDataTypes.RewardData storage rewardConfig = _assets[rewardsInput[i].asset].rewards[ - rewardsInput[i].reward - ]; - - // Add reward address to asset available rewards if latestUpdateTimestamp is zero - if (rewardConfig.lastUpdateTimestamp == 0) { - _assets[rewardsInput[i].asset].availableRewards[ - _assets[rewardsInput[i].asset].availableRewardsCount - ] = rewardsInput[i].reward; - _assets[rewardsInput[i].asset].availableRewardsCount++; - } - - // Add reward address to global rewards list if still not enabled - if (_isRewardEnabled[rewardsInput[i].reward] == false) { - _isRewardEnabled[rewardsInput[i].reward] = true; - _rewardsList.push(rewardsInput[i].reward); - } - - // Due emissions is still zero, updates only latestUpdateTimestamp - (uint256 newIndex, ) = _updateRewardData( - rewardConfig, - rewardsInput[i].totalSupply, - 10**decimals - ); - - // Configure emission and distribution end of the reward per asset - uint88 oldEmissionsPerSecond = rewardConfig.emissionPerSecond; - uint32 oldDistributionEnd = rewardConfig.distributionEnd; - rewardConfig.emissionPerSecond = rewardsInput[i].emissionPerSecond; - rewardConfig.distributionEnd = rewardsInput[i].distributionEnd; - - emit AssetConfigUpdated( - rewardsInput[i].asset, - rewardsInput[i].reward, - oldEmissionsPerSecond, - rewardsInput[i].emissionPerSecond, - oldDistributionEnd, - rewardsInput[i].distributionEnd, - newIndex - ); - } - } - - /** - * @dev Updates the state of the distribution for the specified reward - * @param rewardData Storage pointer to the distribution reward config - * @param totalSupply Current total of underlying assets for this distribution - * @param assetUnit One unit of asset (10**decimals) - * @return The new distribution index - * @return True if the index was updated, false otherwise - **/ - function _updateRewardData( - RewardsDataTypes.RewardData storage rewardData, - uint256 totalSupply, - uint256 assetUnit - ) internal returns (uint256, bool) { - (uint256 oldIndex, uint256 newIndex) = _getAssetIndex(rewardData, totalSupply, assetUnit); - bool indexUpdated; - if (newIndex != oldIndex) { - require(newIndex <= type(uint104).max, 'INDEX_OVERFLOW'); - indexUpdated = true; - - //optimization: storing one after another saves one SSTORE - rewardData.index = uint104(newIndex); - rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); - } else { - rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); - } - - return (newIndex, indexUpdated); - } - - /** - * @dev Updates the state of the distribution for the specific user - * @param rewardData Storage pointer to the distribution reward config - * @param user The address of the user - * @param userBalance The user balance of the asset - * @param newAssetIndex The new index of the asset distribution - * @param assetUnit One unit of asset (10**decimals) - * @return The rewards accrued since the last update - **/ - function _updateUserData( - RewardsDataTypes.RewardData storage rewardData, - address user, - uint256 userBalance, - uint256 newAssetIndex, - uint256 assetUnit - ) internal returns (uint256, bool) { - uint256 userIndex = rewardData.usersData[user].index; - uint256 rewardsAccrued; - bool dataUpdated; - if ((dataUpdated = userIndex != newAssetIndex)) { - // already checked for overflow in _updateRewardData - rewardData.usersData[user].index = uint104(newAssetIndex); - if (userBalance != 0) { - rewardsAccrued = _getRewards(userBalance, newAssetIndex, userIndex, assetUnit); - - rewardData.usersData[user].accrued += rewardsAccrued.toUint128(); - } - } - return (rewardsAccrued, dataUpdated); - } - - /** - * @dev Iterates and accrues all the rewards for asset of the specific user - * @param asset The address of the reference asset of the distribution - * @param user The user address - * @param userBalance The current user asset balance - * @param totalSupply Total supply of the asset - **/ - function _updateData( - address asset, - address user, - uint256 userBalance, - uint256 totalSupply - ) internal { - uint256 assetUnit; - uint256 numAvailableRewards = _assets[asset].availableRewardsCount; - unchecked { - assetUnit = 10**_assets[asset].decimals; - } - - if (numAvailableRewards == 0) { - return; - } - unchecked { - for (uint128 r = 0; r < numAvailableRewards; r++) { - address reward = _assets[asset].availableRewards[r]; - RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; - - (uint256 newAssetIndex, bool rewardDataUpdated) = _updateRewardData( - rewardData, - totalSupply, - assetUnit - ); - - (uint256 rewardsAccrued, bool userDataUpdated) = _updateUserData( - rewardData, - user, - userBalance, - newAssetIndex, - assetUnit - ); - - if (rewardDataUpdated || userDataUpdated) { - emit Accrued(asset, reward, user, newAssetIndex, newAssetIndex, rewardsAccrued); - } - } - } - } - - /** - * @dev Accrues all the rewards of the assets specified in the userAssetBalances list - * @param user The address of the user - * @param userAssetBalances List of structs with the user balance and total supply of a set of assets - **/ - function _updateDataMultiple( - address user, - RewardsDataTypes.UserAssetBalance[] memory userAssetBalances - ) internal { - for (uint256 i = 0; i < userAssetBalances.length; i++) { - _updateData( - userAssetBalances[i].asset, - user, - userAssetBalances[i].userBalance, - userAssetBalances[i].totalSupply - ); - } - } - - /** - * @dev Return the accrued unclaimed amount of a reward from a user over a list of distribution - * @param user The address of the user - * @param reward The address of the reward token - * @param userAssetBalances List of structs with the user balance and total supply of a set of assets - * @return unclaimedRewards The accrued rewards for the user until the moment - **/ - function _getUserReward( - address user, - address reward, - RewardsDataTypes.UserAssetBalance[] memory userAssetBalances - ) internal view returns (uint256 unclaimedRewards) { - // Add unrealized rewards - for (uint256 i = 0; i < userAssetBalances.length; i++) { - if (userAssetBalances[i].userBalance == 0) { - unclaimedRewards += _assets[userAssetBalances[i].asset] - .rewards[reward] - .usersData[user] - .accrued; - } else { - unclaimedRewards += - _getPendingRewards(user, reward, userAssetBalances[i]) + - _assets[userAssetBalances[i].asset].rewards[reward].usersData[user].accrued; - } - } - - return unclaimedRewards; - } - - /** - * @dev Calculates the pending (not yet accrued) rewards since the last user action - * @param user The address of the user - * @param reward The address of the reward token - * @param userAssetBalance struct with the user balance and total supply of the incentivized asset - * @return The pending rewards for the user since the last user action - **/ - function _getPendingRewards( - address user, - address reward, - RewardsDataTypes.UserAssetBalance memory userAssetBalance - ) internal view returns (uint256) { - RewardsDataTypes.RewardData storage rewardData = _assets[userAssetBalance.asset].rewards[ - reward - ]; - uint256 assetUnit = 10**_assets[userAssetBalance.asset].decimals; - (, uint256 nextIndex) = _getAssetIndex(rewardData, userAssetBalance.totalSupply, assetUnit); - - return - _getRewards( - userAssetBalance.userBalance, - nextIndex, - rewardData.usersData[user].index, - assetUnit - ); - } - - /** - * @dev Internal function for the calculation of user's rewards on a distribution - * @param userBalance Balance of the user asset on a distribution - * @param reserveIndex Current index of the distribution - * @param userIndex Index stored for the user, representation his staking moment - * @param assetUnit One unit of asset (10**decimals) - * @return The rewards - **/ - function _getRewards( - uint256 userBalance, - uint256 reserveIndex, - uint256 userIndex, - uint256 assetUnit - ) internal pure returns (uint256) { - uint256 result = userBalance * (reserveIndex - userIndex); - assembly { - result := div(result, assetUnit) - } - return result; - } - - /** - * @dev Calculates the next value of an specific distribution index, with validations - * @param rewardData Storage pointer to the distribution reward config - * @param totalSupply of the asset being rewarded - * @param assetUnit One unit of asset (10**decimals) - * @return The new index. - **/ - function _getAssetIndex( - RewardsDataTypes.RewardData storage rewardData, - uint256 totalSupply, - uint256 assetUnit - ) internal view returns (uint256, uint256) { - uint256 oldIndex = rewardData.index; - uint256 distributionEnd = rewardData.distributionEnd; - uint256 emissionPerSecond = rewardData.emissionPerSecond; - uint256 lastUpdateTimestamp = rewardData.lastUpdateTimestamp; - - if ( - emissionPerSecond == 0 || - totalSupply == 0 || - lastUpdateTimestamp == block.timestamp || - lastUpdateTimestamp >= distributionEnd - ) { - return (oldIndex, oldIndex); - } - - uint256 currentTimestamp = block.timestamp > distributionEnd - ? distributionEnd - : block.timestamp; - uint256 timeDelta = currentTimestamp - lastUpdateTimestamp; - uint256 firstTerm = emissionPerSecond * timeDelta * assetUnit; - assembly { - firstTerm := div(firstTerm, totalSupply) - } - return (oldIndex, (firstTerm + oldIndex)); - } - - /** - * @dev Get user balances and total supply of all the assets specified by the assets parameter - * @param assets List of assets to retrieve user balance and total supply - * @param user Address of the user - * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets - */ - function _getUserAssetBalances(address[] calldata assets, address user) - internal - view - virtual - returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances); - - /// @inheritdoc IRewardsDistributor - function getAssetDecimals(address asset) external view returns (uint8) { - return _assets[asset].decimals; - } - - /// @inheritdoc IRewardsDistributor - function getEmissionManager() external view returns (address) { - return EMISSION_MANAGER; - } -} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsController.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsController.sol deleted file mode 100644 index 506bf78a..00000000 --- a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsController.sol +++ /dev/null @@ -1,206 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.10; - -import {IRewardsDistributor} from './IRewardsDistributor.sol'; -import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol'; -import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; - -/** - * @title IRewardsController - * @author Aave - * @notice Defines the basic interface for a Rewards Controller. - */ -interface IRewardsController is IRewardsDistributor { - /** - * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user - * @param user The address of the user - * @param claimer The address of the claimer - */ - event ClaimerSet(address indexed user, address indexed claimer); - - /** - * @dev Emitted when rewards are claimed - * @param user The address of the user rewards has been claimed on behalf of - * @param reward The address of the token reward is claimed - * @param to The address of the receiver of the rewards - * @param claimer The address of the claimer - * @param amount The amount of rewards claimed - */ - event RewardsClaimed( - address indexed user, - address indexed reward, - address indexed to, - address claimer, - uint256 amount - ); - - /** - * @dev Emitted when a transfer strategy is installed for the reward distribution - * @param reward The address of the token reward - * @param transferStrategy The address of TransferStrategy contract - */ - event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); - - /** - * @dev Emitted when the reward oracle is updated - * @param reward The address of the token reward - * @param rewardOracle The address of oracle - */ - event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Get the price aggregator oracle address - * @param reward The address of the reward - * @return The price oracle of the reward - */ - function getRewardOracle(address reward) external view returns (address); - - /** - * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) - * @param user The address of the user - * @return The claimer address - */ - function getClaimer(address user) external view returns (address); - - /** - * @dev Returns the Transfer Strategy implementation contract address being used for a reward address - * @param reward The address of the reward - * @return The address of the TransferStrategy contract - */ - function getTransferStrategy(address reward) external view returns (address); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - **/ - function handleAction( - address user, - uint256 totalSupply, - uint256 userBalance - ) external; - - /** - * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The - * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external returns (uint256); - - /** - * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" - **/ - function claimAllRewards(address[] calldata assets, address to) - external - returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must - * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsToSelf(address[] calldata assets) - external - returns (address[] memory rewardsList, uint256[] memory claimedAmounts); -} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsDistributor.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsDistributor.sol deleted file mode 100644 index c18de27a..00000000 --- a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/IRewardsDistributor.sol +++ /dev/null @@ -1,186 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.10; - -/** - * @title IRewardsDistributor - * @author Aave - * @notice Defines the basic interface for a Rewards Distributor. - */ -interface IRewardsDistributor { - /** - * @dev Emitted when the configuration of the rewards of an asset is updated. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param oldEmission The old emissions per second value of the reward distribution - * @param newEmission The new emissions per second value of the reward distribution - * @param oldDistributionEnd The old end timestamp of the reward distribution - * @param newDistributionEnd The new end timestamp of the reward distribution - * @param assetIndex The index of the asset distribution - */ - event AssetConfigUpdated( - address indexed asset, - address indexed reward, - uint256 oldEmission, - uint256 newEmission, - uint256 oldDistributionEnd, - uint256 newDistributionEnd, - uint256 assetIndex - ); - - /** - * @dev Emitted when rewards of an asset are accrued on behalf of a user. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param user The address of the user that rewards are accrued on behalf of - * @param assetIndex The index of the asset distribution - * @param userIndex The index of the asset distribution on behalf of the user - * @param rewardsAccrued The amount of rewards accrued - */ - event Accrued( - address indexed asset, - address indexed reward, - address indexed user, - uint256 assetIndex, - uint256 userIndex, - uint256 rewardsAccrued - ); - - /** - * @dev Sets the end date for the distribution - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd( - address asset, - address reward, - uint32 newDistributionEnd - ) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Gets the end date for the distribution - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The timestamp with the end of the distribution, in unix time format - **/ - function getDistributionEnd(address asset, address reward) external view returns (uint256); - - /** - * @dev Returns the index of a user on a reward distribution - * @param user Address of the user - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The current user asset index, not including new distributions - **/ - function getUserAssetIndex( - address user, - address asset, - address reward - ) external view returns (uint256); - - /** - * @dev Returns the configuration of the distribution reward for a certain asset - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The index of the asset distribution - * @return The emission per second of the reward distribution - * @return The timestamp of the last update of the index - * @return The timestamp of the distribution end - **/ - function getRewardsData(address asset, address reward) - external - view - returns ( - uint256, - uint256, - uint256, - uint256 - ); - - /** - * @dev Calculates the next value of an specific distribution index, with validations. - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The old index of the asset distribution - * @return The new index of the asset distribution - **/ - function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); - - /** - * @dev Returns the list of available reward token addresses of an incentivized asset - * @param asset The incentivized asset - * @return List of rewards addresses of the input asset - **/ - function getRewardsByAsset(address asset) external view returns (address[] memory); - - /** - * @dev Returns the list of available reward addresses - * @return List of rewards supported in this contract - **/ - function getRewardsList() external view returns (address[] memory); - - /** - * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. - * @param user The address of the user - * @param reward The address of the reward token - * @return Unclaimed rewards, not including new distributions - **/ - function getUserAccruedRewards(address user, address reward) external view returns (uint256); - - /** - * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @param reward The address of the reward token - * @return The rewards amount - **/ - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view returns (uint256); - - /** - * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @return The list of reward addresses - * @return The list of unclaimed amount of rewards - **/ - function getAllUserRewards(address[] calldata assets, address user) - external - view - returns (address[] memory, uint256[] memory); - - /** - * @dev Returns the decimals of an asset to calculate the distribution delta - * @param asset The address to retrieve decimals - * @return The decimals of an underlying asset - */ - function getAssetDecimals(address asset) external view returns (uint8); - - /** - * @dev Returns the address of the emission manager - * @return The address of the EmissionManager - */ - function EMISSION_MANAGER() external view returns (address); - - /** - * @dev Returns the address of the emission manager. - * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. - * @return The address of the EmissionManager - */ - function getEmissionManager() external view returns (address); -} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/ITransferStrategyBase.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/ITransferStrategyBase.sol deleted file mode 100644 index b1007a01..00000000 --- a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/interfaces/ITransferStrategyBase.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.10; - -interface ITransferStrategyBase { - event EmergencyWithdrawal( - address indexed caller, - address indexed token, - address indexed to, - uint256 amount - ); - - /** - * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation - * @param to Account to transfer rewards - * @param reward Address of the reward token - * @param amount Amount to transfer to the "to" address parameter - * @return Returns true bool if transfer logic succeeds - */ - function performTransfer( - address to, - address reward, - uint256 amount - ) external returns (bool); - - /** - * @return Returns the address of the Incentives Controller - */ - function getIncentivesController() external view returns (address); - - /** - * @return Returns the address of the Rewards admin - */ - function getRewardsAdmin() external view returns (address); - - /** - * @dev Perform an emergency token withdrawal only callable by the Rewards admin - * @param token Address of the token to withdraw funds from this contract - * @param to Address of the recipient of the withdrawal - * @param amount Amount of the withdrawal - */ - function emergencyWithdrawal( - address token, - address to, - uint256 amount - ) external; -} diff --git a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/libraries/RewardsDataTypes.sol b/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/libraries/RewardsDataTypes.sol deleted file mode 100644 index 64e09578..00000000 --- a/downloads/ARBITRUM/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/lib/aave-v3-periphery/contracts/rewards/libraries/RewardsDataTypes.sol +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.10; - -import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol'; - -library RewardsDataTypes { - struct RewardsConfigInput { - uint88 emissionPerSecond; - uint256 totalSupply; - uint32 distributionEnd; - address asset; - address reward; - ITransferStrategyBase transferStrategy; - IEACAggregatorProxy rewardOracle; - } - - struct UserAssetBalance { - address asset; - uint256 userBalance; - uint256 totalSupply; - } - - struct UserData { - // Liquidity index of the reward distribution for the user - uint104 index; - // Amount of accrued rewards for the user since last user index update - uint128 accrued; - } - - struct RewardData { - // Liquidity index of the reward distribution - uint104 index; - // Amount of reward tokens distributed per second - uint88 emissionPerSecond; - // Timestamp of the last reward index update - uint32 lastUpdateTimestamp; - // The end of the distribution of rewards (in seconds) - uint32 distributionEnd; - // Map of user addresses and their rewards data (userAddress => userData) - mapping(address => UserData) usersData; - } - - struct AssetData { - // Map of reward token addresses and their data (rewardTokenAddress => rewardData) - mapping(address => RewardData) rewards; - // List of reward token addresses for the asset - mapping(uint128 => address) availableRewards; - // Count of reward tokens for the asset - uint128 availableRewardsCount; - // Number of decimals of the asset - uint8 decimals; - } -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol deleted file mode 100644 index d6d70f17..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol +++ /dev/null @@ -1,3058 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity =0.8.10 ^0.8.0; - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/ICreditDelegationToken.sol - -/** - * @title ICreditDelegationToken - * @author Aave - * @notice Defines the basic interface for a token supporting credit delegation. - */ -interface ICreditDelegationToken { - /** - * @dev Emitted on `approveDelegation` and `borrowAllowance - * @param fromUser The address of the delegator - * @param toUser The address of the delegatee - * @param asset The address of the delegated asset - * @param amount The amount being delegated - */ - event BorrowAllowanceDelegated( - address indexed fromUser, - address indexed toUser, - address indexed asset, - uint256 amount - ); - - /** - * @notice Delegates borrowing power to a user on the specific debt token. - * Delegation will still respect the liquidation constraints (even if delegated, a - * delegatee cannot force a delegator HF to go below 1) - * @param delegatee The address receiving the delegated borrowing power - * @param amount The maximum amount being delegated. - */ - function approveDelegation(address delegatee, uint256 amount) external; - - /** - * @notice Returns the borrow allowance of the user - * @param fromUser The user to giving allowance - * @param toUser The user to give allowance to - * @return The current allowance of `toUser` - */ - function borrowAllowance(address fromUser, address toUser) external view returns (uint256); - - /** - * @notice Delegates borrowing power to a user on the specific debt token via ERC712 signature - * @param delegator The delegator of the credit - * @param delegatee The delegatee that can use the credit - * @param value The amount to be delegated - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v The V signature param - * @param s The S signature param - * @param r The R signature param - */ - function delegationWithSig( - address delegator, - address delegatee, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - //the current stable borrow rate. Expressed in ray - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - //stableDebtToken address - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62-63: reserved - //bit 64-79: reserve factor - //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167 liquidation protocol fee - //bit 168-175 eMode category - //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // each eMode category may or may not have a custom oracle to override the individual assets price oracles - address priceSource; - string label; - } - - enum InterestRateMode { - NONE, - STABLE, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currPrincipalStableDebt; - uint256 currAvgStableBorrowRate; - uint256 currTotalStableDebt; - uint256 nextAvgStableBorrowRate; - uint256 nextTotalStableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address stableDebtTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - uint40 stableDebtLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address addressesProvider; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 maxStableLoanPercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalStableDebt; - uint256 totalVariableDebt; - uint256 averageStableBorrowRate; - uint256 reserveFactor; - address reserve; - address aToken; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address stableDebtAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol - -/** - * @title EIP712Base - * @author Aave - * @notice Base contract implementation of EIP712. - */ -abstract contract EIP712Base { - bytes public constant EIP712_REVISION = bytes('1'); - bytes32 internal constant EIP712_DOMAIN = - keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); - - // Map of address nonces (address => nonce) - mapping(address => uint256) internal _nonces; - - bytes32 internal _domainSeparator; - uint256 internal immutable _chainId; - - /** - * @dev Constructor. - */ - constructor() { - _chainId = block.chainid; - } - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { - if (block.chainid == _chainId) { - return _domainSeparator; - } - return _calculateDomainSeparator(); - } - - /** - * @notice Returns the nonce value for address specified as parameter - * @param owner The address for which the nonce is being returned - * @return The nonce value for the input address` - */ - function nonces(address owner) public view virtual returns (uint256) { - return _nonces[owner]; - } - - /** - * @notice Compute the current domain separator - * @return The domain separator for the token - */ - function _calculateDomainSeparator() internal view returns (bytes32) { - return - keccak256( - abi.encode( - EIP712_DOMAIN, - keccak256(bytes(_EIP712BaseId())), - keccak256(EIP712_REVISION), - block.chainid, - address(this) - ) - ); - } - - /** - * @notice Returns the user readable name of signing domain (e.g. token name) - * @return The name of the signing domain - */ - function _EIP712BaseId() internal view virtual returns (string memory); -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on swapBorrowRateMode() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user swapping his rate mode - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - */ - event SwapBorrowRateMode( - address indexed reserve, - address indexed user, - DataTypes.InterestRateMode interestRateMode - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on rebalanceStableBorrowRate() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user for which the rebalance has been executed - */ - event RebalanceStableBorrowRate(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the - * corresponding debt token (StableDebtToken or VariableDebtToken) - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 stable/variable debt tokens, depending on the `interestRateMode` - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa - * @param asset The address of the underlying asset borrowed - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - */ - function swapBorrowRateMode(address asset, uint256 interestRateMode) external; - - /** - * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. - * - Users can be rebalanced if the following conditions are satisfied: - * 1. Usage ratio is above 95% - * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too - * much has been borrowed at a stable rate and suppliers are not earning enough - * @param asset The address of the underlying asset borrowed - * @param user The address of the user to be rebalanced - */ - function rebalanceStableBorrowRate(address asset, address user) external; - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address stableDebtAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new category for the eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; - - /** - * @notice Returns the data of an eMode category - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate - * @return The percentage of available liquidity to borrow, expressed in bps - */ - function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/DebtTokenBase.sol - -/** - * @title DebtTokenBase - * @author Aave - * @notice Base contract for different types of debt tokens, like StableDebtToken or VariableDebtToken - */ -abstract contract DebtTokenBase is - VersionedInitializable, - EIP712Base, - Context, - ICreditDelegationToken -{ - // Map of borrow allowances (delegator => delegatee => borrowAllowanceAmount) - mapping(address => mapping(address => uint256)) internal _borrowAllowances; - - // Credit Delegation Typehash - bytes32 public constant DELEGATION_WITH_SIG_TYPEHASH = - keccak256('DelegationWithSig(address delegatee,uint256 value,uint256 nonce,uint256 deadline)'); - - address internal _underlyingAsset; - - /** - * @dev Constructor. - */ - constructor() EIP712Base() { - // Intentionally left blank - } - - /// @inheritdoc ICreditDelegationToken - function approveDelegation(address delegatee, uint256 amount) external override { - _approveDelegation(_msgSender(), delegatee, amount); - } - - /// @inheritdoc ICreditDelegationToken - function delegationWithSig( - address delegator, - address delegatee, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external { - require(delegator != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - //solium-disable-next-line - require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); - uint256 currentValidNonce = _nonces[delegator]; - bytes32 digest = keccak256( - abi.encodePacked( - '\x19\x01', - DOMAIN_SEPARATOR(), - keccak256( - abi.encode(DELEGATION_WITH_SIG_TYPEHASH, delegatee, value, currentValidNonce, deadline) - ) - ) - ); - require(delegator == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); - _nonces[delegator] = currentValidNonce + 1; - _approveDelegation(delegator, delegatee, value); - } - - /// @inheritdoc ICreditDelegationToken - function borrowAllowance( - address fromUser, - address toUser - ) external view override returns (uint256) { - return _borrowAllowances[fromUser][toUser]; - } - - /** - * @notice Updates the borrow allowance of a user on the specific debt token. - * @param delegator The address delegating the borrowing power - * @param delegatee The address receiving the delegated borrowing power - * @param amount The allowance amount being delegated. - */ - function _approveDelegation(address delegator, address delegatee, uint256 amount) internal { - _borrowAllowances[delegator][delegatee] = amount; - emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, amount); - } - - /** - * @notice Decreases the borrow allowance of a user on the specific debt token. - * @param delegator The address delegating the borrowing power - * @param delegatee The address receiving the delegated borrowing power - * @param amount The amount to subtract from the current allowance - */ - function _decreaseBorrowAllowance(address delegator, address delegatee, uint256 amount) internal { - uint256 newAllowance = _borrowAllowances[delegator][delegatee] - amount; - - _borrowAllowances[delegator][delegatee] = newAllowance; - - emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, newAllowance); - } -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. StableDebtTokens use - * this field to store the user's stable rate. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor(IPool pool, string memory name, string memory symbol, uint8 decimals) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name; - _symbol = symbol; - _decimals = decimals; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol - -/** - * @title MintableIncentivizedERC20 - * @author Aave - * @notice Implements mint and burn functions for IncentivizedERC20 - */ -abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) IncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /** - * @notice Mints tokens to an account and apply incentives if defined - * @param account The address receiving tokens - * @param amount The amount of tokens to mint - */ - function _mint(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply + amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } - - /** - * @notice Burns tokens from an account and apply incentives if defined - * @param account The account whose tokens are burnt - * @param amount The amount of tokens to burn - */ - function _burn(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply - amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance - amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol - -/** - * @title ScaledBalanceTokenBase - * @author Aave - * @notice Basic ERC20 implementation of scaled balance token - */ -abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) MintableIncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /// @inheritdoc IScaledBalanceToken - function scaledBalanceOf(address user) external view override returns (uint256) { - return super.balanceOf(user); - } - - /// @inheritdoc IScaledBalanceToken - function getScaledUserBalanceAndSupply( - address user - ) external view override returns (uint256, uint256) { - return (super.balanceOf(user), super.totalSupply()); - } - - /// @inheritdoc IScaledBalanceToken - function scaledTotalSupply() public view virtual override returns (uint256) { - return super.totalSupply(); - } - - /// @inheritdoc IScaledBalanceToken - function getPreviousIndex(address user) external view virtual override returns (uint256) { - return _userState[user].additionalData; - } - - /** - * @notice Implements the basic logic to mint a scaled balance token. - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the scaled tokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function _mintScaled( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) internal returns (bool) { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); - - uint256 scaledBalance = super.balanceOf(onBehalfOf); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[onBehalfOf].additionalData); - - _userState[onBehalfOf].additionalData = index.toUint128(); - - _mint(onBehalfOf, amountScaled.toUint128()); - - uint256 amountToMint = amount + balanceIncrease; - emit Transfer(address(0), onBehalfOf, amountToMint); - emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); - - return (scaledBalance == 0); - } - - /** - * @notice Implements the basic logic to burn a scaled balance token. - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param user The user which debt is burnt - * @param target The address that will receive the underlying, if any - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - */ - function _burnScaled(address user, address target, uint256 amount, uint256 index) internal { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); - - uint256 scaledBalance = super.balanceOf(user); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[user].additionalData); - - _userState[user].additionalData = index.toUint128(); - - _burn(user, amountScaled.toUint128()); - - if (balanceIncrease > amount) { - uint256 amountToMint = balanceIncrease - amount; - emit Transfer(address(0), user, amountToMint); - emit Mint(user, user, amountToMint, balanceIncrease, index); - } else { - uint256 amountToBurn = amount - balanceIncrease; - emit Transfer(user, address(0), amountToBurn); - emit Burn(user, target, amountToBurn, balanceIncrease, index); - } - } - - /** - * @notice Implements the basic logic to transfer scaled balance tokens between two users - * @dev It emits a mint event with the interest accrued per user - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - * @param index The next liquidity index of the reserve - */ - function _transfer(address sender, address recipient, uint256 amount, uint256 index) internal { - uint256 senderScaledBalance = super.balanceOf(sender); - uint256 senderBalanceIncrease = senderScaledBalance.rayMul(index) - - senderScaledBalance.rayMul(_userState[sender].additionalData); - - uint256 recipientScaledBalance = super.balanceOf(recipient); - uint256 recipientBalanceIncrease = recipientScaledBalance.rayMul(index) - - recipientScaledBalance.rayMul(_userState[recipient].additionalData); - - _userState[sender].additionalData = index.toUint128(); - _userState[recipient].additionalData = index.toUint128(); - - super._transfer(sender, recipient, amount.rayDiv(index).toUint128()); - - if (senderBalanceIncrease > 0) { - emit Transfer(address(0), sender, senderBalanceIncrease); - emit Mint(_msgSender(), sender, senderBalanceIncrease, senderBalanceIncrease, index); - } - - if (sender != recipient && recipientBalanceIncrease > 0) { - emit Transfer(address(0), recipient, recipientBalanceIncrease); - emit Mint(_msgSender(), recipient, recipientBalanceIncrease, recipientBalanceIncrease, index); - } - - emit Transfer(sender, recipient, amount); - } -} - -// downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/VariableDebtToken.sol - -/** - * @title VariableDebtToken - * @author Aave - * @notice Implements a variable debt token to track the borrowing positions of users - * at variable rate mode - * @dev Transfer and approve functionalities are disabled since its a non-transferable token - */ -contract VariableDebtToken is DebtTokenBase, ScaledBalanceTokenBase, IVariableDebtToken { - using WadRayMath for uint256; - using SafeCast for uint256; - - uint256 public constant DEBT_TOKEN_REVISION = 0x2; - - /** - * @dev Constructor. - * @param pool The address of the Pool contract - */ - constructor( - IPool pool - ) - DebtTokenBase() - ScaledBalanceTokenBase(pool, 'VARIABLE_DEBT_TOKEN_IMPL', 'VARIABLE_DEBT_TOKEN_IMPL', 0) - { - // Intentionally left blank - } - - /// @inheritdoc IInitializableDebtToken - function initialize( - IPool initializingPool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external override initializer { - require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); - _setName(debtTokenName); - _setSymbol(debtTokenSymbol); - _setDecimals(debtTokenDecimals); - - _underlyingAsset = underlyingAsset; - _incentivesController = incentivesController; - - _domainSeparator = _calculateDomainSeparator(); - - emit Initialized( - underlyingAsset, - address(POOL), - address(incentivesController), - debtTokenDecimals, - debtTokenName, - debtTokenSymbol, - params - ); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return DEBT_TOKEN_REVISION; - } - - /// @inheritdoc IERC20 - function balanceOf(address user) public view virtual override returns (uint256) { - uint256 scaledBalance = super.balanceOf(user); - - if (scaledBalance == 0) { - return 0; - } - - return scaledBalance.rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); - } - - /// @inheritdoc IVariableDebtToken - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external virtual override onlyPool returns (bool, uint256) { - if (user != onBehalfOf) { - _decreaseBorrowAllowance(onBehalfOf, user, amount); - } - return (_mintScaled(user, onBehalfOf, amount, index), scaledTotalSupply()); - } - - /// @inheritdoc IVariableDebtToken - function burn( - address from, - uint256 amount, - uint256 index - ) external virtual override onlyPool returns (uint256) { - _burnScaled(from, address(0), amount, index); - return scaledTotalSupply(); - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return super.totalSupply().rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); - } - - /// @inheritdoc EIP712Base - function _EIP712BaseId() internal view override returns (string memory) { - return name(); - } - - /** - * @dev Being non transferrable, the debt token does not implement any of the - * standard ERC20 functions for transfer and allowance. - */ - function transfer(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function allowance(address, address) external view virtual override returns (uint256) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function approve(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function transferFrom(address, address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function increaseAllowance(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function decreaseAllowance(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - /// @inheritdoc IVariableDebtToken - function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { - return _underlyingAsset; - } -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 445ee640..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 1d470e01..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index 6303454f..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index 6d708093..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity 0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol deleted file mode 100644 index d5d97ceb..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index c06c605a..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/ICreditDelegationToken.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/ICreditDelegationToken.sol deleted file mode 100644 index 323118f1..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/ICreditDelegationToken.sol +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -/** - * @title ICreditDelegationToken - * @author Aave - * @notice Defines the basic interface for a token supporting credit delegation. - */ -interface ICreditDelegationToken { - /** - * @dev Emitted on `approveDelegation` and `borrowAllowance - * @param fromUser The address of the delegator - * @param toUser The address of the delegatee - * @param asset The address of the delegated asset - * @param amount The amount being delegated - */ - event BorrowAllowanceDelegated( - address indexed fromUser, - address indexed toUser, - address indexed asset, - uint256 amount - ); - - /** - * @notice Delegates borrowing power to a user on the specific debt token. - * Delegation will still respect the liquidation constraints (even if delegated, a - * delegatee cannot force a delegator HF to go below 1) - * @param delegatee The address receiving the delegated borrowing power - * @param amount The maximum amount being delegated. - */ - function approveDelegation(address delegatee, uint256 amount) external; - - /** - * @notice Returns the borrow allowance of the user - * @param fromUser The user to giving allowance - * @param toUser The user to give allowance to - * @return The current allowance of `toUser` - */ - function borrowAllowance(address fromUser, address toUser) external view returns (uint256); - - /** - * @notice Delegates borrowing power to a user on the specific debt token via ERC712 signature - * @param delegator The delegator of the credit - * @param delegatee The delegatee that can use the credit - * @param value The amount to be delegated - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v The V signature param - * @param s The S signature param - * @param r The R signature param - */ - function delegationWithSig( - address delegator, - address delegatee, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index ad8cd7c6..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPool.sol deleted file mode 100644 index ef306e73..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,737 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on swapBorrowRateMode() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user swapping his rate mode - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - */ - event SwapBorrowRateMode( - address indexed reserve, - address indexed user, - DataTypes.InterestRateMode interestRateMode - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on rebalanceStableBorrowRate() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user for which the rebalance has been executed - */ - event RebalanceStableBorrowRate(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the - * corresponding debt token (StableDebtToken or VariableDebtToken) - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 stable/variable debt tokens, depending on the `interestRateMode` - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa - * @param asset The address of the underlying asset borrowed - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - */ - function swapBorrowRateMode(address asset, uint256 interestRateMode) external; - - /** - * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. - * - Users can be rebalanced if the following conditions are satisfied: - * 1. Usage ratio is above 95% - * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too - * much has been borrowed at a stable rate and suppliers are not earning enough - * @param asset The address of the underlying asset borrowed - * @param user The address of the user to be rebalanced - */ - function rebalanceStableBorrowRate(address asset, address user) external; - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address stableDebtAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new category for the eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; - - /** - * @notice Returns the data of an eMode category - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate - * @return The percentage of available liquidity to borrow, expressed in bps - */ - function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index 587a0d0b..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index fe311fbb..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 50602e6c..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol deleted file mode 100644 index d24312bf..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index 990069e0..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 8589dc0a..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,264 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -library DataTypes { - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - //the current stable borrow rate. Expressed in ray - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - //stableDebtToken address - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62-63: reserved - //bit 64-79: reserve factor - //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167 liquidation protocol fee - //bit 168-175 eMode category - //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // each eMode category may or may not have a custom oracle to override the individual assets price oracles - address priceSource; - string label; - } - - enum InterestRateMode {NONE, STABLE, VARIABLE} - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currPrincipalStableDebt; - uint256 currAvgStableBorrowRate; - uint256 currTotalStableDebt; - uint256 nextAvgStableBorrowRate; - uint256 nextTotalStableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address stableDebtTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - uint40 stableDebtLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address addressesProvider; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 maxStableLoanPercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalStableDebt; - uint256 totalVariableDebt; - uint256 averageStableBorrowRate; - uint256 reserveFactor; - address reserve; - address aToken; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address stableDebtAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/VariableDebtToken.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/VariableDebtToken.sol deleted file mode 100644 index fab54633..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/VariableDebtToken.sol +++ /dev/null @@ -1,155 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {SafeCast} from '../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {VersionedInitializable} from '../libraries/aave-upgradeability/VersionedInitializable.sol'; -import {WadRayMath} from '../libraries/math/WadRayMath.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; -import {IPool} from '../../interfaces/IPool.sol'; -import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; -import {IInitializableDebtToken} from '../../interfaces/IInitializableDebtToken.sol'; -import {IVariableDebtToken} from '../../interfaces/IVariableDebtToken.sol'; -import {EIP712Base} from './base/EIP712Base.sol'; -import {DebtTokenBase} from './base/DebtTokenBase.sol'; -import {ScaledBalanceTokenBase} from './base/ScaledBalanceTokenBase.sol'; - -/** - * @title VariableDebtToken - * @author Aave - * @notice Implements a variable debt token to track the borrowing positions of users - * at variable rate mode - * @dev Transfer and approve functionalities are disabled since its a non-transferable token - */ -contract VariableDebtToken is DebtTokenBase, ScaledBalanceTokenBase, IVariableDebtToken { - using WadRayMath for uint256; - using SafeCast for uint256; - - uint256 public constant DEBT_TOKEN_REVISION = 0x2; - - /** - * @dev Constructor. - * @param pool The address of the Pool contract - */ - constructor( - IPool pool - ) - DebtTokenBase() - ScaledBalanceTokenBase(pool, 'VARIABLE_DEBT_TOKEN_IMPL', 'VARIABLE_DEBT_TOKEN_IMPL', 0) - { - // Intentionally left blank - } - - /// @inheritdoc IInitializableDebtToken - function initialize( - IPool initializingPool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external override initializer { - require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); - _setName(debtTokenName); - _setSymbol(debtTokenSymbol); - _setDecimals(debtTokenDecimals); - - _underlyingAsset = underlyingAsset; - _incentivesController = incentivesController; - - _domainSeparator = _calculateDomainSeparator(); - - emit Initialized( - underlyingAsset, - address(POOL), - address(incentivesController), - debtTokenDecimals, - debtTokenName, - debtTokenSymbol, - params - ); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return DEBT_TOKEN_REVISION; - } - - /// @inheritdoc IERC20 - function balanceOf(address user) public view virtual override returns (uint256) { - uint256 scaledBalance = super.balanceOf(user); - - if (scaledBalance == 0) { - return 0; - } - - return scaledBalance.rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); - } - - /// @inheritdoc IVariableDebtToken - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external virtual override onlyPool returns (bool, uint256) { - if (user != onBehalfOf) { - _decreaseBorrowAllowance(onBehalfOf, user, amount); - } - return (_mintScaled(user, onBehalfOf, amount, index), scaledTotalSupply()); - } - - /// @inheritdoc IVariableDebtToken - function burn( - address from, - uint256 amount, - uint256 index - ) external virtual override onlyPool returns (uint256) { - _burnScaled(from, address(0), amount, index); - return scaledTotalSupply(); - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return super.totalSupply().rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); - } - - /// @inheritdoc EIP712Base - function _EIP712BaseId() internal view override returns (string memory) { - return name(); - } - - /** - * @dev Being non transferrable, the debt token does not implement any of the - * standard ERC20 functions for transfer and allowance. - */ - function transfer(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function allowance(address, address) external view virtual override returns (uint256) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function approve(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function transferFrom(address, address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function increaseAllowance(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function decreaseAllowance(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - /// @inheritdoc IVariableDebtToken - function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { - return _underlyingAsset; - } -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/DebtTokenBase.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/DebtTokenBase.sol deleted file mode 100644 index 4ba95f29..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/DebtTokenBase.sol +++ /dev/null @@ -1,102 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {VersionedInitializable} from '../../libraries/aave-upgradeability/VersionedInitializable.sol'; -import {ICreditDelegationToken} from '../../../interfaces/ICreditDelegationToken.sol'; -import {EIP712Base} from './EIP712Base.sol'; - -/** - * @title DebtTokenBase - * @author Aave - * @notice Base contract for different types of debt tokens, like StableDebtToken or VariableDebtToken - */ -abstract contract DebtTokenBase is - VersionedInitializable, - EIP712Base, - Context, - ICreditDelegationToken -{ - // Map of borrow allowances (delegator => delegatee => borrowAllowanceAmount) - mapping(address => mapping(address => uint256)) internal _borrowAllowances; - - // Credit Delegation Typehash - bytes32 public constant DELEGATION_WITH_SIG_TYPEHASH = - keccak256('DelegationWithSig(address delegatee,uint256 value,uint256 nonce,uint256 deadline)'); - - address internal _underlyingAsset; - - /** - * @dev Constructor. - */ - constructor() EIP712Base() { - // Intentionally left blank - } - - /// @inheritdoc ICreditDelegationToken - function approveDelegation(address delegatee, uint256 amount) external override { - _approveDelegation(_msgSender(), delegatee, amount); - } - - /// @inheritdoc ICreditDelegationToken - function delegationWithSig( - address delegator, - address delegatee, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external { - require(delegator != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - //solium-disable-next-line - require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); - uint256 currentValidNonce = _nonces[delegator]; - bytes32 digest = keccak256( - abi.encodePacked( - '\x19\x01', - DOMAIN_SEPARATOR(), - keccak256( - abi.encode(DELEGATION_WITH_SIG_TYPEHASH, delegatee, value, currentValidNonce, deadline) - ) - ) - ); - require(delegator == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); - _nonces[delegator] = currentValidNonce + 1; - _approveDelegation(delegator, delegatee, value); - } - - /// @inheritdoc ICreditDelegationToken - function borrowAllowance( - address fromUser, - address toUser - ) external view override returns (uint256) { - return _borrowAllowances[fromUser][toUser]; - } - - /** - * @notice Updates the borrow allowance of a user on the specific debt token. - * @param delegator The address delegating the borrowing power - * @param delegatee The address receiving the delegated borrowing power - * @param amount The allowance amount being delegated. - */ - function _approveDelegation(address delegator, address delegatee, uint256 amount) internal { - _borrowAllowances[delegator][delegatee] = amount; - emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, amount); - } - - /** - * @notice Decreases the borrow allowance of a user on the specific debt token. - * @param delegator The address delegating the borrowing power - * @param delegatee The address receiving the delegated borrowing power - * @param amount The amount to subtract from the current allowance - */ - function _decreaseBorrowAllowance(address delegator, address delegatee, uint256 amount) internal { - uint256 newAllowance = _borrowAllowances[delegator][delegatee] - amount; - - _borrowAllowances[delegator][delegatee] = newAllowance; - - emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, newAllowance); - } -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol deleted file mode 100644 index afe9dd8b..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/EIP712Base.sol +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -/** - * @title EIP712Base - * @author Aave - * @notice Base contract implementation of EIP712. - */ -abstract contract EIP712Base { - bytes public constant EIP712_REVISION = bytes('1'); - bytes32 internal constant EIP712_DOMAIN = - keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); - - // Map of address nonces (address => nonce) - mapping(address => uint256) internal _nonces; - - bytes32 internal _domainSeparator; - uint256 internal immutable _chainId; - - /** - * @dev Constructor. - */ - constructor() { - _chainId = block.chainid; - } - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { - if (block.chainid == _chainId) { - return _domainSeparator; - } - return _calculateDomainSeparator(); - } - - /** - * @notice Returns the nonce value for address specified as parameter - * @param owner The address for which the nonce is being returned - * @return The nonce value for the input address` - */ - function nonces(address owner) public view virtual returns (uint256) { - return _nonces[owner]; - } - - /** - * @notice Compute the current domain separator - * @return The domain separator for the token - */ - function _calculateDomainSeparator() internal view returns (bytes32) { - return - keccak256( - abi.encode( - EIP712_DOMAIN, - keccak256(bytes(_EIP712BaseId())), - keccak256(EIP712_REVISION), - block.chainid, - address(this) - ) - ); - } - - /** - * @notice Returns the user readable name of signing domain (e.g. token name) - * @return The name of the signing domain - */ - function _EIP712BaseId() internal view virtual returns (string memory); -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 08a219e0..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,235 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. StableDebtTokens use - * this field to store the user's stable rate. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor(IPool pool, string memory name, string memory symbol, uint8 decimals) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name; - _symbol = symbol; - _decimals = decimals; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol deleted file mode 100644 index 6d2120e3..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IncentivizedERC20} from './IncentivizedERC20.sol'; - -/** - * @title MintableIncentivizedERC20 - * @author Aave - * @notice Implements mint and burn functions for IncentivizedERC20 - */ -abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) IncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /** - * @notice Mints tokens to an account and apply incentives if defined - * @param account The address receiving tokens - * @param amount The amount of tokens to mint - */ - function _mint(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply + amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } - - /** - * @notice Burns tokens from an account and apply incentives if defined - * @param account The account whose tokens are burnt - * @param amount The amount of tokens to burn - */ - function _burn(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply - amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance - amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } -} diff --git a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol b/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol deleted file mode 100644 index d0010e5f..00000000 --- a/downloads/ARBITRUM/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtToken/lib/aave-v3-core/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol +++ /dev/null @@ -1,156 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {MintableIncentivizedERC20} from './MintableIncentivizedERC20.sol'; - -/** - * @title ScaledBalanceTokenBase - * @author Aave - * @notice Basic ERC20 implementation of scaled balance token - */ -abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) MintableIncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /// @inheritdoc IScaledBalanceToken - function scaledBalanceOf(address user) external view override returns (uint256) { - return super.balanceOf(user); - } - - /// @inheritdoc IScaledBalanceToken - function getScaledUserBalanceAndSupply( - address user - ) external view override returns (uint256, uint256) { - return (super.balanceOf(user), super.totalSupply()); - } - - /// @inheritdoc IScaledBalanceToken - function scaledTotalSupply() public view virtual override returns (uint256) { - return super.totalSupply(); - } - - /// @inheritdoc IScaledBalanceToken - function getPreviousIndex(address user) external view virtual override returns (uint256) { - return _userState[user].additionalData; - } - - /** - * @notice Implements the basic logic to mint a scaled balance token. - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the scaled tokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function _mintScaled( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) internal returns (bool) { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); - - uint256 scaledBalance = super.balanceOf(onBehalfOf); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[onBehalfOf].additionalData); - - _userState[onBehalfOf].additionalData = index.toUint128(); - - _mint(onBehalfOf, amountScaled.toUint128()); - - uint256 amountToMint = amount + balanceIncrease; - emit Transfer(address(0), onBehalfOf, amountToMint); - emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); - - return (scaledBalance == 0); - } - - /** - * @notice Implements the basic logic to burn a scaled balance token. - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param user The user which debt is burnt - * @param target The address that will receive the underlying, if any - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - */ - function _burnScaled(address user, address target, uint256 amount, uint256 index) internal { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); - - uint256 scaledBalance = super.balanceOf(user); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[user].additionalData); - - _userState[user].additionalData = index.toUint128(); - - _burn(user, amountScaled.toUint128()); - - if (balanceIncrease > amount) { - uint256 amountToMint = balanceIncrease - amount; - emit Transfer(address(0), user, amountToMint); - emit Mint(user, user, amountToMint, balanceIncrease, index); - } else { - uint256 amountToBurn = amount - balanceIncrease; - emit Transfer(user, address(0), amountToBurn); - emit Burn(user, target, amountToBurn, balanceIncrease, index); - } - } - - /** - * @notice Implements the basic logic to transfer scaled balance tokens between two users - * @dev It emits a mint event with the interest accrued per user - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - * @param index The next liquidity index of the reserve - */ - function _transfer(address sender, address recipient, uint256 amount, uint256 index) internal { - uint256 senderScaledBalance = super.balanceOf(sender); - uint256 senderBalanceIncrease = senderScaledBalance.rayMul(index) - - senderScaledBalance.rayMul(_userState[sender].additionalData); - - uint256 recipientScaledBalance = super.balanceOf(recipient); - uint256 recipientBalanceIncrease = recipientScaledBalance.rayMul(index) - - recipientScaledBalance.rayMul(_userState[recipient].additionalData); - - _userState[sender].additionalData = index.toUint128(); - _userState[recipient].additionalData = index.toUint128(); - - super._transfer(sender, recipient, amount.rayDiv(index).toUint128()); - - if (senderBalanceIncrease > 0) { - emit Transfer(address(0), sender, senderBalanceIncrease); - emit Mint(_msgSender(), sender, senderBalanceIncrease, senderBalanceIncrease, index); - } - - if (sender != recipient && recipientBalanceIncrease > 0) { - emit Transfer(address(0), recipient, recipientBalanceIncrease); - emit Mint(_msgSender(), recipient, recipientBalanceIncrease, recipientBalanceIncrease, index); - } - - emit Transfer(sender, recipient, amount); - } -} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER.sol b/downloads/ARBITRUM/EMISSION_MANAGER.sol deleted file mode 100644 index be75e57e..00000000 --- a/downloads/ARBITRUM/EMISSION_MANAGER.sol +++ /dev/null @@ -1,791 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity =0.8.10; - -// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} - -// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol - -/** - * @title IRewardsDistributor - * @author Aave - * @notice Defines the basic interface for a Rewards Distributor. - */ -interface IRewardsDistributor { - /** - * @dev Emitted when the configuration of the rewards of an asset is updated. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param oldEmission The old emissions per second value of the reward distribution - * @param newEmission The new emissions per second value of the reward distribution - * @param oldDistributionEnd The old end timestamp of the reward distribution - * @param newDistributionEnd The new end timestamp of the reward distribution - * @param assetIndex The index of the asset distribution - */ - event AssetConfigUpdated( - address indexed asset, - address indexed reward, - uint256 oldEmission, - uint256 newEmission, - uint256 oldDistributionEnd, - uint256 newDistributionEnd, - uint256 assetIndex - ); - - /** - * @dev Emitted when rewards of an asset are accrued on behalf of a user. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param user The address of the user that rewards are accrued on behalf of - * @param assetIndex The index of the asset distribution - * @param userIndex The index of the asset distribution on behalf of the user - * @param rewardsAccrued The amount of rewards accrued - */ - event Accrued( - address indexed asset, - address indexed reward, - address indexed user, - uint256 assetIndex, - uint256 userIndex, - uint256 rewardsAccrued - ); - - /** - * @dev Emitted when the emission manager address is updated. - * @param oldEmissionManager The address of the old emission manager - * @param newEmissionManager The address of the new emission manager - */ - event EmissionManagerUpdated( - address indexed oldEmissionManager, - address indexed newEmissionManager - ); - - /** - * @dev Sets the end date for the distribution - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Gets the end date for the distribution - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The timestamp with the end of the distribution, in unix time format - **/ - function getDistributionEnd(address asset, address reward) external view returns (uint256); - - /** - * @dev Returns the index of a user on a reward distribution - * @param user Address of the user - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The current user asset index, not including new distributions - **/ - function getUserAssetIndex( - address user, - address asset, - address reward - ) external view returns (uint256); - - /** - * @dev Returns the configuration of the distribution reward for a certain asset - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The index of the asset distribution - * @return The emission per second of the reward distribution - * @return The timestamp of the last update of the index - * @return The timestamp of the distribution end - **/ - function getRewardsData( - address asset, - address reward - ) external view returns (uint256, uint256, uint256, uint256); - - /** - * @dev Returns the list of available reward token addresses of an incentivized asset - * @param asset The incentivized asset - * @return List of rewards addresses of the input asset - **/ - function getRewardsByAsset(address asset) external view returns (address[] memory); - - /** - * @dev Returns the list of available reward addresses - * @return List of rewards supported in this contract - **/ - function getRewardsList() external view returns (address[] memory); - - /** - * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. - * @param user The address of the user - * @param reward The address of the reward token - * @return Unclaimed rewards, not including new distributions - **/ - function getUserAccruedRewards(address user, address reward) external view returns (uint256); - - /** - * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @param reward The address of the reward token - * @return The rewards amount - **/ - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view returns (uint256); - - /** - * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @return The list of reward addresses - * @return The list of unclaimed amount of rewards - **/ - function getAllUserRewards( - address[] calldata assets, - address user - ) external view returns (address[] memory, uint256[] memory); - - /** - * @dev Returns the decimals of an asset to calculate the distribution delta - * @param asset The address to retrieve decimals - * @return The decimals of an underlying asset - */ - function getAssetDecimals(address asset) external view returns (uint8); - - /** - * @dev Returns the address of the emission manager - * @return The address of the EmissionManager - */ - function getEmissionManager() external view returns (address); - - /** - * @dev Updates the address of the emission manager - * @param emissionManager The address of the new EmissionManager - */ - function setEmissionManager(address emissionManager) external; -} - -// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol - -interface ITransferStrategyBase { - event EmergencyWithdrawal( - address indexed caller, - address indexed token, - address indexed to, - uint256 amount - ); - - /** - * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation - * @param to Account to transfer rewards - * @param reward Address of the reward token - * @param amount Amount to transfer to the "to" address parameter - * @return Returns true bool if transfer logic succeeds - */ - function performTransfer(address to, address reward, uint256 amount) external returns (bool); - - /** - * @return Returns the address of the Incentives Controller - */ - function getIncentivesController() external view returns (address); - - /** - * @return Returns the address of the Rewards admin - */ - function getRewardsAdmin() external view returns (address); - - /** - * @dev Perform an emergency token withdrawal only callable by the Rewards admin - * @param token Address of the token to withdraw funds from this contract - * @param to Address of the recipient of the withdrawal - * @param amount Amount of the withdrawal - */ - function emergencyWithdrawal(address token, address to, uint256 amount) external; -} - -// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} - -// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol - -library RewardsDataTypes { - struct RewardsConfigInput { - uint88 emissionPerSecond; - uint256 totalSupply; - uint32 distributionEnd; - address asset; - address reward; - ITransferStrategyBase transferStrategy; - IEACAggregatorProxy rewardOracle; - } - - struct UserAssetBalance { - address asset; - uint256 userBalance; - uint256 totalSupply; - } - - struct UserData { - uint104 index; // matches reward index - uint128 accrued; - } - - struct RewardData { - uint104 index; - uint88 emissionPerSecond; - uint32 lastUpdateTimestamp; - uint32 distributionEnd; - mapping(address => UserData) usersData; - } - - struct AssetData { - mapping(address => RewardData) rewards; - mapping(uint128 => address) availableRewards; - uint128 availableRewardsCount; - uint8 decimals; - } -} - -// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol - -/** - * @title IRewardsController - * @author Aave - * @notice Defines the basic interface for a Rewards Controller. - */ -interface IRewardsController is IRewardsDistributor { - /** - * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user - * @param user The address of the user - * @param claimer The address of the claimer - */ - event ClaimerSet(address indexed user, address indexed claimer); - - /** - * @dev Emitted when rewards are claimed - * @param user The address of the user rewards has been claimed on behalf of - * @param reward The address of the token reward is claimed - * @param to The address of the receiver of the rewards - * @param claimer The address of the claimer - * @param amount The amount of rewards claimed - */ - event RewardsClaimed( - address indexed user, - address indexed reward, - address indexed to, - address claimer, - uint256 amount - ); - - /** - * @dev Emitted when a transfer strategy is installed for the reward distribution - * @param reward The address of the token reward - * @param transferStrategy The address of TransferStrategy contract - */ - event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); - - /** - * @dev Emitted when the reward oracle is updated - * @param reward The address of the token reward - * @param rewardOracle The address of oracle - */ - event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Get the price aggregator oracle address - * @param reward The address of the reward - * @return The price oracle of the reward - */ - function getRewardOracle(address reward) external view returns (address); - - /** - * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) - * @param user The address of the user - * @return The claimer address - */ - function getClaimer(address user) external view returns (address); - - /** - * @dev Returns the Transfer Strategy implementation contract address being used for a reward address - * @param reward The address of the reward - * @return The address of the TransferStrategy contract - */ - function getTransferStrategy(address reward) external view returns (address); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Called by the corresponding asset on any update that affects the rewards distribution - * @param user The address of the user - * @param userBalance The user balance of the asset - * @param totalSupply The total supply of the asset - **/ - function handleAction(address user, uint256 userBalance, uint256 totalSupply) external; - - /** - * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The - * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external returns (uint256); - - /** - * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" - **/ - function claimAllRewards( - address[] calldata assets, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must - * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsToSelf( - address[] calldata assets - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); -} - -// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IEmissionManager.sol - -/** - * @title IEmissionManager - * @author Aave - * @notice Defines the basic interface for the Emission Manager - */ -interface IEmissionManager { - /** - * @dev Emitted when the admin of a reward emission is updated. - * @param reward The address of the rewarding token - * @param oldAdmin The address of the old emission admin - * @param newAdmin The address of the new emission admin - */ - event EmissionAdminUpdated( - address indexed reward, - address indexed oldAdmin, - address indexed newAdmin - ); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @dev Only callable by the emission admin of the given rewards - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @dev Only callable by the emission admin of the given reward - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @dev Only callable by the emission admin of the given reward - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Sets the end date for the distribution - * @dev Only callable by the emission admin of the given reward - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @dev Only callable by the owner of the EmissionManager - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Updates the address of the emission manager - * @dev Only callable by the owner of the EmissionManager - * @param emissionManager The address of the new EmissionManager - */ - function setEmissionManager(address emissionManager) external; - - /** - * @dev Updates the admin of the reward emission - * @dev Only callable by the owner of the EmissionManager - * @param reward The address of the reward token - * @param admin The address of the new admin of the emission - */ - function setEmissionAdmin(address reward, address admin) external; - - /** - * @dev Updates the address of the rewards controller - * @dev Only callable by the owner of the EmissionManager - * @param controller the address of the RewardsController contract - */ - function setRewardsController(address controller) external; - - /** - * @dev Returns the rewards controller address - * @return The address of the RewardsController contract - */ - function getRewardsController() external view returns (IRewardsController); - - /** - * @dev Returns the admin of the given reward emission - * @param reward The address of the reward token - * @return The address of the emission admin - */ - function getEmissionAdmin(address reward) external view returns (address); -} - -// downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/EmissionManager.sol - -/** - * @title EmissionManager - * @author Aave - * @notice It manages the list of admins of reward emissions and provides functions to control reward emissions. - */ -contract EmissionManager is Ownable, IEmissionManager { - // reward => emissionAdmin - mapping(address => address) internal _emissionAdmins; - - IRewardsController internal _rewardsController; - - /** - * @dev Only emission admin of the given reward can call functions marked by this modifier. - **/ - modifier onlyEmissionAdmin(address reward) { - require(msg.sender == _emissionAdmins[reward], 'ONLY_EMISSION_ADMIN'); - _; - } - - /** - * Constructor. - * @param controller The address of the RewardsController contract - * @param owner The address of the owner - */ - constructor(address controller, address owner) { - _rewardsController = IRewardsController(controller); - transferOwnership(owner); - } - - /// @inheritdoc IEmissionManager - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external override { - for (uint256 i = 0; i < config.length; i++) { - require(_emissionAdmins[config[i].reward] == msg.sender, 'ONLY_EMISSION_ADMIN'); - } - _rewardsController.configureAssets(config); - } - - /// @inheritdoc IEmissionManager - function setTransferStrategy( - address reward, - ITransferStrategyBase transferStrategy - ) external override onlyEmissionAdmin(reward) { - _rewardsController.setTransferStrategy(reward, transferStrategy); - } - - /// @inheritdoc IEmissionManager - function setRewardOracle( - address reward, - IEACAggregatorProxy rewardOracle - ) external override onlyEmissionAdmin(reward) { - _rewardsController.setRewardOracle(reward, rewardOracle); - } - - /// @inheritdoc IEmissionManager - function setDistributionEnd( - address asset, - address reward, - uint32 newDistributionEnd - ) external override onlyEmissionAdmin(reward) { - _rewardsController.setDistributionEnd(asset, reward, newDistributionEnd); - } - - /// @inheritdoc IEmissionManager - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external override { - for (uint256 i = 0; i < rewards.length; i++) { - require(_emissionAdmins[rewards[i]] == msg.sender, 'ONLY_EMISSION_ADMIN'); - } - _rewardsController.setEmissionPerSecond(asset, rewards, newEmissionsPerSecond); - } - - /// @inheritdoc IEmissionManager - function setClaimer(address user, address claimer) external override onlyOwner { - _rewardsController.setClaimer(user, claimer); - } - - /// @inheritdoc IEmissionManager - function setEmissionManager(address emissionManager) external override onlyOwner { - _rewardsController.setEmissionManager(emissionManager); - } - - /// @inheritdoc IEmissionManager - function setEmissionAdmin(address reward, address admin) external override onlyOwner { - address oldAdmin = _emissionAdmins[reward]; - _emissionAdmins[reward] = admin; - emit EmissionAdminUpdated(reward, oldAdmin, admin); - } - - /// @inheritdoc IEmissionManager - function setRewardsController(address controller) external override onlyOwner { - _rewardsController = IRewardsController(controller); - } - - /// @inheritdoc IEmissionManager - function getRewardsController() external view override returns (IRewardsController) { - return _rewardsController; - } - - /// @inheritdoc IEmissionManager - function getEmissionAdmin(address reward) external view override returns (address) { - return _emissionAdmins[reward]; - } -} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 445ee640..00000000 --- a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol deleted file mode 100644 index 020feeca..00000000 --- a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.10; - -import './Context.sol'; - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol deleted file mode 100644 index ddb6f137..00000000 --- a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/EmissionManager.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/EmissionManager.sol deleted file mode 100644 index b02f27ac..00000000 --- a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/EmissionManager.sol +++ /dev/null @@ -1,118 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {Ownable} from '../../../core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol'; -import {IEACAggregatorProxy} from '../misc/interfaces/IEACAggregatorProxy.sol'; -import {IEmissionManager} from './interfaces/IEmissionManager.sol'; -import {ITransferStrategyBase} from './interfaces/ITransferStrategyBase.sol'; -import {IRewardsController} from './interfaces/IRewardsController.sol'; -import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol'; - -/** - * @title EmissionManager - * @author Aave - * @notice It manages the list of admins of reward emissions and provides functions to control reward emissions. - */ -contract EmissionManager is Ownable, IEmissionManager { - // reward => emissionAdmin - mapping(address => address) internal _emissionAdmins; - - IRewardsController internal _rewardsController; - - /** - * @dev Only emission admin of the given reward can call functions marked by this modifier. - **/ - modifier onlyEmissionAdmin(address reward) { - require(msg.sender == _emissionAdmins[reward], 'ONLY_EMISSION_ADMIN'); - _; - } - - /** - * Constructor. - * @param controller The address of the RewardsController contract - * @param owner The address of the owner - */ - constructor(address controller, address owner) { - _rewardsController = IRewardsController(controller); - transferOwnership(owner); - } - - /// @inheritdoc IEmissionManager - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external override { - for (uint256 i = 0; i < config.length; i++) { - require(_emissionAdmins[config[i].reward] == msg.sender, 'ONLY_EMISSION_ADMIN'); - } - _rewardsController.configureAssets(config); - } - - /// @inheritdoc IEmissionManager - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) - external - override - onlyEmissionAdmin(reward) - { - _rewardsController.setTransferStrategy(reward, transferStrategy); - } - - /// @inheritdoc IEmissionManager - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) - external - override - onlyEmissionAdmin(reward) - { - _rewardsController.setRewardOracle(reward, rewardOracle); - } - - /// @inheritdoc IEmissionManager - function setDistributionEnd( - address asset, - address reward, - uint32 newDistributionEnd - ) external override onlyEmissionAdmin(reward) { - _rewardsController.setDistributionEnd(asset, reward, newDistributionEnd); - } - - /// @inheritdoc IEmissionManager - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external override { - for (uint256 i = 0; i < rewards.length; i++) { - require(_emissionAdmins[rewards[i]] == msg.sender, 'ONLY_EMISSION_ADMIN'); - } - _rewardsController.setEmissionPerSecond(asset, rewards, newEmissionsPerSecond); - } - - /// @inheritdoc IEmissionManager - function setClaimer(address user, address claimer) external override onlyOwner { - _rewardsController.setClaimer(user, claimer); - } - - /// @inheritdoc IEmissionManager - function setEmissionManager(address emissionManager) external override onlyOwner { - _rewardsController.setEmissionManager(emissionManager); - } - - /// @inheritdoc IEmissionManager - function setEmissionAdmin(address reward, address admin) external override onlyOwner { - address oldAdmin = _emissionAdmins[reward]; - _emissionAdmins[reward] = admin; - emit EmissionAdminUpdated(reward, oldAdmin, admin); - } - - /// @inheritdoc IEmissionManager - function setRewardsController(address controller) external override onlyOwner { - _rewardsController = IRewardsController(controller); - } - - /// @inheritdoc IEmissionManager - function getRewardsController() external view override returns (IRewardsController) { - return _rewardsController; - } - - /// @inheritdoc IEmissionManager - function getEmissionAdmin(address reward) external view override returns (address) { - return _emissionAdmins[reward]; - } -} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IEmissionManager.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IEmissionManager.sol deleted file mode 100644 index b31d338f..00000000 --- a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IEmissionManager.sol +++ /dev/null @@ -1,129 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol'; -import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; -import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; -import {IRewardsController} from './IRewardsController.sol'; - -/** - * @title IEmissionManager - * @author Aave - * @notice Defines the basic interface for the Emission Manager - */ -interface IEmissionManager { - /** - * @dev Emitted when the admin of a reward emission is updated. - * @param reward The address of the rewarding token - * @param oldAdmin The address of the old emission admin - * @param newAdmin The address of the new emission admin - */ - event EmissionAdminUpdated( - address indexed reward, - address indexed oldAdmin, - address indexed newAdmin - ); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @dev Only callable by the emission admin of the given rewards - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @dev Only callable by the emission admin of the given reward - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @dev Only callable by the emission admin of the given reward - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Sets the end date for the distribution - * @dev Only callable by the emission admin of the given reward - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd( - address asset, - address reward, - uint32 newDistributionEnd - ) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @dev Only callable by the owner of the EmissionManager - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Updates the address of the emission manager - * @dev Only callable by the owner of the EmissionManager - * @param emissionManager The address of the new EmissionManager - */ - function setEmissionManager(address emissionManager) external; - - /** - * @dev Updates the admin of the reward emission - * @dev Only callable by the owner of the EmissionManager - * @param reward The address of the reward token - * @param admin The address of the new admin of the emission - */ - function setEmissionAdmin(address reward, address admin) external; - - /** - * @dev Updates the address of the rewards controller - * @dev Only callable by the owner of the EmissionManager - * @param controller the address of the RewardsController contract - */ - function setRewardsController(address controller) external; - - /** - * @dev Returns the rewards controller address - * @return The address of the RewardsController contract - */ - function getRewardsController() external view returns (IRewardsController); - - /** - * @dev Returns the admin of the given reward emission - * @param reward The address of the reward token - * @return The address of the emission admin - */ - function getEmissionAdmin(address reward) external view returns (address); -} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol deleted file mode 100644 index 706e3cd6..00000000 --- a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol +++ /dev/null @@ -1,205 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {IRewardsDistributor} from './IRewardsDistributor.sol'; -import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol'; -import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; - -/** - * @title IRewardsController - * @author Aave - * @notice Defines the basic interface for a Rewards Controller. - */ -interface IRewardsController is IRewardsDistributor { - /** - * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user - * @param user The address of the user - * @param claimer The address of the claimer - */ - event ClaimerSet(address indexed user, address indexed claimer); - - /** - * @dev Emitted when rewards are claimed - * @param user The address of the user rewards has been claimed on behalf of - * @param reward The address of the token reward is claimed - * @param to The address of the receiver of the rewards - * @param claimer The address of the claimer - * @param amount The amount of rewards claimed - */ - event RewardsClaimed( - address indexed user, - address indexed reward, - address indexed to, - address claimer, - uint256 amount - ); - - /** - * @dev Emitted when a transfer strategy is installed for the reward distribution - * @param reward The address of the token reward - * @param transferStrategy The address of TransferStrategy contract - */ - event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); - - /** - * @dev Emitted when the reward oracle is updated - * @param reward The address of the token reward - * @param rewardOracle The address of oracle - */ - event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Get the price aggregator oracle address - * @param reward The address of the reward - * @return The price oracle of the reward - */ - function getRewardOracle(address reward) external view returns (address); - - /** - * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) - * @param user The address of the user - * @return The claimer address - */ - function getClaimer(address user) external view returns (address); - - /** - * @dev Returns the Transfer Strategy implementation contract address being used for a reward address - * @param reward The address of the reward - * @return The address of the TransferStrategy contract - */ - function getTransferStrategy(address reward) external view returns (address); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Called by the corresponding asset on any update that affects the rewards distribution - * @param user The address of the user - * @param userBalance The user balance of the asset - * @param totalSupply The total supply of the asset - **/ - function handleAction( - address user, - uint256 userBalance, - uint256 totalSupply - ) external; - - /** - * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The - * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external returns (uint256); - - /** - * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" - **/ - function claimAllRewards(address[] calldata assets, address to) - external - returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must - * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsToSelf(address[] calldata assets) - external - returns (address[] memory rewardsList, uint256[] memory claimedAmounts); -} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol deleted file mode 100644 index 431fdfe7..00000000 --- a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol +++ /dev/null @@ -1,186 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -/** - * @title IRewardsDistributor - * @author Aave - * @notice Defines the basic interface for a Rewards Distributor. - */ -interface IRewardsDistributor { - /** - * @dev Emitted when the configuration of the rewards of an asset is updated. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param oldEmission The old emissions per second value of the reward distribution - * @param newEmission The new emissions per second value of the reward distribution - * @param oldDistributionEnd The old end timestamp of the reward distribution - * @param newDistributionEnd The new end timestamp of the reward distribution - * @param assetIndex The index of the asset distribution - */ - event AssetConfigUpdated( - address indexed asset, - address indexed reward, - uint256 oldEmission, - uint256 newEmission, - uint256 oldDistributionEnd, - uint256 newDistributionEnd, - uint256 assetIndex - ); - - /** - * @dev Emitted when rewards of an asset are accrued on behalf of a user. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param user The address of the user that rewards are accrued on behalf of - * @param assetIndex The index of the asset distribution - * @param userIndex The index of the asset distribution on behalf of the user - * @param rewardsAccrued The amount of rewards accrued - */ - event Accrued( - address indexed asset, - address indexed reward, - address indexed user, - uint256 assetIndex, - uint256 userIndex, - uint256 rewardsAccrued - ); - - /** - * @dev Emitted when the emission manager address is updated. - * @param oldEmissionManager The address of the old emission manager - * @param newEmissionManager The address of the new emission manager - */ - event EmissionManagerUpdated( - address indexed oldEmissionManager, - address indexed newEmissionManager - ); - - /** - * @dev Sets the end date for the distribution - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd( - address asset, - address reward, - uint32 newDistributionEnd - ) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Gets the end date for the distribution - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The timestamp with the end of the distribution, in unix time format - **/ - function getDistributionEnd(address asset, address reward) external view returns (uint256); - - /** - * @dev Returns the index of a user on a reward distribution - * @param user Address of the user - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The current user asset index, not including new distributions - **/ - function getUserAssetIndex( - address user, - address asset, - address reward - ) external view returns (uint256); - - /** - * @dev Returns the configuration of the distribution reward for a certain asset - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The index of the asset distribution - * @return The emission per second of the reward distribution - * @return The timestamp of the last update of the index - * @return The timestamp of the distribution end - **/ - function getRewardsData(address asset, address reward) - external - view - returns ( - uint256, - uint256, - uint256, - uint256 - ); - - /** - * @dev Returns the list of available reward token addresses of an incentivized asset - * @param asset The incentivized asset - * @return List of rewards addresses of the input asset - **/ - function getRewardsByAsset(address asset) external view returns (address[] memory); - - /** - * @dev Returns the list of available reward addresses - * @return List of rewards supported in this contract - **/ - function getRewardsList() external view returns (address[] memory); - - /** - * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. - * @param user The address of the user - * @param reward The address of the reward token - * @return Unclaimed rewards, not including new distributions - **/ - function getUserAccruedRewards(address user, address reward) external view returns (uint256); - - /** - * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @param reward The address of the reward token - * @return The rewards amount - **/ - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view returns (uint256); - - /** - * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @return The list of reward addresses - * @return The list of unclaimed amount of rewards - **/ - function getAllUserRewards(address[] calldata assets, address user) - external - view - returns (address[] memory, uint256[] memory); - - /** - * @dev Returns the decimals of an asset to calculate the distribution delta - * @param asset The address to retrieve decimals - * @return The decimals of an underlying asset - */ - function getAssetDecimals(address asset) external view returns (uint8); - - /** - * @dev Returns the address of the emission manager - * @return The address of the EmissionManager - */ - function getEmissionManager() external view returns (address); - - /** - * @dev Updates the address of the emission manager - * @param emissionManager The address of the new EmissionManager - */ - function setEmissionManager(address emissionManager) external; -} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol deleted file mode 100644 index 46d67b08..00000000 --- a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -interface ITransferStrategyBase { - event EmergencyWithdrawal( - address indexed caller, - address indexed token, - address indexed to, - uint256 amount - ); - - /** - * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation - * @param to Account to transfer rewards - * @param reward Address of the reward token - * @param amount Amount to transfer to the "to" address parameter - * @return Returns true bool if transfer logic succeeds - */ - function performTransfer( - address to, - address reward, - uint256 amount - ) external returns (bool); - - /** - * @return Returns the address of the Incentives Controller - */ - function getIncentivesController() external view returns (address); - - /** - * @return Returns the address of the Rewards admin - */ - function getRewardsAdmin() external view returns (address); - - /** - * @dev Perform an emergency token withdrawal only callable by the Rewards admin - * @param token Address of the token to withdraw funds from this contract - * @param to Address of the recipient of the withdrawal - * @param amount Amount of the withdrawal - */ - function emergencyWithdrawal( - address token, - address to, - uint256 amount - ) external; -} diff --git a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol b/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol deleted file mode 100644 index e8e631c1..00000000 --- a/downloads/ARBITRUM/EMISSION_MANAGER/EmissionManager/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol'; - -library RewardsDataTypes { - struct RewardsConfigInput { - uint88 emissionPerSecond; - uint256 totalSupply; - uint32 distributionEnd; - address asset; - address reward; - ITransferStrategyBase transferStrategy; - IEACAggregatorProxy rewardOracle; - } - - struct UserAssetBalance { - address asset; - uint256 userBalance; - uint256 totalSupply; - } - - struct UserData { - uint104 index; // matches reward index - uint128 accrued; - } - - struct RewardData { - uint104 index; - uint88 emissionPerSecond; - uint32 lastUpdateTimestamp; - uint32 distributionEnd; - mapping(address => UserData) usersData; - } - - struct AssetData { - mapping(address => RewardData) rewards; - mapping(uint128 => address) availableRewards; - uint128 availableRewardsCount; - uint8 decimals; - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC.sol b/downloads/ARBITRUM/EMODE_LOGIC.sol deleted file mode 100644 index 38363c8b..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC.sol +++ /dev/null @@ -1,5534 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} - -// downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 01e1bcaf..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,833 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index e7ba8f7a..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 43987f47..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,583 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index 647fc7e7..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index cd5b83c6..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index dd5c637d..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index e08a30e8..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index 9adca939..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/ARBITRUM/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC.sol deleted file mode 100644 index 35feed8e..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC.sol +++ /dev/null @@ -1,6141 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol - -/** - * @title IFlashLoanReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - */ -interface IFlashLoanReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed assets - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param assets The addresses of the flash-borrowed assets - * @param amounts The amounts of the flash-borrowed assets - * @param premiums The fee of each flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata premiums, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol - -/** - * @title IFlashLoanSimpleReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - */ -interface IFlashLoanSimpleReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed asset - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param asset The address of the flash-borrowed asset - * @param amount The amount of the flash-borrowed asset - * @param premium The fee of the flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address asset, - uint256 amount, - uint256 premium, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol - -/** - * @title BorrowLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to borrowing - */ -library BorrowLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the - * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the - * isolated debt. - * @dev Emits the `Borrow()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the borrow function - */ - function executeBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteBorrowParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ( - bool isolationModeActive, - address isolationModeCollateralAddress, - uint256 isolationModeDebtCeiling - ) = userConfig.getIsolationModeState(reservesData, reservesList); - - ValidationLogic.validateBorrow( - reservesData, - reservesList, - eModeCategories, - DataTypes.ValidateBorrowParams({ - reserveCache: reserveCache, - userConfig: userConfig, - asset: params.asset, - userAddress: params.onBehalfOf, - amount: params.amount, - interestRateMode: params.interestRateMode, - reservesCount: params.reservesCount, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory, - priceOracleSentinel: params.priceOracleSentinel, - isolationModeActive: isolationModeActive, - isolationModeCollateralAddress: isolationModeCollateralAddress, - isolationModeDebtCeiling: isolationModeDebtCeiling - }) - ); - - bool isFirstBorrowing = false; - - (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); - - if (isFirstBorrowing) { - userConfig.setBorrowing(reserve.id, true); - } - - if (isolationModeActive) { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt += (params.amount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - 0, - params.releaseUnderlying ? params.amount : 0 - ); - - if (params.releaseUnderlying) { - IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); - } - - emit Borrow( - params.asset, - params.user, - params.onBehalfOf, - params.amount, - DataTypes.InterestRateMode.VARIABLE, - reserve.currentVariableBorrowRate, - params.referralCode - ); - } - - /** - * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the - * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also - * reduces the isolated debt. - * @dev Emits the `Repay()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the repay function - * @return The actual amount being repaid - */ - function executeRepay( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteRepayParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - - uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( - params.onBehalfOf - ); - - ValidationLogic.validateRepay( - reserveCache, - params.amount, - params.interestRateMode, - params.onBehalfOf, - variableDebt - ); - - uint256 paybackAmount = variableDebt; - - // Allows a user to repay with aTokens without leaving dust from interest. - if (params.useATokens && params.amount == type(uint256).max) { - params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); - } - - if (params.amount < paybackAmount) { - paybackAmount = params.amount; - } - - reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) - .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - params.useATokens ? 0 : paybackAmount, - 0 - ); - - if (variableDebt - paybackAmount == 0) { - userConfig.setBorrowing(reserve.id, false); - } - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - reserveCache, - paybackAmount - ); - - if (params.useATokens) { - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - reserveCache.aTokenAddress, - paybackAmount, - reserveCache.nextLiquidityIndex - ); - // in case of aToken repayment the msg.sender must always repay on behalf of itself - if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - } else { - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); - IAToken(reserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.onBehalfOf, - paybackAmount - ); - } - - emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); - - return paybackAmount; - } -} - -// downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol - -/** - * @title FlashLoanLogic library - * @author Aave - * @notice Implements the logic for the flash loans - */ -library FlashLoanLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - - // See `IPool` for descriptions - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - // Helper struct for internal variables used in the `executeFlashLoan` function - struct FlashLoanLocalVars { - IFlashLoanReceiver receiver; - address currentAsset; - uint256 currentAmount; - uint256[] totalPremiums; - uint256 flashloanPremiumTotal; - uint256 flashloanPremiumToProtocol; - } - - /** - * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction - * as long as the amount taken plus fee is returned or debt is opened. - * @dev For authorized flashborrowers the fee is waived - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the flashloan function - */ - function executeFlashLoan( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.FlashloanParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); - - FlashLoanLocalVars memory vars; - - vars.totalPremiums = new uint256[](params.assets.length); - - vars.receiver = IFlashLoanReceiver(params.receiverAddress); - (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower - ? (0, 0) - : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); - - for (uint256 i = 0; i < params.assets.length; i++) { - vars.currentAmount = params.amounts[i]; - vars.totalPremiums[i] = DataTypes.InterestRateMode(params.interestRateModes[i]) == - DataTypes.InterestRateMode.NONE - ? vars.currentAmount.percentMul(vars.flashloanPremiumTotal) - : 0; - - if (reservesData[params.assets[i]].configuration.getIsVirtualAccActive()) { - reservesData[params.assets[i]].virtualUnderlyingBalance -= vars.currentAmount.toUint128(); - } - - IAToken(reservesData[params.assets[i]].aTokenAddress).transferUnderlyingTo( - params.receiverAddress, - vars.currentAmount - ); - } - - require( - vars.receiver.executeOperation( - params.assets, - params.amounts, - vars.totalPremiums, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - for (uint256 i = 0; i < params.assets.length; i++) { - vars.currentAsset = params.assets[i]; - vars.currentAmount = params.amounts[i]; - - if ( - DataTypes.InterestRateMode(params.interestRateModes[i]) == DataTypes.InterestRateMode.NONE - ) { - _handleFlashLoanRepayment( - reservesData[vars.currentAsset], - DataTypes.FlashLoanRepaymentParams({ - asset: vars.currentAsset, - receiverAddress: params.receiverAddress, - amount: vars.currentAmount, - totalPremium: vars.totalPremiums[i], - flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } else { - // If the user chose to not return the funds, the system checks if there is enough collateral and - // eventually opens a debt position - BorrowLogic.executeBorrow( - reservesData, - reservesList, - eModeCategories, - userConfig, - DataTypes.ExecuteBorrowParams({ - asset: vars.currentAsset, - user: msg.sender, - onBehalfOf: params.onBehalfOf, - amount: vars.currentAmount, - interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[i]), - referralCode: params.referralCode, - releaseUnderlying: false, - reservesCount: IPool(params.pool).getReservesCount(), - oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), - userEModeCategory: IPool(params.pool).getUserEMode(params.onBehalfOf).toUint8(), - priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) - .getPriceOracleSentinel() - }) - ); - // no premium is paid when taking on the flashloan as debt - emit FlashLoan( - params.receiverAddress, - msg.sender, - vars.currentAsset, - vars.currentAmount, - DataTypes.InterestRateMode(params.interestRateModes[i]), - 0, - params.referralCode - ); - } - } - } - - /** - * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one - * transaction as long as the amount taken plus fee is returned. - * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the simple flashloan function - */ - function executeFlashLoanSimple( - DataTypes.ReserveData storage reserve, - DataTypes.FlashloanSimpleParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloanSimple(reserve, params.amount); - - IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); - uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); - - if (reserve.configuration.getIsVirtualAccActive()) { - reserve.virtualUnderlyingBalance -= params.amount.toUint128(); - } - - IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); - - require( - receiver.executeOperation( - params.asset, - params.amount, - totalPremium, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - _handleFlashLoanRepayment( - reserve, - DataTypes.FlashLoanRepaymentParams({ - asset: params.asset, - receiverAddress: params.receiverAddress, - amount: params.amount, - totalPremium: totalPremium, - flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } - - /** - * @notice Handles repayment of flashloaned assets + premium - * @dev Will pull the amount + premium from the receiver, so must have approved pool - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the repayment function - */ - function _handleFlashLoanRepayment( - DataTypes.ReserveData storage reserve, - DataTypes.FlashLoanRepaymentParams memory params - ) internal { - uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); - uint256 premiumToLP = params.totalPremium - premiumToProtocol; - uint256 amountPlusPremium = params.amount + params.totalPremium; - - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply() + - uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), - premiumToLP - ); - - reserve.accruedToTreasury += premiumToProtocol - .rayDiv(reserveCache.nextLiquidityIndex) - .toUint128(); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, amountPlusPremium, 0); - - IERC20(params.asset).safeTransferFrom( - params.receiverAddress, - reserveCache.aTokenAddress, - amountPlusPremium - ); - - IAToken(reserveCache.aTokenAddress).handleRepayment( - params.receiverAddress, - params.receiverAddress, - amountPlusPremium - ); - - emit FlashLoan( - params.receiverAddress, - msg.sender, - params.asset, - params.amount, - DataTypes.InterestRateMode.NONE, - params.totalPremium, - params.referralCode - ); - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 01e1bcaf..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,833 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index e7ba8f7a..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol deleted file mode 100644 index a3a55684..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; - -/** - * @title IFlashLoanReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - */ -interface IFlashLoanReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed assets - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param assets The addresses of the flash-borrowed assets - * @param amounts The amounts of the flash-borrowed assets - * @param premiums The fee of each flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata premiums, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol deleted file mode 100644 index bff21ae4..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; - -/** - * @title IFlashLoanSimpleReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - */ -interface IFlashLoanSimpleReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed asset - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param asset The address of the flash-borrowed asset - * @param amount The amount of the flash-borrowed asset - * @param premium The fee of the flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address asset, - uint256 amount, - uint256 premium, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 43987f47..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,583 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol deleted file mode 100644 index c4ed26ed..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {IsolationModeLogic} from './IsolationModeLogic.sol'; - -/** - * @title BorrowLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to borrowing - */ -library BorrowLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the - * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the - * isolated debt. - * @dev Emits the `Borrow()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the borrow function - */ - function executeBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteBorrowParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ( - bool isolationModeActive, - address isolationModeCollateralAddress, - uint256 isolationModeDebtCeiling - ) = userConfig.getIsolationModeState(reservesData, reservesList); - - ValidationLogic.validateBorrow( - reservesData, - reservesList, - eModeCategories, - DataTypes.ValidateBorrowParams({ - reserveCache: reserveCache, - userConfig: userConfig, - asset: params.asset, - userAddress: params.onBehalfOf, - amount: params.amount, - interestRateMode: params.interestRateMode, - reservesCount: params.reservesCount, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory, - priceOracleSentinel: params.priceOracleSentinel, - isolationModeActive: isolationModeActive, - isolationModeCollateralAddress: isolationModeCollateralAddress, - isolationModeDebtCeiling: isolationModeDebtCeiling - }) - ); - - bool isFirstBorrowing = false; - - (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); - - if (isFirstBorrowing) { - userConfig.setBorrowing(reserve.id, true); - } - - if (isolationModeActive) { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt += (params.amount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - 0, - params.releaseUnderlying ? params.amount : 0 - ); - - if (params.releaseUnderlying) { - IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); - } - - emit Borrow( - params.asset, - params.user, - params.onBehalfOf, - params.amount, - DataTypes.InterestRateMode.VARIABLE, - reserve.currentVariableBorrowRate, - params.referralCode - ); - } - - /** - * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the - * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also - * reduces the isolated debt. - * @dev Emits the `Repay()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the repay function - * @return The actual amount being repaid - */ - function executeRepay( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteRepayParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - - uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( - params.onBehalfOf - ); - - ValidationLogic.validateRepay( - reserveCache, - params.amount, - params.interestRateMode, - params.onBehalfOf, - variableDebt - ); - - uint256 paybackAmount = variableDebt; - - // Allows a user to repay with aTokens without leaving dust from interest. - if (params.useATokens && params.amount == type(uint256).max) { - params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); - } - - if (params.amount < paybackAmount) { - paybackAmount = params.amount; - } - - reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) - .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - params.useATokens ? 0 : paybackAmount, - 0 - ); - - if (variableDebt - paybackAmount == 0) { - userConfig.setBorrowing(reserve.id, false); - } - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - reserveCache, - paybackAmount - ); - - if (params.useATokens) { - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - reserveCache.aTokenAddress, - paybackAmount, - reserveCache.nextLiquidityIndex - ); - // in case of aToken repayment the msg.sender must always repay on behalf of itself - if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - } else { - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); - IAToken(reserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.onBehalfOf, - paybackAmount - ); - } - - emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); - - return paybackAmount; - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index 647fc7e7..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol deleted file mode 100644 index 31ffb288..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol +++ /dev/null @@ -1,277 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IFlashLoanReceiver} from '../../../misc/flashloan/interfaces/IFlashLoanReceiver.sol'; -import {IFlashLoanSimpleReceiver} from '../../../misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {BorrowLogic} from './BorrowLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title FlashLoanLogic library - * @author Aave - * @notice Implements the logic for the flash loans - */ -library FlashLoanLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - - // See `IPool` for descriptions - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - // Helper struct for internal variables used in the `executeFlashLoan` function - struct FlashLoanLocalVars { - IFlashLoanReceiver receiver; - address currentAsset; - uint256 currentAmount; - uint256[] totalPremiums; - uint256 flashloanPremiumTotal; - uint256 flashloanPremiumToProtocol; - } - - /** - * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction - * as long as the amount taken plus fee is returned or debt is opened. - * @dev For authorized flashborrowers the fee is waived - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the flashloan function - */ - function executeFlashLoan( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.FlashloanParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); - - FlashLoanLocalVars memory vars; - - vars.totalPremiums = new uint256[](params.assets.length); - - vars.receiver = IFlashLoanReceiver(params.receiverAddress); - (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower - ? (0, 0) - : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); - - for (uint256 i = 0; i < params.assets.length; i++) { - vars.currentAmount = params.amounts[i]; - vars.totalPremiums[i] = DataTypes.InterestRateMode(params.interestRateModes[i]) == - DataTypes.InterestRateMode.NONE - ? vars.currentAmount.percentMul(vars.flashloanPremiumTotal) - : 0; - - if (reservesData[params.assets[i]].configuration.getIsVirtualAccActive()) { - reservesData[params.assets[i]].virtualUnderlyingBalance -= vars.currentAmount.toUint128(); - } - - IAToken(reservesData[params.assets[i]].aTokenAddress).transferUnderlyingTo( - params.receiverAddress, - vars.currentAmount - ); - } - - require( - vars.receiver.executeOperation( - params.assets, - params.amounts, - vars.totalPremiums, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - for (uint256 i = 0; i < params.assets.length; i++) { - vars.currentAsset = params.assets[i]; - vars.currentAmount = params.amounts[i]; - - if ( - DataTypes.InterestRateMode(params.interestRateModes[i]) == DataTypes.InterestRateMode.NONE - ) { - _handleFlashLoanRepayment( - reservesData[vars.currentAsset], - DataTypes.FlashLoanRepaymentParams({ - asset: vars.currentAsset, - receiverAddress: params.receiverAddress, - amount: vars.currentAmount, - totalPremium: vars.totalPremiums[i], - flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } else { - // If the user chose to not return the funds, the system checks if there is enough collateral and - // eventually opens a debt position - BorrowLogic.executeBorrow( - reservesData, - reservesList, - eModeCategories, - userConfig, - DataTypes.ExecuteBorrowParams({ - asset: vars.currentAsset, - user: msg.sender, - onBehalfOf: params.onBehalfOf, - amount: vars.currentAmount, - interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[i]), - referralCode: params.referralCode, - releaseUnderlying: false, - reservesCount: IPool(params.pool).getReservesCount(), - oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), - userEModeCategory: IPool(params.pool).getUserEMode(params.onBehalfOf).toUint8(), - priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) - .getPriceOracleSentinel() - }) - ); - // no premium is paid when taking on the flashloan as debt - emit FlashLoan( - params.receiverAddress, - msg.sender, - vars.currentAsset, - vars.currentAmount, - DataTypes.InterestRateMode(params.interestRateModes[i]), - 0, - params.referralCode - ); - } - } - } - - /** - * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one - * transaction as long as the amount taken plus fee is returned. - * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the simple flashloan function - */ - function executeFlashLoanSimple( - DataTypes.ReserveData storage reserve, - DataTypes.FlashloanSimpleParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloanSimple(reserve, params.amount); - - IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); - uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); - - if (reserve.configuration.getIsVirtualAccActive()) { - reserve.virtualUnderlyingBalance -= params.amount.toUint128(); - } - - IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); - - require( - receiver.executeOperation( - params.asset, - params.amount, - totalPremium, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - _handleFlashLoanRepayment( - reserve, - DataTypes.FlashLoanRepaymentParams({ - asset: params.asset, - receiverAddress: params.receiverAddress, - amount: params.amount, - totalPremium: totalPremium, - flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } - - /** - * @notice Handles repayment of flashloaned assets + premium - * @dev Will pull the amount + premium from the receiver, so must have approved pool - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the repayment function - */ - function _handleFlashLoanRepayment( - DataTypes.ReserveData storage reserve, - DataTypes.FlashLoanRepaymentParams memory params - ) internal { - uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); - uint256 premiumToLP = params.totalPremium - premiumToProtocol; - uint256 amountPlusPremium = params.amount + params.totalPremium; - - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply() + - uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), - premiumToLP - ); - - reserve.accruedToTreasury += premiumToProtocol - .rayDiv(reserveCache.nextLiquidityIndex) - .toUint128(); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, amountPlusPremium, 0); - - IERC20(params.asset).safeTransferFrom( - params.receiverAddress, - reserveCache.aTokenAddress, - amountPlusPremium - ); - - IAToken(reserveCache.aTokenAddress).handleRepayment( - params.receiverAddress, - params.receiverAddress, - amountPlusPremium - ); - - emit FlashLoan( - params.receiverAddress, - msg.sender, - params.asset, - params.amount, - DataTypes.InterestRateMode.NONE, - params.totalPremium, - params.referralCode - ); - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index cd5b83c6..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol deleted file mode 100644 index 473840ea..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index dd5c637d..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index e08a30e8..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index 9adca939..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/ARBITRUM/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER.sol b/downloads/ARBITRUM/L2_ENCODER.sol deleted file mode 100644 index 9ab49b39..00000000 --- a/downloads/ARBITRUM/L2_ENCODER.sol +++ /dev/null @@ -1,1811 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity =0.8.10; - -// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - **/ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - **/ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - **/ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - **/ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - **/ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - **/ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - **/ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - **/ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - **/ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - //the current stable borrow rate. Expressed in ray - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - //stableDebtToken address - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62-63: reserved - //bit 64-79: reserve factor - //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167 liquidation protocol fee - //bit 168-175 eMode category - //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // each eMode category may or may not have a custom oracle to override the individual assets price oracles - address priceSource; - string label; - } - - enum InterestRateMode { - NONE, - STABLE, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currPrincipalStableDebt; - uint256 currAvgStableBorrowRate; - uint256 currTotalStableDebt; - uint256 nextAvgStableBorrowRate; - uint256 nextTotalStableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address stableDebtTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - uint40 stableDebtLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address addressesProvider; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 maxStableLoanPercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalStableDebt; - uint256 totalVariableDebt; - uint256 averageStableBorrowRate; - uint256 reserveFactor; - address reserve; - address aToken; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address stableDebtAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - **/ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - **/ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - **/ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - **/ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - **/ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - **/ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - **/ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on swapBorrowRateMode() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user swapping his rate mode - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - **/ - event SwapBorrowRateMode( - address indexed reserve, - address indexed user, - DataTypes.InterestRateMode interestRateMode - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - **/ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - **/ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - **/ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on rebalanceStableBorrowRate() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user for which the rebalance has been executed - **/ - event RebalanceStableBorrowRate(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt - * @param premium The fee flash borrowed - * @param referralCode The referral code used - **/ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - **/ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - **/ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - **/ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @dev Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @dev Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - **/ - function backUnbacked(address asset, uint256 amount, uint256 fee) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - **/ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - **/ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the - * corresponding debt token (StableDebtToken or VariableDebtToken) - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 stable/variable debt tokens, depending on the `interestRateMode` - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - **/ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - **/ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - **/ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @return The final amount repaid - **/ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa - * @param asset The address of the underlying asset borrowed - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - **/ - function swapBorrowRateMode(address asset, uint256 interestRateMode) external; - - /** - * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. - * - Users can be rebalanced if the following conditions are satisfied: - * 1. Usage ratio is above 95% - * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too - * much has been borrowed at a stable rate and suppliers are not earning enough - * @param asset The address of the underlying asset borrowed - * @param user The address of the user to be rebalanced - **/ - function rebalanceStableBorrowRate(address asset, address user) external; - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - **/ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - **/ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://developers.aave.com - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://developers.aave.com - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - **/ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - **/ - function initReserve( - address asset, - address aTokenAddress, - address stableDebtAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - **/ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - **/ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - **/ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - **/ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - **/ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - **/ - function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - **/ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - **/ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - **/ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new category for the eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; - - /** - * @notice Returns the data of an eMode category - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate - * @return The percentage of available liquidity to borrow, expressed in bps - */ - function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - **/ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; -} - -// downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/L2Encoder.sol - -/** - * @title L2Encoder - * @author Aave - * @notice Helper contract to encode calldata, used to optimize calldata size in L2Pool for transaction cost reduction - * only indented to help generate calldata for uses/frontends. - */ -contract L2Encoder { - using SafeCast for uint256; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The address of the Pool contract - */ - constructor(IPool pool) { - POOL = pool; - } - - /** - * @notice Encodes supply parameters from standard input to compact representation of 1 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param referralCode referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @return compact representation of supply parameters - */ - function encodeSupplyParams( - address asset, - uint256 amount, - uint16 referralCode - ) external view returns (bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount.toUint128(); - bytes32 res; - - assembly { - res := add(assetId, add(shl(16, shortenedAmount), shl(144, referralCode))) - } - return res; - } - - /** - * @notice Encodes supplyWithPermit parameters from standard input to compact representation of 3 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param referralCode referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return compact representation of supplyWithPermit parameters - * @return The R parameter of ERC712 permit sig - * @return The S parameter of ERC712 permit sig - */ - function encodeSupplyWithPermitParams( - address asset, - uint256 amount, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external view returns (bytes32, bytes32, bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount.toUint128(); - uint32 shortenedDeadline = deadline.toUint32(); - - bytes32 res; - assembly { - res := add( - assetId, - add( - shl(16, shortenedAmount), - add(shl(144, referralCode), add(shl(160, shortenedDeadline), shl(192, permitV))) - ) - ) - } - - return (res, permitR, permitS); - } - - /** - * @notice Encodes withdraw parameters from standard input to compact representation of 1 bytes32 - * @dev Without a to parameter as the compact calls to L2Pool will use msg.sender as to - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * @return compact representation of withdraw parameters - */ - function encodeWithdrawParams(address asset, uint256 amount) external view returns (bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); - - bytes32 res; - assembly { - res := add(assetId, shl(16, shortenedAmount)) - } - return res; - } - - /** - * @notice Encodes borrow parameters from standard input to compact representation of 1 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @return compact representation of withdraw parameters - */ - function encodeBorrowParams( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode - ) external view returns (bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount.toUint128(); - uint8 shortenedInterestRateMode = interestRateMode.toUint8(); - bytes32 res; - assembly { - res := add( - assetId, - add( - shl(16, shortenedAmount), - add(shl(144, shortenedInterestRateMode), shl(152, referralCode)) - ) - ) - } - return res; - } - - /** - * @notice Encodes repay parameters from standard input to compact representation of 1 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `interestRateMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @return compact representation of repay parameters - */ - function encodeRepayParams( - address asset, - uint256 amount, - uint256 interestRateMode - ) public view returns (bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); - uint8 shortenedInterestRateMode = interestRateMode.toUint8(); - - bytes32 res; - assembly { - res := add(assetId, add(shl(16, shortenedAmount), shl(144, shortenedInterestRateMode))) - } - return res; - } - - /** - * @notice Encodes repayWithPermit parameters from standard input to compact representation of 3 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return compact representation of repayWithPermit parameters - * @return The R parameter of ERC712 permit sig - * @return The S parameter of ERC712 permit sig - */ - function encodeRepayWithPermitParams( - address asset, - uint256 amount, - uint256 interestRateMode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external view returns (bytes32, bytes32, bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); - uint8 shortenedInterestRateMode = interestRateMode.toUint8(); - uint32 shortenedDeadline = deadline.toUint32(); - - bytes32 res; - assembly { - res := add( - assetId, - add( - shl(16, shortenedAmount), - add( - shl(144, shortenedInterestRateMode), - add(shl(152, shortenedDeadline), shl(184, permitV)) - ) - ) - ) - } - return (res, permitR, permitS); - } - - /** - * @notice Encodes repay with aToken parameters from standard input to compact representation of 1 bytes32 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @return compact representation of repay with aToken parameters - */ - function encodeRepayWithATokensParams( - address asset, - uint256 amount, - uint256 interestRateMode - ) external view returns (bytes32) { - return encodeRepayParams(asset, amount, interestRateMode); - } - - /** - * @notice Encodes swap borrow rate mode parameters from standard input to compact representation of 1 bytes32 - * @param asset The address of the underlying asset borrowed - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - * @return compact representation of swap borrow rate mode parameters - */ - function encodeSwapBorrowRateMode( - address asset, - uint256 interestRateMode - ) external view returns (bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - uint16 assetId = data.id; - uint8 shortenedInterestRateMode = interestRateMode.toUint8(); - bytes32 res; - assembly { - res := add(assetId, shl(16, shortenedInterestRateMode)) - } - return res; - } - - /** - * @notice Encodes rebalance stable borrow rate parameters from standard input to compact representation of 1 bytes32 - * @param asset The address of the underlying asset borrowed - * @param user The address of the user to be rebalanced - * @return compact representation of rebalance stable borrow rate parameters - */ - function encodeRebalanceStableBorrowRate( - address asset, - address user - ) external view returns (bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - uint16 assetId = data.id; - - bytes32 res; - assembly { - res := add(assetId, shl(16, user)) - } - return res; - } - - /** - * @notice Encodes set user use reserve as collateral parameters from standard input to compact representation of 1 bytes32 - * @param asset The address of the underlying asset borrowed - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - * @return compact representation of set user use reserve as collateral parameters - */ - function encodeSetUserUseReserveAsCollateral( - address asset, - bool useAsCollateral - ) external view returns (bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - uint16 assetId = data.id; - bytes32 res; - assembly { - res := add(assetId, shl(16, useAsCollateral)) - } - return res; - } - - /** - * @notice Encodes liquidation call parameters from standard input to compact representation of 2 bytes32 - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - * @return First half ot compact representation of liquidation call parameters - * @return Second half ot compact representation of liquidation call parameters - */ - function encodeLiquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external view returns (bytes32, bytes32) { - DataTypes.ReserveData memory collateralData = POOL.getReserveData(collateralAsset); - uint16 collateralAssetId = collateralData.id; - - DataTypes.ReserveData memory debtData = POOL.getReserveData(debtAsset); - uint16 debtAssetId = debtData.id; - - uint128 shortenedDebtToCover = debtToCover == type(uint256).max - ? type(uint128).max - : debtToCover.toUint128(); - - bytes32 res1; - bytes32 res2; - - assembly { - res1 := add(add(collateralAssetId, shl(16, debtAssetId)), shl(32, user)) - res2 := add(shortenedDebtToCover, shl(128, receiveAToken)) - } - return (res1, res2); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol deleted file mode 100644 index 496151aa..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -// Chainlink Contracts v0.8 -pragma solidity ^0.8.0; - -interface AggregatorInterface { - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt); - - event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index 7c3a99d7..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,124 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity 0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer( - IERC20 token, - address to, - uint256 value - ) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom( - IERC20 token, - address from, - address to, - uint256 value - ) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol deleted file mode 100644 index d7834c71..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/AccessControl.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.10; - -import './IAccessControl.sol'; -import './Context.sol'; -import './Strings.sol'; -import './ERC165.sol'; - -/** - * @dev Contract module that allows children to implement role-based access - * control mechanisms. This is a lightweight version that doesn't allow enumerating role - * members except through off-chain means by accessing the contract event logs. Some - * applications may benefit from on-chain enumerability, for those cases see - * {AccessControlEnumerable}. - * - * Roles are referred to by their `bytes32` identifier. These should be exposed - * in the external API and be unique. The best way to achieve this is by - * using `public constant` hash digests: - * - * ``` - * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); - * ``` - * - * Roles can be used to represent a set of permissions. To restrict access to a - * function call, use {hasRole}: - * - * ``` - * function foo() public { - * require(hasRole(MY_ROLE, msg.sender)); - * ... - * } - * ``` - * - * Roles can be granted and revoked dynamically via the {grantRole} and - * {revokeRole} functions. Each role has an associated admin role, and only - * accounts that have a role's admin role can call {grantRole} and {revokeRole}. - * - * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means - * that only accounts with this role will be able to grant or revoke other - * roles. More complex role relationships can be created by using - * {_setRoleAdmin}. - * - * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to - * grant and revoke this role. Extra precautions should be taken to secure - * accounts that have been granted it. - */ -abstract contract AccessControl is Context, IAccessControl, ERC165 { - struct RoleData { - mapping(address => bool) members; - bytes32 adminRole; - } - - mapping(bytes32 => RoleData) private _roles; - - bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; - - /** - * @dev Modifier that checks that an account has a specific role. Reverts - * with a standardized message including the required role. - * - * The format of the revert reason is given by the following regular expression: - * - * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ - * - * _Available since v4.1._ - */ - modifier onlyRole(bytes32 role) { - _checkRole(role, _msgSender()); - _; - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) public view override returns (bool) { - return _roles[role].members[account]; - } - - /** - * @dev Revert with a standard message if `account` is missing `role`. - * - * The format of the revert reason is given by the following regular expression: - * - * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ - */ - function _checkRole(bytes32 role, address account) internal view { - if (!hasRole(role, account)) { - revert( - string( - abi.encodePacked( - 'AccessControl: account ', - Strings.toHexString(uint160(account), 20), - ' is missing role ', - Strings.toHexString(uint256(role), 32) - ) - ) - ); - } - } - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) public view override returns (bytes32) { - return _roles[role].adminRole; - } - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) - public - virtual - override - onlyRole(getRoleAdmin(role)) - { - _grantRole(role, account); - } - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) - public - virtual - override - onlyRole(getRoleAdmin(role)) - { - _revokeRole(role, account); - } - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) public virtual override { - require(account == _msgSender(), 'AccessControl: can only renounce roles for self'); - - _revokeRole(role, account); - } - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. Note that unlike {grantRole}, this function doesn't perform any - * checks on the calling account. - * - * [WARNING] - * ==== - * This function should only be called from the constructor when setting - * up the initial roles for the system. - * - * Using this function in any other way is effectively circumventing the admin - * system imposed by {AccessControl}. - * ==== - */ - function _setupRole(bytes32 role, address account) internal virtual { - _grantRole(role, account); - } - - /** - * @dev Sets `adminRole` as ``role``'s admin role. - * - * Emits a {RoleAdminChanged} event. - */ - function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { - bytes32 previousAdminRole = getRoleAdmin(role); - _roles[role].adminRole = adminRole; - emit RoleAdminChanged(role, previousAdminRole, adminRole); - } - - function _grantRole(bytes32 role, address account) private { - if (!hasRole(role, account)) { - _roles[role].members[account] = true; - emit RoleGranted(role, account, _msgSender()); - } - } - - function _revokeRole(bytes32 role, address account) private { - if (hasRole(role, account)) { - _roles[role].members[account] = false; - emit RoleRevoked(role, account, _msgSender()); - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index c6dcfda7..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // According to EIP-1052, 0x0 is the value returned for not-yet created accounts - // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned - // for accounts without code, i.e. `keccak256('')` - bytes32 codehash; - bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; - // solhint-disable-next-line no-inline-assembly - assembly { - codehash := extcodehash(account) - } - return (codehash != accountHash && codehash != 0x0); - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - // solhint-disable-next-line avoid-low-level-calls, avoid-call-value - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 445ee640..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol deleted file mode 100644 index 15336e7e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC165.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.10; - -import './IERC165.sol'; - -/** - * @dev Implementation of the {IERC165} interface. - * - * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check - * for the additional interface id that will be supported. For example: - * - * ```solidity - * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); - * } - * ``` - * - * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. - */ -abstract contract ERC165 is IERC165 { - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IERC165).interfaceId; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC20.sol deleted file mode 100644 index e794581f..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC20.sol +++ /dev/null @@ -1,344 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.10; - -import './Context.sol'; -import './IERC20.sol'; -import './SafeMath.sol'; -import './Address.sol'; - -/** - * @dev Implementation of the {IERC20} interface. - * - * This implementation is agnostic to the way tokens are created. This means - * that a supply mechanism has to be added in a derived contract using {_mint}. - * For a generic mechanism see {ERC20PresetMinterPauser}. - * - * TIP: For a detailed writeup see our guide - * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How - * to implement supply mechanisms]. - * - * We have followed general OpenZeppelin guidelines: functions revert instead - * of returning `false` on failure. This behavior is nonetheless conventional - * and does not conflict with the expectations of ERC20 applications. - * - * Additionally, an {Approval} event is emitted on calls to {transferFrom}. - * This allows applications to reconstruct the allowance for all accounts just - * by listening to said events. Other implementations of the EIP may not emit - * these events, as it isn't required by the specification. - * - * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} - * functions have been added to mitigate the well-known issues around setting - * allowances. See {IERC20-approve}. - */ -contract ERC20 is Context, IERC20 { - using SafeMath for uint256; - using Address for address; - - mapping(address => uint256) private _balances; - - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 private _totalSupply; - - string private _name; - string private _symbol; - uint8 private _decimals; - - /** - * @dev Sets the values for {name} and {symbol}, initializes {decimals} with - * a default value of 18. - * - * To select a different value for {decimals}, use {_setupDecimals}. - * - * All three of these values are immutable: they can only be set once during - * construction. - */ - constructor(string memory name, string memory symbol) { - _name = name; - _symbol = symbol; - _decimals = 18; - } - - /** - * @dev Returns the name of the token. - */ - function name() public view returns (string memory) { - return _name; - } - - /** - * @dev Returns the symbol of the token, usually a shorter version of the - * name. - */ - function symbol() public view returns (string memory) { - return _symbol; - } - - /** - * @dev Returns the number of decimals used to get its user representation. - * For example, if `decimals` equals `2`, a balance of `505` tokens should - * be displayed to a user as `5,05` (`505 / 10 ** 2`). - * - * Tokens usually opt for a value of 18, imitating the relationship between - * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is - * called. - * - * NOTE: This information is only used for _display_ purposes: it in - * no way affects any of the arithmetic of the contract, including - * {IERC20-balanceOf} and {IERC20-transfer}. - */ - function decimals() public view returns (uint8) { - return _decimals; - } - - /** - * @dev See {IERC20-totalSupply}. - */ - function totalSupply() public view override returns (uint256) { - return _totalSupply; - } - - /** - * @dev See {IERC20-balanceOf}. - */ - function balanceOf(address account) public view override returns (uint256) { - return _balances[account]; - } - - /** - * @dev See {IERC20-transfer}. - * - * Requirements: - * - * - `recipient` cannot be the zero address. - * - the caller must have a balance of at least `amount`. - */ - function transfer(address recipient, uint256 amount) public virtual override returns (bool) { - _transfer(_msgSender(), recipient, amount); - return true; - } - - /** - * @dev See {IERC20-allowance}. - */ - function allowance(address owner, address spender) - public - view - virtual - override - returns (uint256) - { - return _allowances[owner][spender]; - } - - /** - * @dev See {IERC20-approve}. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function approve(address spender, uint256 amount) public virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /** - * @dev See {IERC20-transferFrom}. - * - * Emits an {Approval} event indicating the updated allowance. This is not - * required by the EIP. See the note at the beginning of {ERC20}; - * - * Requirements: - * - `sender` and `recipient` cannot be the zero address. - * - `sender` must have a balance of at least `amount`. - * - the caller must have allowance for ``sender``'s tokens of at least - * `amount`. - */ - function transferFrom( - address sender, - address recipient, - uint256 amount - ) public virtual override returns (bool) { - _transfer(sender, recipient, amount); - _approve( - sender, - _msgSender(), - _allowances[sender][_msgSender()].sub(amount, 'ERC20: transfer amount exceeds allowance') - ); - return true; - } - - /** - * @dev Atomically increases the allowance granted to `spender` by the caller. - * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {IERC20-approve}. - * - * Emits an {Approval} event indicating the updated allowance. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); - return true; - } - - /** - * @dev Atomically decreases the allowance granted to `spender` by the caller. - * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {IERC20-approve}. - * - * Emits an {Approval} event indicating the updated allowance. - * - * Requirements: - * - * - `spender` cannot be the zero address. - * - `spender` must have allowance for the caller of at least - * `subtractedValue`. - */ - function decreaseAllowance(address spender, uint256 subtractedValue) - public - virtual - returns (bool) - { - _approve( - _msgSender(), - spender, - _allowances[_msgSender()][spender].sub( - subtractedValue, - 'ERC20: decreased allowance below zero' - ) - ); - return true; - } - - /** - * @dev Moves tokens `amount` from `sender` to `recipient`. - * - * This is internal function is equivalent to {transfer}, and can be used to - * e.g. implement automatic token fees, slashing mechanisms, etc. - * - * Emits a {Transfer} event. - * - * Requirements: - * - * - `sender` cannot be the zero address. - * - `recipient` cannot be the zero address. - * - `sender` must have a balance of at least `amount`. - */ - function _transfer( - address sender, - address recipient, - uint256 amount - ) internal virtual { - require(sender != address(0), 'ERC20: transfer from the zero address'); - require(recipient != address(0), 'ERC20: transfer to the zero address'); - - _beforeTokenTransfer(sender, recipient, amount); - - _balances[sender] = _balances[sender].sub(amount, 'ERC20: transfer amount exceeds balance'); - _balances[recipient] = _balances[recipient].add(amount); - emit Transfer(sender, recipient, amount); - } - - /** @dev Creates `amount` tokens and assigns them to `account`, increasing - * the total supply. - * - * Emits a {Transfer} event with `from` set to the zero address. - * - * Requirements - * - * - `to` cannot be the zero address. - */ - function _mint(address account, uint256 amount) internal virtual { - require(account != address(0), 'ERC20: mint to the zero address'); - - _beforeTokenTransfer(address(0), account, amount); - - _totalSupply = _totalSupply.add(amount); - _balances[account] = _balances[account].add(amount); - emit Transfer(address(0), account, amount); - } - - /** - * @dev Destroys `amount` tokens from `account`, reducing the - * total supply. - * - * Emits a {Transfer} event with `to` set to the zero address. - * - * Requirements - * - * - `account` cannot be the zero address. - * - `account` must have at least `amount` tokens. - */ - function _burn(address account, uint256 amount) internal virtual { - require(account != address(0), 'ERC20: burn from the zero address'); - - _beforeTokenTransfer(account, address(0), amount); - - _balances[account] = _balances[account].sub(amount, 'ERC20: burn amount exceeds balance'); - _totalSupply = _totalSupply.sub(amount); - emit Transfer(account, address(0), amount); - } - - /** - * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. - * - * This is internal function is equivalent to `approve`, and can be used to - * e.g. set automatic allowances for certain subsystems, etc. - * - * Emits an {Approval} event. - * - * Requirements: - * - * - `owner` cannot be the zero address. - * - `spender` cannot be the zero address. - */ - function _approve( - address owner, - address spender, - uint256 amount - ) internal virtual { - require(owner != address(0), 'ERC20: approve from the zero address'); - require(spender != address(0), 'ERC20: approve to the zero address'); - - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @dev Sets {decimals} to a value other than the default one of 18. - * - * WARNING: This function should only be called from the constructor. Most - * applications that interact with token contracts will not expect - * {decimals} to ever change, and may work incorrectly if it does. - */ - function _setupDecimals(uint8 decimals_) internal { - _decimals = decimals_; - } - - /** - * @dev Hook that is called before any transfer of tokens. This includes - * minting and burning. - * - * Calling conditions: - * - * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens - * will be to transferred to `to`. - * - when `from` is zero, `amount` tokens will be minted for `to`. - * - when `to` is zero, `amount` of ``from``'s tokens will be burned. - * - `from` and `to` are never both zero. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual {} -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index c6f35263..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol deleted file mode 100644 index ce3c290e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC165.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.10; - -/** - * @dev Interface of the ERC165 standard, as defined in the - * https://eips.ethereum.org/EIPS/eip-165[EIP]. - * - * Implementers can declare support of contract interfaces, which can then be - * queried by others ({ERC165Checker}). - * - * For an implementation, see {ERC165}. - */ -interface IERC165 { - /** - * @dev Returns true if this contract implements the interface defined by - * `interfaceId`. See the corresponding - * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] - * to learn more about how these ids are created. - * - * This function call must use less than 30 000 gas. - */ - function supportsInterface(bytes4 interfaceId) external view returns (bool); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 7dc55938..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,80 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index 02693059..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol deleted file mode 100644 index 020feeca..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.10; - -import './Context.sol'; - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index 6d708093..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity 0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol deleted file mode 100644 index bf5b1ee5..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol +++ /dev/null @@ -1,59 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -/// @title Optimized overflow and underflow safe math operations -/// @notice Contains methods for doing math operations that revert on overflow or underflow for minimal gas cost -library SafeMath { - /// @notice Returns x + y, reverts if sum overflows uint256 - /// @param x The augend - /// @param y The addend - /// @return z The sum of x and y - function add(uint256 x, uint256 y) internal pure returns (uint256 z) { - unchecked { - require((z = x + y) >= x); - } - } - - /// @notice Returns x - y, reverts if underflows - /// @param x The minuend - /// @param y The subtrahend - /// @return z The difference of x and y - function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { - unchecked { - require((z = x - y) <= x); - } - } - - /// @notice Returns x - y, reverts if underflows - /// @param x The minuend - /// @param y The subtrahend - /// @param message The error msg - /// @return z The difference of x and y - function sub( - uint256 x, - uint256 y, - string memory message - ) internal pure returns (uint256 z) { - unchecked { - require((z = x - y) <= x, message); - } - } - - /// @notice Returns x * y, reverts if overflows - /// @param x The multiplicand - /// @param y The multiplier - /// @return z The product of x and y - function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { - unchecked { - require(x == 0 || (z = x * y) / x == y); - } - } - - /// @notice Returns x / y, reverts if overflows - no specific check, solidity reverts on division by 0 - /// @param x The numerator - /// @param y The denominator - /// @return z The product of x and y - function div(uint256 x, uint256 y) internal pure returns (uint256 z) { - return x / y; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol deleted file mode 100644 index bcb1ee6a..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Strings.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.10; - -/** - * @dev String operations. - */ -library Strings { - bytes16 private constant _HEX_SYMBOLS = '0123456789abcdef'; - - /** - * @dev Converts a `uint256` to its ASCII `string` decimal representation. - */ - function toString(uint256 value) internal pure returns (string memory) { - // Inspired by OraclizeAPI's implementation - MIT licence - // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol - - if (value == 0) { - return '0'; - } - uint256 temp = value; - uint256 digits; - while (temp != 0) { - digits++; - temp /= 10; - } - bytes memory buffer = new bytes(digits); - while (value != 0) { - digits -= 1; - buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); - value /= 10; - } - return string(buffer); - } - - /** - * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. - */ - function toHexString(uint256 value) internal pure returns (string memory) { - if (value == 0) { - return '0x00'; - } - uint256 temp = value; - uint256 length = 0; - while (temp != 0) { - length++; - temp >>= 8; - } - return toHexString(value, length); - } - - /** - * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. - */ - function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { - bytes memory buffer = new bytes(2 * length + 2); - buffer[0] = '0'; - buffer[1] = 'x'; - for (uint256 i = 2 * length + 1; i > 1; --i) { - buffer[i] = _HEX_SYMBOLS[value & 0xf]; - value >>= 4; - } - require(value == 0, 'Strings: hex length insufficient'); - return string(buffer); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseAdminUpgradeabilityProxy.sol deleted file mode 100644 index 4bab0994..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import './UpgradeabilityProxy.sol'; - -/** - * @title BaseAdminUpgradeabilityProxy - * @dev This contract combines an upgradeability proxy with an authorization - * mechanism for administrative tasks. - * All external functions in this contract must be guarded by the - * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity - * feature proposal that would enable this to be done automatically. - */ -contract BaseAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - /** - * @dev Emitted when the administration has been transferred. - * @param previousAdmin Address of the previous admin. - * @param newAdmin Address of the new admin. - */ - event AdminChanged(address previousAdmin, address newAdmin); - - /** - * @dev Storage slot with the admin of the contract. - * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant ADMIN_SLOT = - 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; - - /** - * @dev Modifier to check whether the `msg.sender` is the admin. - * If it is, it will run the function. Otherwise, it will delegate the call - * to the implementation. - */ - modifier ifAdmin() { - if (msg.sender == _admin()) { - _; - } else { - _fallback(); - } - } - - /** - * @return The address of the proxy admin. - */ - function admin() external ifAdmin returns (address) { - return _admin(); - } - - /** - * @return The address of the implementation. - */ - function implementation() external ifAdmin returns (address) { - return _implementation(); - } - - /** - * @dev Changes the admin of the proxy. - * Only the current admin can call this function. - * @param newAdmin Address to transfer proxy administration to. - */ - function changeAdmin(address newAdmin) external ifAdmin { - require(newAdmin != address(0), 'Cannot change the admin of a proxy to the zero address'); - emit AdminChanged(_admin(), newAdmin); - _setAdmin(newAdmin); - } - - /** - * @dev Upgrade the backing implementation of the proxy. - * Only the admin can call this function. - * @param newImplementation Address of the new implementation. - */ - function upgradeTo(address newImplementation) external ifAdmin { - _upgradeTo(newImplementation); - } - - /** - * @dev Upgrade the backing implementation of the proxy and call a function - * on the new implementation. - * This is useful to initialize the proxied contract. - * @param newImplementation Address of the new implementation. - * @param data Data to send as msg.data in the low level call. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - */ - function upgradeToAndCall(address newImplementation, bytes calldata data) - external - payable - ifAdmin - { - _upgradeTo(newImplementation); - (bool success, ) = newImplementation.delegatecall(data); - require(success); - } - - /** - * @return adm The admin slot. - */ - function _admin() internal view returns (address adm) { - bytes32 slot = ADMIN_SLOT; - //solium-disable-next-line - assembly { - adm := sload(slot) - } - } - - /** - * @dev Sets the address of the proxy admin. - * @param newAdmin Address of the new proxy admin. - */ - function _setAdmin(address newAdmin) internal { - bytes32 slot = ADMIN_SLOT; - //solium-disable-next-line - assembly { - sstore(slot, newAdmin) - } - } - - /** - * @dev Only fall back when the sender is not the admin. - */ - function _willFallback() internal virtual override { - require(msg.sender != _admin(), 'Cannot call fallback function from the proxy admin'); - super._willFallback(); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol deleted file mode 100644 index bf52cd59..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import './Proxy.sol'; -import '../contracts/Address.sol'; - -/** - * @title BaseUpgradeabilityProxy - * @dev This contract implements a proxy that allows to change the - * implementation address to which it will delegate. - * Such a change is called an implementation upgrade. - */ -contract BaseUpgradeabilityProxy is Proxy { - /** - * @dev Emitted when the implementation is upgraded. - * @param implementation Address of the new implementation. - */ - event Upgraded(address indexed implementation); - - /** - * @dev Storage slot with the address of the current implementation. - * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant IMPLEMENTATION_SLOT = - 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /** - * @dev Returns the current implementation. - * @return impl Address of the current implementation - */ - function _implementation() internal view override returns (address impl) { - bytes32 slot = IMPLEMENTATION_SLOT; - //solium-disable-next-line - assembly { - impl := sload(slot) - } - } - - /** - * @dev Upgrades the proxy to a new implementation. - * @param newImplementation Address of the new implementation. - */ - function _upgradeTo(address newImplementation) internal { - _setImplementation(newImplementation); - emit Upgraded(newImplementation); - } - - /** - * @dev Sets the implementation address of the proxy. - * @param newImplementation Address of the new implementation. - */ - function _setImplementation(address newImplementation) internal { - require( - Address.isContract(newImplementation), - 'Cannot set a proxy implementation to a non-contract address' - ); - - bytes32 slot = IMPLEMENTATION_SLOT; - - //solium-disable-next-line - assembly { - sstore(slot, newImplementation) - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol deleted file mode 100644 index 49ca1344..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import './BaseAdminUpgradeabilityProxy.sol'; -import './InitializableUpgradeabilityProxy.sol'; - -/** - * @title InitializableAdminUpgradeabilityProxy - * @dev Extends from BaseAdminUpgradeabilityProxy with an initializer for - * initializing the implementation, admin, and init data. - */ -contract InitializableAdminUpgradeabilityProxy is - BaseAdminUpgradeabilityProxy, - InitializableUpgradeabilityProxy -{ - /** - * Contract initializer. - * @param logic address of the initial implementation. - * @param admin Address of the proxy administrator. - * @param data Data to send as msg.data to the implementation to initialize the proxied contract. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. - */ - function initialize( - address logic, - address admin, - bytes memory data - ) public payable { - require(_implementation() == address(0)); - InitializableUpgradeabilityProxy.initialize(logic, data); - assert(ADMIN_SLOT == bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)); - _setAdmin(admin); - } - - /** - * @dev Only fall back when the sender is not the admin. - */ - function _willFallback() internal override(BaseAdminUpgradeabilityProxy, Proxy) { - BaseAdminUpgradeabilityProxy._willFallback(); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol deleted file mode 100644 index 5ecec083..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import './BaseUpgradeabilityProxy.sol'; - -/** - * @title InitializableUpgradeabilityProxy - * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing - * implementation and init data. - */ -contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { - /** - * @dev Contract initializer. - * @param _logic Address of the initial implementation. - * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. - */ - function initialize(address _logic, bytes memory _data) public payable { - require(_implementation() == address(0)); - assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); - _setImplementation(_logic); - if (_data.length > 0) { - (bool success, ) = _logic.delegatecall(_data); - require(success); - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol deleted file mode 100644 index 44b790da..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -/** - * @title Proxy - * @dev Implements delegation of calls to other contracts, with proper - * forwarding of return values and bubbling of failures. - * It defines a fallback function that delegates all calls to the address - * returned by the abstract _implementation() internal function. - */ -abstract contract Proxy { - /** - * @dev Fallback function. - * Will run if no other function in the contract matches the call data. - * Implemented entirely in `_fallback`. - */ - fallback() external payable { - _fallback(); - } - - /** - * @return The Address of the implementation. - */ - function _implementation() internal view virtual returns (address); - - /** - * @dev Delegates execution to an implementation contract. - * This is a low level function that doesn't return to its internal call site. - * It will return to the external caller whatever the implementation returns. - * @param implementation Address to delegate. - */ - function _delegate(address implementation) internal { - //solium-disable-next-line - assembly { - // Copy msg.data. We take full control of memory in this inline assembly - // block because it will not return to Solidity code. We overwrite the - // Solidity scratch pad at memory position 0. - calldatacopy(0, 0, calldatasize()) - - // Call the implementation. - // out and outsize are 0 because we don't know the size yet. - let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) - - // Copy the returned data. - returndatacopy(0, 0, returndatasize()) - - switch result - // delegatecall returns 0 on error. - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } - } - } - - /** - * @dev Function that is run as the first thing in the fallback function. - * Can be redefined in derived contracts to add functionality. - * Redefinitions must call super._willFallback(). - */ - function _willFallback() internal virtual {} - - /** - * @dev fallback implementation. - * Extracted to enable manual triggering. - */ - function _fallback() internal { - _willFallback(); - _delegate(_implementation()); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/UpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/UpgradeabilityProxy.sol deleted file mode 100644 index 896707a8..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/UpgradeabilityProxy.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import './BaseUpgradeabilityProxy.sol'; - -/** - * @title UpgradeabilityProxy - * @dev Extends BaseUpgradeabilityProxy with a constructor for initializing - * implementation and init data. - */ -contract UpgradeabilityProxy is BaseUpgradeabilityProxy { - /** - * @dev Contract constructor. - * @param _logic Address of the initial implementation. - * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. - */ - constructor(address _logic, bytes memory _data) payable { - assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); - _setImplementation(_logic); - if (_data.length > 0) { - (bool success, ) = _logic.delegatecall(_data); - require(success); - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol deleted file mode 100644 index 8176f6cf..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {PoolConfigurator} from '../protocol/pool/PoolConfigurator.sol'; -import {Ownable} from '../dependencies/openzeppelin/contracts/Ownable.sol'; - -/** - * @title ReservesSetupHelper - * @author Aave - * @notice Deployment helper to setup the assets risk parameters at PoolConfigurator in batch. - * @dev The ReservesSetupHelper is an Ownable contract, so only the deployer or future owners can call this contract. - */ -contract ReservesSetupHelper is Ownable { - struct ConfigureReserveInput { - address asset; - uint256 baseLTV; - uint256 liquidationThreshold; - uint256 liquidationBonus; - uint256 reserveFactor; - uint256 borrowCap; - uint256 supplyCap; - bool stableBorrowingEnabled; - bool borrowingEnabled; - } - - /** - * @notice External function called by the owner account to setup the assets risk parameters in batch. - * @dev The Pool or Risk admin must transfer the ownership to ReservesSetupHelper before calling this function - * @param configurator The address of PoolConfigurator contract - * @param inputParams An array of ConfigureReserveInput struct that contains the assets and their risk parameters - */ - function configureReserves( - PoolConfigurator configurator, - ConfigureReserveInput[] calldata inputParams - ) external onlyOwner { - for (uint256 i = 0; i < inputParams.length; i++) { - configurator.configureReserveAsCollateral( - inputParams[i].asset, - inputParams[i].baseLTV, - inputParams[i].liquidationThreshold, - inputParams[i].liquidationBonus - ); - - if (inputParams[i].borrowingEnabled) { - configurator.setReserveBorrowing(inputParams[i].asset, true); - - configurator.setBorrowCap(inputParams[i].asset, inputParams[i].borrowCap); - configurator.setReserveStableRateBorrowing( - inputParams[i].asset, - inputParams[i].stableBorrowingEnabled - ); - } - configurator.setSupplyCap(inputParams[i].asset, inputParams[i].supplyCap); - configurator.setReserveFactor(inputParams[i].asset, inputParams[i].reserveFactor); - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/base/FlashLoanReceiverBase.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/base/FlashLoanReceiverBase.sol deleted file mode 100644 index 23908982..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/base/FlashLoanReceiverBase.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IFlashLoanReceiver} from '../interfaces/IFlashLoanReceiver.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../interfaces/IPool.sol'; - -/** - * @title FlashLoanReceiverBase - * @author Aave - * @notice Base contract to develop a flashloan-receiver contract. - */ -abstract contract FlashLoanReceiverBase is IFlashLoanReceiver { - IPoolAddressesProvider public immutable override ADDRESSES_PROVIDER; - IPool public immutable override POOL; - - constructor(IPoolAddressesProvider provider) { - ADDRESSES_PROVIDER = provider; - POOL = IPool(provider.getPool()); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/interfaces/IFlashLoanReceiver.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/interfaces/IFlashLoanReceiver.sol deleted file mode 100644 index 132c5477..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/interfaces/IFlashLoanReceiver.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../interfaces/IPool.sol'; - -/** - * @title IFlashLoanReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - **/ -interface IFlashLoanReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed assets - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param assets The addresses of the flash-borrowed assets - * @param amounts The amounts of the flash-borrowed assets - * @param premiums The fee of each flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata premiums, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/interfaces/IFlashLoanSimpleReceiver.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/interfaces/IFlashLoanSimpleReceiver.sol deleted file mode 100644 index 46236f5e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/flashloan/interfaces/IFlashLoanSimpleReceiver.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../interfaces/IPool.sol'; - -/** - * @title IFlashLoanSimpleReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - **/ -interface IFlashLoanSimpleReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed asset - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param asset The address of the flash-borrowed asset - * @param amount The amount of the flash-borrowed asset - * @param premium The fee of the flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address asset, - uint256 amount, - uint256 premium, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 4bb6e645..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - **/ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an admin as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAToken.sol deleted file mode 100644 index 21726c8e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,150 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - **/ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The amount being transferred - * @param index The next liquidity index of the reserve - **/ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - **/ - function burn( - address from, - address receiverOfUnderlying, - uint256 amount, - uint256 index - ) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - **/ - function transferOnLiquidation( - address from, - address to, - uint256 value - ) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param user The recipient of the underlying - * @param amount The amount getting transferred - **/ - function transferUnderlyingTo(address user, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param amount The amount getting repaid - **/ - function handleRepayment(address user, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - **/ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - **/ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - **/ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens( - address token, - address to, - uint256 amount - ) external; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index d0663cd3..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,176 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - **/ -interface IAaveIncentivesController { - /** - * @dev Emitted during `handleAction`, `claimRewards` and `claimRewardsOnBehalf` - * @param user The user that accrued rewards - * @param amount The amount of accrued rewards - */ - event RewardsAccrued(address indexed user, uint256 amount); - - event RewardsClaimed(address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted during `claimRewards` and `claimRewardsOnBehalf` - * @param user The address that accrued rewards - * @param to The address that will be receiving the rewards - * @param claimer The address that performed the claim - * @param amount The amount of rewards - */ - event RewardsClaimed( - address indexed user, - address indexed to, - address indexed claimer, - uint256 amount - ); - - /** - * @dev Emitted during `setClaimer` - * @param user The address of the user - * @param claimer The address of the claimer - */ - event ClaimerSet(address indexed user, address indexed claimer); - - /** - * @notice Returns the configuration of the distribution for a certain asset - * @param asset The address of the reference asset of the distribution - * @return The asset index - * @return The emission per second - * @return The last updated timestamp - **/ - function getAssetData(address asset) - external - view - returns ( - uint256, - uint256, - uint256 - ); - - /** - * LEGACY ************************** - * @dev Returns the configuration of the distribution for a certain asset - * @param asset The address of the reference asset of the distribution - * @return The asset index, the emission per second and the last updated timestamp - **/ - function assets(address asset) - external - view - returns ( - uint128, - uint128, - uint256 - ); - - /** - * @notice Whitelists an address to claim the rewards on behalf of another address - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @notice Returns the whitelisted claimer for a certain address (0x0 if not set) - * @param user The address of the user - * @return The claimer address - */ - function getClaimer(address user) external view returns (address); - - /** - * @notice Configure assets for a certain rewards emission - * @param assets The assets to incentivize - * @param emissionsPerSecond The emission for each asset - */ - function configureAssets(address[] calldata assets, uint256[] calldata emissionsPerSecond) - external; - - /** - * @notice Called by the corresponding asset on any update that affects the rewards distribution - * @param asset The address of the user - * @param userBalance The balance of the user of the asset in the pool - * @param totalSupply The total supply of the asset in the pool - **/ - function handleAction( - address asset, - uint256 userBalance, - uint256 totalSupply - ) external; - - /** - * @notice Returns the total of rewards of a user, already accrued + not yet accrued - * @param assets The assets to accumulate rewards for - * @param user The address of the user - * @return The rewards - **/ - function getRewardsBalance(address[] calldata assets, address user) - external - view - returns (uint256); - - /** - * @notice Claims reward for a user, on the assets of the pool, accumulating the pending rewards - * @param assets The assets to accumulate rewards for - * @param amount Amount of rewards to claim - * @param to Address that will be receiving the rewards - * @return Rewards claimed - **/ - function claimRewards( - address[] calldata assets, - uint256 amount, - address to - ) external returns (uint256); - - /** - * @notice Claims reward for a user on its behalf, on the assets of the pool, accumulating the pending rewards. - * @dev The caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The assets to accumulate rewards for - * @param amount The amount of rewards to claim - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @return The amount of rewards claimed - **/ - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to - ) external returns (uint256); - - /** - * @notice Returns the unclaimed rewards of the user - * @param user The address of the user - * @return The unclaimed user rewards - */ - function getUserUnclaimedRewards(address user) external view returns (uint256); - - /** - * @notice Returns the user index for a specific asset - * @param user The address of the user - * @param asset The asset to incentivize - * @return The user index for the asset - */ - function getUserAssetData(address user, address asset) external view returns (uint256); - - /** - * @notice for backward compatibility with previous implementation of the Incentives controller - * @return The address of the reward token - */ - function REWARD_TOKEN() external view returns (address); - - /** - * @notice for backward compatibility with previous implementation of the Incentives controller - * @return The precision used in the incentives controller - */ - function PRECISION() external view returns (uint8); - - /** - * @dev Gets the distribution end timestamp of the emissions - */ - function DISTRIBUTION_END() external view returns (uint256); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAaveOracle.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAaveOracle.sol deleted file mode 100644 index 0ad9b47f..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IAaveOracle.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IPriceOracleGetter} from './IPriceOracleGetter.sol'; -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IAaveOracle - * @author Aave - * @notice Defines the basic interface for the Aave Oracle - */ -interface IAaveOracle is IPriceOracleGetter { - /** - * @dev Emitted after the base currency is set - * @param baseCurrency The base currency of used for price quotes - * @param baseCurrencyUnit The unit of the base currency - */ - event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); - - /** - * @dev Emitted after the price source of an asset is updated - * @param asset The address of the asset - * @param source The price source of the asset - */ - event AssetSourceUpdated(address indexed asset, address indexed source); - - /** - * @dev Emitted after the address of fallback oracle is updated - * @param fallbackOracle The address of the fallback oracle - */ - event FallbackOracleUpdated(address indexed fallbackOracle); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Sets or replaces price sources of assets - * @param assets The addresses of the assets - * @param sources The addresses of the price sources - */ - function setAssetSources(address[] calldata assets, address[] calldata sources) external; - - /** - * @notice Sets the fallback oracle - * @param fallbackOracle The address of the fallback oracle - */ - function setFallbackOracle(address fallbackOracle) external; - - /** - * @notice Returns a list of prices from a list of assets addresses - * @param assets The list of assets addresses - * @return The prices of the given assets - */ - function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); - - /** - * @notice Returns the address of the source for an asset address - * @param asset The address of the asset - * @return The address of the source - */ - function getSourceOfAsset(address asset) external view returns (address); - - /** - * @notice Returns the address of the fallback oracle - * @return The address of the fallback oracle - */ - function getFallbackOracle() external view returns (address); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/ICreditDelegationToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/ICreditDelegationToken.sol deleted file mode 100644 index a06de1f8..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/ICreditDelegationToken.sol +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title ICreditDelegationToken - * @author Aave - * @notice Defines the basic interface for a token supporting credit delegation. - **/ -interface ICreditDelegationToken { - /** - * @dev Emitted on `approveDelegation` and `borrowAllowance - * @param fromUser The address of the delegator - * @param toUser The address of the delegatee - * @param asset The address of the delegated asset - * @param amount The amount being delegated - */ - event BorrowAllowanceDelegated( - address indexed fromUser, - address indexed toUser, - address indexed asset, - uint256 amount - ); - - /** - * @notice Delegates borrowing power to a user on the specific debt token. - * Delegation will still respect the liquidation constraints (even if delegated, a - * delegatee cannot force a delegator HF to go below 1) - * @param delegatee The address receiving the delegated borrowing power - * @param amount The maximum amount being delegated. - **/ - function approveDelegation(address delegatee, uint256 amount) external; - - /** - * @notice Returns the borrow allowance of the user - * @param fromUser The user to giving allowance - * @param toUser The user to give allowance to - * @return The current allowance of `toUser` - **/ - function borrowAllowance(address fromUser, address toUser) external view returns (uint256); - - /** - * @notice Delegates borrowing power to a user on the specific debt token via ERC712 signature - * @param delegator The delegator of the credit - * @param delegatee The delegatee that can use the credit - * @param value The amount to be delegated - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v The V signature param - * @param s The S signature param - * @param r The R signature param - */ - function delegationWithSig( - address delegator, - address delegatee, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IDelegationToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IDelegationToken.sol deleted file mode 100644 index 288f1e55..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IDelegationToken.sol +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title IDelegationToken - * @author Aave - * @notice Implements an interface for tokens with delegation COMP/UNI compatible - **/ -interface IDelegationToken { - /** - * @notice Delegate voting power to a delegatee - * @param delegatee The address of the delegatee - */ - function delegate(address delegatee) external; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IERC20WithPermit.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IERC20WithPermit.sol deleted file mode 100644 index 3c67e56e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IERC20WithPermit.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; - -/** - * @title IERC20WithPermit - * @author Aave - * @notice Interface for the permit function (EIP-2612) - **/ -interface IERC20WithPermit is IERC20 { - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index ba0ca82e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - **/ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - **/ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 740cb8c7..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - **/ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - **/ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IL2Pool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IL2Pool.sol deleted file mode 100644 index 27ac223e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IL2Pool.sol +++ /dev/null @@ -1,141 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title IL2Pool - * @author Aave - * @notice Defines the basic extension interface for an L2 Aave Pool. - **/ -interface IL2Pool { - /** - * @notice Calldata efficient wrapper of the supply function on behalf of the caller - * @param args Arguments for the supply function packed in one bytes32 - * 96 bits 16 bits 128 bits 16 bits - * | 0-padding | referralCode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - */ - function supply(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the supplyWithPermit function on behalf of the caller - * @param args Arguments for the supply function packed in one bytes32 - * 56 bits 8 bits 32 bits 16 bits 128 bits 16 bits - * | 0-padding | permitV | shortenedDeadline | referralCode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @param r The R parameter of ERC712 permit sig - * @param s The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - bytes32 args, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Calldata efficient wrapper of the withdraw function, withdrawing to the caller - * @param args Arguments for the withdraw function packed in one bytes32 - * 112 bits 128 bits 16 bits - * | 0-padding | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - */ - function withdraw(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the borrow function, borrowing on behalf of the caller - * @param args Arguments for the borrow function packed in one bytes32 - * 88 bits 16 bits 8 bits 128 bits 16 bits - * | 0-padding | referralCode | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - */ - function borrow(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the repay function, repaying on behalf of the caller - * @param args Arguments for the repay function packed in one bytes32 - * 104 bits 8 bits 128 bits 16 bits - * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @return The final amount repaid - */ - function repay(bytes32 args) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the repayWithPermit function, repaying on behalf of the caller - * @param args Arguments for the repayWithPermit function packed in one bytes32 - * 64 bits 8 bits 32 bits 8 bits 128 bits 16 bits - * | 0-padding | permitV | shortenedDeadline | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @param r The R parameter of ERC712 permit sig - * @param s The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - bytes32 args, - bytes32 r, - bytes32 s - ) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the repayWithATokens function - * @param args Arguments for the repayWithATokens function packed in one bytes32 - * 104 bits 8 bits 128 bits 16 bits - * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @return The final amount repaid - */ - function repayWithATokens(bytes32 args) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the swapBorrowRateMode function - * @param args Arguments for the swapBorrowRateMode function packed in one bytes32 - * 232 bits 8 bits 16 bits - * | 0-padding | shortenedInterestRateMode | assetId | - * @dev assetId is the index of the asset in the reservesList. - */ - function swapBorrowRateMode(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the rebalanceStableBorrowRate function - * @param args Arguments for the rebalanceStableBorrowRate function packed in one bytes32 - * 80 bits 160 bits 16 bits - * | 0-padding | user address | assetId | - * @dev assetId is the index of the asset in the reservesList. - */ - function rebalanceStableBorrowRate(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the setUserUseReserveAsCollateral function - * @param args Arguments for the setUserUseReserveAsCollateral function packed in one bytes32 - * 239 bits 1 bit 16 bits - * | 0-padding | useAsCollateral | assetId | - * @dev assetId is the index of the asset in the reservesList. - */ - function setUserUseReserveAsCollateral(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the liquidationCall function - * @param args1 part of the arguments for the liquidationCall function packed in one bytes32 - * 64 bits 160 bits 16 bits 16 bits - * | 0-padding | user address | debtAssetId | collateralAssetId | - * @param args2 part of the arguments for the liquidationCall function packed in one bytes32 - * 127 bits 1 bit 128 bits - * | 0-padding | receiveAToken | shortenedDebtToCover | - * @dev the shortenedDebtToCover is cast to 256 bits at decode time, - * if type(uint128).max the value will be expanded to type(uint256).max - */ - function liquidationCall(bytes32 args1, bytes32 args2) external; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPool.sol deleted file mode 100644 index 7f64b4ab..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,747 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - **/ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - **/ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - **/ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - **/ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - **/ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - **/ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - **/ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on swapBorrowRateMode() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user swapping his rate mode - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - **/ - event SwapBorrowRateMode( - address indexed reserve, - address indexed user, - DataTypes.InterestRateMode interestRateMode - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - **/ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - **/ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - **/ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on rebalanceStableBorrowRate() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user for which the rebalance has been executed - **/ - event RebalanceStableBorrowRate(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt - * @param premium The fee flash borrowed - * @param referralCode The referral code used - **/ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - **/ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - **/ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - **/ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @dev Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @dev Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - **/ - function backUnbacked( - address asset, - uint256 amount, - uint256 fee - ) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function supply( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - **/ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - **/ - function withdraw( - address asset, - uint256 amount, - address to - ) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the - * corresponding debt token (StableDebtToken or VariableDebtToken) - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 stable/variable debt tokens, depending on the `interestRateMode` - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - **/ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - **/ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - **/ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @return The final amount repaid - **/ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa - * @param asset The address of the underlying asset borrowed - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - **/ - function swapBorrowRateMode(address asset, uint256 interestRateMode) external; - - /** - * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. - * - Users can be rebalanced if the following conditions are satisfied: - * 1. Usage ratio is above 95% - * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too - * much has been borrowed at a stable rate and suppliers are not earning enough - * @param asset The address of the underlying asset borrowed - * @param user The address of the user to be rebalanced - **/ - function rebalanceStableBorrowRate(address asset, address user) external; - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - **/ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - **/ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://developers.aave.com - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://developers.aave.com - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - **/ - function getUserAccountData(address user) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - **/ - function initReserve( - address asset, - address aTokenAddress, - address stableDebtAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - **/ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - **/ - function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress) - external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - **/ - function setConfiguration(address asset, DataTypes.ReserveConfigurationMap calldata configuration) - external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - **/ - function getConfiguration(address asset) - external - view - returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - **/ - function getUserConfiguration(address user) - external - view - returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - **/ - function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - **/ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - **/ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - **/ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new category for the eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; - - /** - * @notice Returns the data of an eMode category - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate - * @return The percentage of available liquidity to borrow, expressed in bps - */ - function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - **/ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens( - address token, - address to, - uint256 amount - ) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function deposit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index 01a126bd..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - **/ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - **/ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - **/ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - **/ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - **/ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - **/ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - **/ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - **/ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - **/ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol deleted file mode 100644 index a48ff207..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title IPoolAddressesProviderRegistry - * @author Aave - * @notice Defines the basic interface for an Aave Pool Addresses Provider Registry. - **/ -interface IPoolAddressesProviderRegistry { - /** - * @dev Emitted when a new AddressesProvider is registered. - * @param addressesProvider The address of the registered PoolAddressesProvider - * @param id The id of the registered PoolAddressesProvider - */ - event AddressesProviderRegistered(address indexed addressesProvider, uint256 indexed id); - - /** - * @dev Emitted when an AddressesProvider is unregistered. - * @param addressesProvider The address of the unregistered PoolAddressesProvider - * @param id The id of the unregistered PoolAddressesProvider - */ - event AddressesProviderUnregistered(address indexed addressesProvider, uint256 indexed id); - - /** - * @notice Returns the list of registered addresses providers - * @return The list of addresses providers - **/ - function getAddressesProvidersList() external view returns (address[] memory); - - /** - * @notice Returns the id of a registered PoolAddressesProvider - * @param addressesProvider The address of the PoolAddressesProvider - * @return The id of the PoolAddressesProvider or 0 if is not registered - */ - function getAddressesProviderIdByAddress(address addressesProvider) - external - view - returns (uint256); - - /** - * @notice Returns the address of a registered PoolAddressesProvider - * @param id The id of the market - * @return The address of the PoolAddressesProvider with the given id or zero address if it is not registered - */ - function getAddressesProviderAddressById(uint256 id) external view returns (address); - - /** - * @notice Registers an addresses provider - * @dev The PoolAddressesProvider must not already be registered in the registry - * @dev The id must not be used by an already registered PoolAddressesProvider - * @param provider The address of the new PoolAddressesProvider - * @param id The id for the new PoolAddressesProvider, referring to the market it belongs to - **/ - function registerAddressesProvider(address provider, uint256 id) external; - - /** - * @notice Removes an addresses provider from the list of registered addresses providers - * @param provider The PoolAddressesProvider address - **/ - function unregisterAddressesProvider(address provider) external; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolConfigurator.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolConfigurator.sol deleted file mode 100644 index d84454a7..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolConfigurator.sol +++ /dev/null @@ -1,468 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {ConfiguratorInputTypes} from '../protocol/libraries/types/ConfiguratorInputTypes.sol'; - -/** - * @title IPoolConfigurator - * @author Aave - * @notice Defines the basic interface for a Pool configurator. - **/ -interface IPoolConfigurator { - /** - * @dev Emitted when a reserve is initialized. - * @param asset The address of the underlying asset of the reserve - * @param aToken The address of the associated aToken contract - * @param stableDebtToken The address of the associated stable rate debt token - * @param variableDebtToken The address of the associated variable rate debt token - * @param interestRateStrategyAddress The address of the interest rate strategy for the reserve - **/ - event ReserveInitialized( - address indexed asset, - address indexed aToken, - address stableDebtToken, - address variableDebtToken, - address interestRateStrategyAddress - ); - - /** - * @dev Emitted when borrowing is enabled or disabled on a reserve. - * @param asset The address of the underlying asset of the reserve - * @param enabled True if borrowing is enabled, false otherwise - **/ - event ReserveBorrowing(address indexed asset, bool enabled); - - /** - * @dev Emitted when the collateralization risk parameters for the specified asset are updated. - * @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 - **/ - event CollateralConfigurationChanged( - address indexed asset, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus - ); - - /** - * @dev Emitted when stable rate borrowing is enabled or disabled on a reserve - * @param asset The address of the underlying asset of the reserve - * @param enabled True if stable rate borrowing is enabled, false otherwise - **/ - event ReserveStableRateBorrowing(address indexed asset, bool enabled); - - /** - * @dev Emitted when a reserve is activated or deactivated - * @param asset The address of the underlying asset of the reserve - * @param active True if reserve is active, false otherwise - **/ - event ReserveActive(address indexed asset, bool active); - - /** - * @dev Emitted when a reserve is frozen or unfrozen - * @param asset The address of the underlying asset of the reserve - * @param frozen True if reserve is frozen, false otherwise - **/ - event ReserveFrozen(address indexed asset, bool frozen); - - /** - * @dev Emitted when a reserve is paused or unpaused - * @param asset The address of the underlying asset of the reserve - * @param paused True if reserve is paused, false otherwise - **/ - event ReservePaused(address indexed asset, bool paused); - - /** - * @dev Emitted when a reserve is dropped. - * @param asset The address of the underlying asset of the reserve - **/ - event ReserveDropped(address indexed asset); - - /** - * @dev Emitted when a reserve factor is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldReserveFactor The old reserve factor, expressed in bps - * @param newReserveFactor The new reserve factor, expressed in bps - **/ - event ReserveFactorChanged( - address indexed asset, - uint256 oldReserveFactor, - uint256 newReserveFactor - ); - - /** - * @dev Emitted when the borrow cap of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldBorrowCap The old borrow cap - * @param newBorrowCap The new borrow cap - **/ - event BorrowCapChanged(address indexed asset, uint256 oldBorrowCap, uint256 newBorrowCap); - - /** - * @dev Emitted when the supply cap of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldSupplyCap The old supply cap - * @param newSupplyCap The new supply cap - **/ - event SupplyCapChanged(address indexed asset, uint256 oldSupplyCap, uint256 newSupplyCap); - - /** - * @dev Emitted when the liquidation protocol fee of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldFee The old liquidation protocol fee, expressed in bps - * @param newFee The new liquidation protocol fee, expressed in bps - **/ - event LiquidationProtocolFeeChanged(address indexed asset, uint256 oldFee, uint256 newFee); - - /** - * @dev Emitted when the unbacked mint cap of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldUnbackedMintCap The old unbacked mint cap - * @param newUnbackedMintCap The new unbacked mint cap - */ - event UnbackedMintCapChanged( - address indexed asset, - uint256 oldUnbackedMintCap, - uint256 newUnbackedMintCap - ); - - /** - * @dev Emitted when the category of an asset in eMode is changed. - * @param asset The address of the underlying asset of the reserve - * @param oldCategoryId The old eMode asset category - * @param newCategoryId The new eMode asset category - **/ - event EModeAssetCategoryChanged(address indexed asset, uint8 oldCategoryId, uint8 newCategoryId); - - /** - * @dev Emitted when a new eMode category is added. - * @param categoryId The new eMode category id - * @param ltv The ltv for the asset category in eMode - * @param liquidationThreshold The liquidationThreshold for the asset category in eMode - * @param liquidationBonus The liquidationBonus for the asset category in eMode - * @param oracle The optional address of the price oracle specific for this category - * @param label A human readable identifier for the category - **/ - event EModeCategoryAdded( - uint8 indexed categoryId, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - address oracle, - string label - ); - - /** - * @dev Emitted when a reserve interest strategy contract is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldStrategy The address of the old interest strategy contract - * @param newStrategy The address of the new interest strategy contract - **/ - event ReserveInterestRateStrategyChanged( - address indexed asset, - address oldStrategy, - address newStrategy - ); - - /** - * @dev Emitted when an aToken implementation is upgraded. - * @param asset The address of the underlying asset of the reserve - * @param proxy The aToken proxy address - * @param implementation The new aToken implementation - **/ - event ATokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @dev Emitted when the implementation of a stable debt token is upgraded. - * @param asset The address of the underlying asset of the reserve - * @param proxy The stable debt token proxy address - * @param implementation The new aToken implementation - **/ - event StableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @dev Emitted when the implementation of a variable debt token is upgraded. - * @param asset The address of the underlying asset of the reserve - * @param proxy The variable debt token proxy address - * @param implementation The new aToken implementation - **/ - event VariableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @dev Emitted when the debt ceiling of an asset is set. - * @param asset The address of the underlying asset of the reserve - * @param oldDebtCeiling The old debt ceiling - * @param newDebtCeiling The new debt ceiling - **/ - event DebtCeilingChanged(address indexed asset, uint256 oldDebtCeiling, uint256 newDebtCeiling); - - /** - * @dev Emitted when the the siloed borrowing state for an asset is changed. - * @param asset The address of the underlying asset of the reserve - * @param oldState The old siloed borrowing state - * @param newState The new siloed borrowing state - **/ - event SiloedBorrowingChanged(address indexed asset, bool oldState, bool newState); - - /** - * @dev Emitted when the bridge protocol fee is updated. - * @param oldBridgeProtocolFee The old protocol fee, expressed in bps - * @param newBridgeProtocolFee The new protocol fee, expressed in bps - */ - event BridgeProtocolFeeUpdated(uint256 oldBridgeProtocolFee, uint256 newBridgeProtocolFee); - - /** - * @dev Emitted when the total premium on flashloans is updated. - * @param oldFlashloanPremiumTotal The old premium, expressed in bps - * @param newFlashloanPremiumTotal The new premium, expressed in bps - **/ - event FlashloanPremiumTotalUpdated( - uint128 oldFlashloanPremiumTotal, - uint128 newFlashloanPremiumTotal - ); - - /** - * @dev Emitted when the part of the premium that goes to protocol is updated. - * @param oldFlashloanPremiumToProtocol The old premium, expressed in bps - * @param newFlashloanPremiumToProtocol The new premium, expressed in bps - **/ - event FlashloanPremiumToProtocolUpdated( - uint128 oldFlashloanPremiumToProtocol, - uint128 newFlashloanPremiumToProtocol - ); - - /** - * @dev Emitted when the reserve is set as borrowable/non borrowable in isolation mode. - * @param asset The address of the underlying asset of the reserve - * @param borrowable True if the reserve is borrowable in isolation, false otherwise - **/ - event BorrowableInIsolationChanged(address asset, bool borrowable); - - /** - * @notice Initializes multiple reserves. - * @param input The array of initialization parameters - **/ - function initReserves(ConfiguratorInputTypes.InitReserveInput[] calldata input) external; - - /** - * @dev Updates the aToken implementation for the reserve. - * @param input The aToken update parameters - **/ - function updateAToken(ConfiguratorInputTypes.UpdateATokenInput calldata input) external; - - /** - * @notice Updates the stable debt token implementation for the reserve. - * @param input The stableDebtToken update parameters - **/ - function updateStableDebtToken(ConfiguratorInputTypes.UpdateDebtTokenInput calldata input) - external; - - /** - * @notice Updates the variable debt token implementation for the asset. - * @param input The variableDebtToken update parameters - **/ - function updateVariableDebtToken(ConfiguratorInputTypes.UpdateDebtTokenInput calldata input) - external; - - /** - * @notice Configures borrowing on a reserve. - * @dev Can only be disabled (set to false) if stable borrowing is disabled - * @param asset The address of the underlying asset of the reserve - * @param enabled True if borrowing needs to be enabled, false otherwise - **/ - function setReserveBorrowing(address asset, bool enabled) external; - - /** - * @notice Configures the reserve collateralization parameters. - * @dev All the values are expressed in bps. A value of 10000, results in 100.00% - * @dev The `liquidationBonus` is always above 100%. A value of 105% means the liquidator will receive a 5% bonus - * @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 - **/ - function configureReserveAsCollateral( - address asset, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus - ) external; - - /** - * @notice Enable or disable stable rate borrowing on a reserve. - * @dev Can only be enabled (set to true) if borrowing is enabled - * @param asset The address of the underlying asset of the reserve - * @param enabled True if stable rate borrowing needs to be enabled, false otherwise - **/ - function setReserveStableRateBorrowing(address asset, bool enabled) external; - - /** - * @notice Activate or deactivate a reserve - * @param asset The address of the underlying asset of the reserve - * @param active True if the reserve needs to be active, false otherwise - **/ - function setReserveActive(address asset, bool active) external; - - /** - * @notice Freeze or unfreeze a reserve. A frozen reserve doesn't allow any new supply, borrow - * or rate swap but allows repayments, liquidations, rate rebalances and withdrawals. - * @param asset The address of the underlying asset of the reserve - * @param freeze True if the reserve needs to be frozen, false otherwise - **/ - function setReserveFreeze(address asset, bool freeze) external; - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the - * borrowed amount will be accumulated in the isolated collateral's total debt exposure - * @dev Only assets of the same family (e.g. USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations - * @param asset The address of the underlying asset of the reserve - * @param borrowable True if the asset should be borrowable in isolation, false otherwise - **/ - function setBorrowableInIsolation(address asset, bool borrowable) external; - - /** - * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, - * swap interest rate, liquidate, atoken transfers). - * @param asset The address of the underlying asset of the reserve - * @param paused True if pausing the reserve, false if unpausing - **/ - function setReservePause(address asset, bool paused) external; - - /** - * @notice Updates the reserve factor of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newReserveFactor The new reserve factor of the reserve - **/ - function setReserveFactor(address asset, uint256 newReserveFactor) external; - - /** - * @notice Sets the interest rate strategy of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newRateStrategyAddress The address of the new interest strategy contract - **/ - function setReserveInterestRateStrategyAddress(address asset, address newRateStrategyAddress) - external; - - /** - * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions - * are suspended. - * @param paused True if protocol needs to be paused, false otherwise - **/ - function setPoolPause(bool paused) external; - - /** - * @notice Updates the borrow cap of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newBorrowCap The new borrow cap of the reserve - **/ - function setBorrowCap(address asset, uint256 newBorrowCap) external; - - /** - * @notice Updates the supply cap of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newSupplyCap The new supply cap of the reserve - **/ - function setSupplyCap(address asset, uint256 newSupplyCap) external; - - /** - * @notice Updates the liquidation protocol fee of reserve. - * @param asset The address of the underlying asset of the reserve - * @param newFee The new liquidation protocol fee of the reserve, expressed in bps - **/ - function setLiquidationProtocolFee(address asset, uint256 newFee) external; - - /** - * @notice Updates the unbacked mint cap of reserve. - * @param asset The address of the underlying asset of the reserve - * @param newUnbackedMintCap The new unbacked mint cap of the reserve - **/ - function setUnbackedMintCap(address asset, uint256 newUnbackedMintCap) external; - - /** - * @notice Assign an efficiency mode (eMode) category to asset. - * @param asset The address of the underlying asset of the reserve - * @param newCategoryId The new category id of the asset - **/ - function setAssetEModeCategory(address asset, uint8 newCategoryId) external; - - /** - * @notice Adds a new efficiency mode (eMode) category. - * @dev If zero is provided as oracle address, the default asset oracles will be used to compute the overall debt and - * overcollateralization of the users using this category. - * @dev The new ltv and liquidation threshold must be greater than the base - * ltvs and liquidation thresholds of all assets within the eMode category - * @param categoryId The id of the category to be configured - * @param ltv The ltv associated with the category - * @param liquidationThreshold The liquidation threshold associated with the category - * @param liquidationBonus The liquidation bonus associated with the category - * @param oracle The oracle associated with the category - * @param label A label identifying the category - **/ - function setEModeCategory( - uint8 categoryId, - uint16 ltv, - uint16 liquidationThreshold, - uint16 liquidationBonus, - address oracle, - string calldata label - ) external; - - /** - * @notice Drops a reserve entirely. - * @param asset The address of the reserve to drop - **/ - function dropReserve(address asset) external; - - /** - * @notice Updates the bridge fee collected by the protocol reserves. - * @param newBridgeProtocolFee The part of the fee sent to the protocol treasury, expressed in bps - */ - function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external; - - /** - * @notice Updates the total flash loan premium. - * Total flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra balance - * - A part is collected by the protocol reserves - * @dev Expressed in bps - * @dev The premium is calculated on the total amount borrowed - * @param newFlashloanPremiumTotal The total flashloan premium - */ - function updateFlashloanPremiumTotal(uint128 newFlashloanPremiumTotal) external; - - /** - * @notice Updates the flash loan premium collected by protocol reserves - * @dev Expressed in bps - * @dev The premium to protocol is calculated on the total flashloan premium - * @param newFlashloanPremiumToProtocol The part of the flashloan premium sent to the protocol treasury - */ - function updateFlashloanPremiumToProtocol(uint128 newFlashloanPremiumToProtocol) external; - - /** - * @notice Sets the debt ceiling for an asset. - * @param newDebtCeiling The new debt ceiling - */ - function setDebtCeiling(address asset, uint256 newDebtCeiling) external; - - /** - * @notice Sets siloed borrowing for an asset - * @param siloed The new siloed borrowing state - */ - function setSiloedBorrowing(address asset, bool siloed) external; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolDataProvider.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolDataProvider.sol deleted file mode 100644 index 331653a2..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPoolDataProvider.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -interface IPoolDataProvider { - /** - * @notice Returns the reserve data - * @param asset The address of the underlying asset of the reserve - * @return unbacked The amount of unbacked tokens - * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted - * @return totalAToken The total supply of the aToken - * @return totalStableDebt The total stable debt of the reserve - * @return totalVariableDebt The total variable debt of the reserve - * @return liquidityRate The liquidity rate of the reserve - * @return variableBorrowRate The variable borrow rate of the reserve - * @return stableBorrowRate The stable borrow rate of the reserve - * @return averageStableBorrowRate The average stable borrow rate of the reserve - * @return liquidityIndex The liquidity index of the reserve - * @return variableBorrowIndex The variable borrow index of the reserve - * @return lastUpdateTimestamp The timestamp of the last update of the reserve - **/ - function getReserveData(address asset) - external - view - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ); - - /** - * @notice Returns the total supply of aTokens for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total supply of the aToken - **/ - function getATokenTotalSupply(address asset) external view returns (uint256); - - /** - * @notice Returns the total debt for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total debt for asset - **/ - function getTotalDebt(address asset) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 92c1c466..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - **/ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - **/ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - **/ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - **/ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index 6d05bf0f..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index 5c9cbdce..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author Aave - * @notice Interface for the calculation of the interest rates - */ -interface IReserveInterestRateStrategy { - /** - * @notice Returns the base variable borrow rate - * @return The base variable borrow rate, expressed in ray - **/ - function getBaseVariableBorrowRate() external view returns (uint256); - - /** - * @notice Returns the maximum variable borrow rate - * @return The maximum variable borrow rate, expressed in ray - **/ - function getMaxVariableBorrowRate() external view returns (uint256); - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in rays - * @return stableBorrowRate The stable borrow rate expressed in rays - * @return variableBorrowRate The variable borrow rate expressed in rays - **/ - function calculateInterestRates(DataTypes.CalculateInterestRatesParams memory params) - external - view - returns ( - uint256, - uint256, - uint256 - ); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 901e8751..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaledbalance token. - **/ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted scaled balance tokens - * @param value The amount being minted (user entered amount + balance increase from interest) - * @param balanceIncrease The increase in balance since the last action of the user - * @param index The next liquidity index of the reserve - **/ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after scaled balance tokens are burned - * @param from The address from which the scaled tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in balance since the last action of the user - * @param index The next liquidity index of the reserve - **/ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - **/ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - **/ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - **/ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - **/ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IStableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IStableDebtToken.sol deleted file mode 100644 index ad5cdb45..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IStableDebtToken.sol +++ /dev/null @@ -1,153 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IStableDebtToken - * @author Aave - * @notice Defines the interface for the stable debt token - * @dev It does not inherit from IERC20 to save in code size - **/ -interface IStableDebtToken is IInitializableDebtToken { - /** - * @dev Emitted when new stable debt is minted - * @param user The address of the user who triggered the minting - * @param onBehalfOf The recipient of stable debt tokens - * @param amount The amount minted (user entered amount + balance increase from interest) - * @param currentBalance The current balance of the user - * @param balanceIncrease The increase in balance since the last action of the user - * @param newRate The rate of the debt after the minting - * @param avgStableRate The next average stable rate after the minting - * @param newTotalSupply The next total supply of the stable debt token after the action - **/ - event Mint( - address indexed user, - address indexed onBehalfOf, - uint256 amount, - uint256 currentBalance, - uint256 balanceIncrease, - uint256 newRate, - uint256 avgStableRate, - uint256 newTotalSupply - ); - - /** - * @dev Emitted when new stable debt is burned - * @param from The address from which the debt will be burned - * @param amount The amount being burned (user entered amount - balance increase from interest) - * @param currentBalance The current balance of the user - * @param balanceIncrease The the increase in balance since the last action of the user - * @param avgStableRate The next average stable rate after the burning - * @param newTotalSupply The next total supply of the stable debt token after the action - **/ - event Burn( - address indexed from, - uint256 amount, - uint256 currentBalance, - uint256 balanceIncrease, - uint256 avgStableRate, - uint256 newTotalSupply - ); - - /** - * @notice Mints debt token to the `onBehalfOf` address. - * @dev The resulting rate is the weighted average between the rate of the new debt - * and the rate of the previous debt - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt tokens to mint - * @param rate The rate of the debt being minted - * @return True if it is the first borrow, false otherwise - * @return The total stable debt - * @return The average stable borrow rate - **/ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 rate - ) - external - returns ( - bool, - uint256, - uint256 - ); - - /** - * @notice Burns debt of `user` - * @dev The resulting rate is the weighted average between the rate of the new debt - * and the rate of the previous debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest the user earned - * @param from The address from which the debt will be burned - * @param amount The amount of debt tokens getting burned - * @return The total stable debt - * @return The average stable borrow rate - **/ - function burn(address from, uint256 amount) external returns (uint256, uint256); - - /** - * @notice Returns the average rate of all the stable rate loans. - * @return The average stable rate - **/ - function getAverageStableRate() external view returns (uint256); - - /** - * @notice Returns the stable rate of the user debt - * @param user The address of the user - * @return The stable rate of the user - **/ - function getUserStableRate(address user) external view returns (uint256); - - /** - * @notice Returns the timestamp of the last update of the user - * @param user The address of the user - * @return The timestamp - **/ - function getUserLastUpdated(address user) external view returns (uint40); - - /** - * @notice Returns the principal, the total supply, the average stable rate and the timestamp for the last update - * @return The principal - * @return The total supply - * @return The average stable rate - * @return The timestamp of the last update - **/ - function getSupplyData() - external - view - returns ( - uint256, - uint256, - uint256, - uint40 - ); - - /** - * @notice Returns the timestamp of the last update of the total supply - * @return The timestamp - **/ - function getTotalSupplyLastUpdated() external view returns (uint40); - - /** - * @notice Returns the total supply and the average stable rate - * @return The total supply - * @return The average rate - **/ - function getTotalSupplyAndAvgRate() external view returns (uint256, uint256); - - /** - * @notice Returns the principal debt balance of the user - * @return The debt balance of the user since the last burn/mint action - **/ - function principalBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this stableDebtToken (E.g. WETH for stableDebtWETH) - * @return The address of the underlying asset - **/ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 59facb7b..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - **/ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - **/ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - **/ - function burn( - address from, - uint256 amount, - uint256 index - ) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - **/ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/AaveOracle.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/AaveOracle.sol deleted file mode 100644 index 99afe286..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/AaveOracle.sol +++ /dev/null @@ -1,152 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {AggregatorInterface} from '../dependencies/chainlink/AggregatorInterface.sol'; -import {Errors} from '../protocol/libraries/helpers/Errors.sol'; -import {IACLManager} from '../interfaces/IACLManager.sol'; -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {IPriceOracleGetter} from '../interfaces/IPriceOracleGetter.sol'; -import {IAaveOracle} from '../interfaces/IAaveOracle.sol'; - -/** - * @title AaveOracle - * @author Aave - * @notice Contract to get asset prices, manage price sources and update the fallback oracle - * - Use of Chainlink Aggregators as first source of price - * - If the returned price by a Chainlink aggregator is <= 0, the call is forwarded to a fallback oracle - * - Owned by the Aave governance - */ -contract AaveOracle is IAaveOracle { - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - // Map of asset price sources (asset => priceSource) - mapping(address => AggregatorInterface) private assetsSources; - - IPriceOracleGetter private _fallbackOracle; - address public immutable override BASE_CURRENCY; - uint256 public immutable override BASE_CURRENCY_UNIT; - - /** - * @dev Only asset listing or pool admin can call functions marked by this modifier. - **/ - modifier onlyAssetListingOrPoolAdmins() { - _onlyAssetListingOrPoolAdmins(); - _; - } - - /** - * @notice Constructor - * @param provider The address of the new PoolAddressesProvider - * @param assets The addresses of the assets - * @param sources The address of the source of each asset - * @param fallbackOracle The address of the fallback oracle to use if the data of an - * aggregator is not consistent - * @param baseCurrency The base currency used for the price quotes. If USD is used, base currency is 0x0 - * @param baseCurrencyUnit The unit of the base currency - */ - constructor( - IPoolAddressesProvider provider, - address[] memory assets, - address[] memory sources, - address fallbackOracle, - address baseCurrency, - uint256 baseCurrencyUnit - ) { - ADDRESSES_PROVIDER = provider; - _setFallbackOracle(fallbackOracle); - _setAssetsSources(assets, sources); - BASE_CURRENCY = baseCurrency; - BASE_CURRENCY_UNIT = baseCurrencyUnit; - emit BaseCurrencySet(baseCurrency, baseCurrencyUnit); - } - - /// @inheritdoc IAaveOracle - function setAssetSources(address[] calldata assets, address[] calldata sources) - external - override - onlyAssetListingOrPoolAdmins - { - _setAssetsSources(assets, sources); - } - - /// @inheritdoc IAaveOracle - function setFallbackOracle(address fallbackOracle) - external - override - onlyAssetListingOrPoolAdmins - { - _setFallbackOracle(fallbackOracle); - } - - /** - * @notice Internal function to set the sources for each asset - * @param assets The addresses of the assets - * @param sources The address of the source of each asset - */ - function _setAssetsSources(address[] memory assets, address[] memory sources) internal { - require(assets.length == sources.length, Errors.INCONSISTENT_PARAMS_LENGTH); - for (uint256 i = 0; i < assets.length; i++) { - assetsSources[assets[i]] = AggregatorInterface(sources[i]); - emit AssetSourceUpdated(assets[i], sources[i]); - } - } - - /** - * @notice Internal function to set the fallback oracle - * @param fallbackOracle The address of the fallback oracle - */ - function _setFallbackOracle(address fallbackOracle) internal { - _fallbackOracle = IPriceOracleGetter(fallbackOracle); - emit FallbackOracleUpdated(fallbackOracle); - } - - /// @inheritdoc IPriceOracleGetter - function getAssetPrice(address asset) public view override returns (uint256) { - AggregatorInterface source = assetsSources[asset]; - - if (asset == BASE_CURRENCY) { - return BASE_CURRENCY_UNIT; - } else if (address(source) == address(0)) { - return _fallbackOracle.getAssetPrice(asset); - } else { - int256 price = source.latestAnswer(); - if (price > 0) { - return uint256(price); - } else { - return _fallbackOracle.getAssetPrice(asset); - } - } - } - - /// @inheritdoc IAaveOracle - function getAssetsPrices(address[] calldata assets) - external - view - override - returns (uint256[] memory) - { - uint256[] memory prices = new uint256[](assets.length); - for (uint256 i = 0; i < assets.length; i++) { - prices[i] = getAssetPrice(assets[i]); - } - return prices; - } - - /// @inheritdoc IAaveOracle - function getSourceOfAsset(address asset) external view override returns (address) { - return address(assetsSources[asset]); - } - - /// @inheritdoc IAaveOracle - function getFallbackOracle() external view returns (address) { - return address(_fallbackOracle); - } - - function _onlyAssetListingOrPoolAdmins() internal view { - IACLManager aclManager = IACLManager(ADDRESSES_PROVIDER.getACLManager()); - require( - aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), - Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN - ); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol deleted file mode 100644 index 21bef5d0..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol +++ /dev/null @@ -1,377 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; -import {WadRayMath} from '../protocol/libraries/math/WadRayMath.sol'; -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {IStableDebtToken} from '../interfaces/IStableDebtToken.sol'; -import {IVariableDebtToken} from '../interfaces/IVariableDebtToken.sol'; -import {IPool} from '../interfaces/IPool.sol'; -import {IPoolDataProvider} from '../interfaces/IPoolDataProvider.sol'; - -/** - * @title AaveProtocolDataProvider - * @author Aave - * @notice Peripheral contract to collect and pre-process information from the Pool. - */ -contract AaveProtocolDataProvider is IPoolDataProvider { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - - address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; - address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - struct TokenData { - string symbol; - address tokenAddress; - } - - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - constructor(IPoolAddressesProvider addressesProvider) { - ADDRESSES_PROVIDER = addressesProvider; - } - - /** - * @notice Returns the list of the existing reserves in the pool. - * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. - * @return The list of reserves, pairs of symbols and addresses - */ - function getAllReservesTokens() external view returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory reservesTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - if (reserves[i] == MKR) { - reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); - continue; - } - if (reserves[i] == ETH) { - reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); - continue; - } - reservesTokens[i] = TokenData({ - symbol: IERC20Detailed(reserves[i]).symbol(), - tokenAddress: reserves[i] - }); - } - return reservesTokens; - } - - /** - * @notice Returns the list of the existing ATokens in the pool. - * @return The list of ATokens, pairs of symbols and addresses - */ - function getAllATokens() external view returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory aTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveData memory reserveData = pool.getReserveData(reserves[i]); - aTokens[i] = TokenData({ - symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), - tokenAddress: reserveData.aTokenAddress - }); - } - return aTokens; - } - - /** - * @notice Returns the configuration data of the reserve - * @dev Not returning borrow and supply caps for compatibility, nor pause flag - * @param asset The address of the underlying asset of the reserve - * @return decimals The number of decimals of the reserve - * @return ltv The ltv of the reserve - * @return liquidationThreshold The liquidationThreshold of the reserve - * @return liquidationBonus The liquidationBonus of the reserve - * @return reserveFactor The reserveFactor of the reserve - * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise - * @return borrowingEnabled True if borrowing is enabled, false otherwise - * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise - * @return isActive True if it is active, false otherwise - * @return isFrozen True if it is frozen, false otherwise - **/ - function getReserveConfigurationData(address asset) - external - view - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ) - { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor, ) = configuration - .getParams(); - - (isActive, isFrozen, borrowingEnabled, stableBorrowRateEnabled, ) = configuration.getFlags(); - - usageAsCollateralEnabled = liquidationThreshold != 0; - } - - /** - * Returns the efficiency mode category of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The eMode id of the reserve - */ - function getReserveEModeCategory(address asset) external view returns (uint256) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - return configuration.getEModeCategory(); - } - - /** - * @notice Returns the caps parameters of the reserve - * @param asset The address of the underlying asset of the reserve - * @return borrowCap The borrow cap of the reserve - * @return supplyCap The supply cap of the reserve - **/ - function getReserveCaps(address asset) - external - view - returns (uint256 borrowCap, uint256 supplyCap) - { - (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); - } - - /** - * @notice Returns if the pool is paused - * @param asset The address of the underlying asset of the reserve - * @return isPaused True if the pool is paused, false otherwise - **/ - function getPaused(address asset) external view returns (bool isPaused) { - (, , , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); - } - - /** - * @notice Returns the siloed borrowing flag - * @param asset The address of the underlying asset of the reserve - * @return True if the asset is siloed for borrowing - **/ - function getSiloedBorrowing(address asset) external view returns (bool) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); - } - - /** - * @notice Returns the protocol fee on the liquidation bonus - * @param asset The address of the underlying asset of the reserve - * @return The protocol fee on liquidation - **/ - function getLiquidationProtocolFee(address asset) external view returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); - } - - /** - * @notice Returns the unbacked mint cap of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The unbacked mint cap of the reserve - **/ - function getUnbackedMintCap(address asset) external view returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); - } - - /** - * @notice Returns the debt ceiling of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The debt ceiling of the reserve - **/ - function getDebtCeiling(address asset) external view returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); - } - - /** - * @notice Returns the debt ceiling decimals - * @return The debt ceiling decimals - **/ - function getDebtCeilingDecimals() external pure returns (uint256) { - return ReserveConfiguration.DEBT_CEILING_DECIMALS; - } - - /** - * @notice Returns the reserve data - * @param asset The address of the underlying asset of the reserve - * @return unbacked The amount of unbacked tokens - * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted - * @return totalAToken The total supply of the aToken - * @return totalStableDebt The total stable debt of the reserve - * @return totalVariableDebt The total variable debt of the reserve - * @return liquidityRate The liquidity rate of the reserve - * @return variableBorrowRate The variable borrow rate of the reserve - * @return stableBorrowRate The stable borrow rate of the reserve - * @return averageStableBorrowRate The average stable borrow rate of the reserve - * @return liquidityIndex The liquidity index of the reserve - * @return variableBorrowIndex The variable borrow index of the reserve - * @return lastUpdateTimestamp The timestamp of the last update of the reserve - **/ - function getReserveData(address asset) - external - view - override - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ) - { - DataTypes.ReserveData memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - return ( - reserve.unbacked, - reserve.accruedToTreasury, - IERC20Detailed(reserve.aTokenAddress).totalSupply(), - IERC20Detailed(reserve.stableDebtTokenAddress).totalSupply(), - IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), - reserve.currentLiquidityRate, - reserve.currentVariableBorrowRate, - reserve.currentStableBorrowRate, - IStableDebtToken(reserve.stableDebtTokenAddress).getAverageStableRate(), - reserve.liquidityIndex, - reserve.variableBorrowIndex, - reserve.lastUpdateTimestamp - ); - } - - /** - * @notice Returns the total supply of aTokens for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total supply of the aToken - **/ - function getATokenTotalSupply(address asset) external view override returns (uint256) { - DataTypes.ReserveData memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.aTokenAddress).totalSupply(); - } - - /** - * @notice Returns the total debt for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total debt for asset - **/ - function getTotalDebt(address asset) external view override returns (uint256) { - DataTypes.ReserveData memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return - IERC20Detailed(reserve.stableDebtTokenAddress).totalSupply() + - IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); - } - - /** - * @notice Returns the user data in a reserve - * @param asset The address of the underlying asset of the reserve - * @param user The address of the user - * @return currentATokenBalance The current AToken balance of the user - * @return currentStableDebt The current stable debt of the user - * @return currentVariableDebt The current variable debt of the user - * @return principalStableDebt The principal stable debt of the user - * @return scaledVariableDebt The scaled variable debt of the user - * @return stableBorrowRate The stable borrow rate of the user - * @return liquidityRate The liquidity rate of the reserve - * @return stableRateLastUpdated The timestamp of the last update of the user stable rate - * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false - * otherwise - **/ - function getUserReserveData(address asset, address user) - external - view - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ) - { - DataTypes.ReserveData memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) - .getUserConfiguration(user); - - currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); - currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); - currentStableDebt = IERC20Detailed(reserve.stableDebtTokenAddress).balanceOf(user); - principalStableDebt = IStableDebtToken(reserve.stableDebtTokenAddress).principalBalanceOf(user); - scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); - liquidityRate = reserve.currentLiquidityRate; - stableBorrowRate = IStableDebtToken(reserve.stableDebtTokenAddress).getUserStableRate(user); - stableRateLastUpdated = IStableDebtToken(reserve.stableDebtTokenAddress).getUserLastUpdated( - user - ); - usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); - } - - /** - * @notice Returns the token addresses of the reserve - * @param asset The address of the underlying asset of the reserve - * @return aTokenAddress The AToken address of the reserve - * @return stableDebtTokenAddress The StableDebtToken address of the reserve - * @return variableDebtTokenAddress The VariableDebtToken address of the reserve - */ - function getReserveTokensAddresses(address asset) - external - view - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ) - { - DataTypes.ReserveData memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - return ( - reserve.aTokenAddress, - reserve.stableDebtTokenAddress, - reserve.variableDebtTokenAddress - ); - } - - /** - * @notice Returns the address of the Interest Rate strategy - * @param asset The address of the underlying asset of the reserve - * @return irStrategyAddress The address of the Interest Rate strategy - */ - function getInterestRateStrategyAddress(address asset) - external - view - returns (address irStrategyAddress) - { - DataTypes.ReserveData memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - return (reserve.interestRateStrategyAddress); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/L2Encoder.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/L2Encoder.sol deleted file mode 100644 index 0f73b11f..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/misc/L2Encoder.sol +++ /dev/null @@ -1,355 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {SafeCast} from '../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IPool} from '../interfaces/IPool.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title L2Encoder - * @author Aave - * @notice Helper contract to encode calldata, used to optimize calldata size in L2Pool for transaction cost reduction - * only indented to help generate calldata for uses/frontends. - */ -contract L2Encoder { - using SafeCast for uint256; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The address of the Pool contract - */ - constructor(IPool pool) { - POOL = pool; - } - - /** - * @notice Encodes supply parameters from standard input to compact representation of 1 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param referralCode referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @return compact representation of supply parameters - */ - function encodeSupplyParams( - address asset, - uint256 amount, - uint16 referralCode - ) external view returns (bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount.toUint128(); - bytes32 res; - - assembly { - res := add(assetId, add(shl(16, shortenedAmount), shl(144, referralCode))) - } - return res; - } - - /** - * @notice Encodes supplyWithPermit parameters from standard input to compact representation of 3 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param referralCode referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return compact representation of supplyWithPermit parameters - * @return The R parameter of ERC712 permit sig - * @return The S parameter of ERC712 permit sig - */ - function encodeSupplyWithPermitParams( - address asset, - uint256 amount, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) - external - view - returns ( - bytes32, - bytes32, - bytes32 - ) - { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount.toUint128(); - uint32 shortenedDeadline = deadline.toUint32(); - - bytes32 res; - assembly { - res := add( - assetId, - add( - shl(16, shortenedAmount), - add(shl(144, referralCode), add(shl(160, shortenedDeadline), shl(192, permitV))) - ) - ) - } - - return (res, permitR, permitS); - } - - /** - * @notice Encodes withdraw parameters from standard input to compact representation of 1 bytes32 - * @dev Without a to parameter as the compact calls to L2Pool will use msg.sender as to - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * @return compact representation of withdraw parameters - */ - function encodeWithdrawParams(address asset, uint256 amount) external view returns (bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); - - bytes32 res; - assembly { - res := add(assetId, shl(16, shortenedAmount)) - } - return res; - } - - /** - * @notice Encodes borrow parameters from standard input to compact representation of 1 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @return compact representation of withdraw parameters - */ - function encodeBorrowParams( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode - ) external view returns (bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount.toUint128(); - uint8 shortenedInterestRateMode = interestRateMode.toUint8(); - bytes32 res; - assembly { - res := add( - assetId, - add( - shl(16, shortenedAmount), - add(shl(144, shortenedInterestRateMode), shl(152, referralCode)) - ) - ) - } - return res; - } - - /** - * @notice Encodes repay parameters from standard input to compact representation of 1 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `interestRateMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @return compact representation of repay parameters - */ - function encodeRepayParams( - address asset, - uint256 amount, - uint256 interestRateMode - ) public view returns (bytes32) { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); - uint8 shortenedInterestRateMode = interestRateMode.toUint8(); - - bytes32 res; - assembly { - res := add(assetId, add(shl(16, shortenedAmount), shl(144, shortenedInterestRateMode))) - } - return res; - } - - /** - * @notice Encodes repayWithPermit parameters from standard input to compact representation of 3 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return compact representation of repayWithPermit parameters - * @return The R parameter of ERC712 permit sig - * @return The S parameter of ERC712 permit sig - */ - function encodeRepayWithPermitParams( - address asset, - uint256 amount, - uint256 interestRateMode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) - external - view - returns ( - bytes32, - bytes32, - bytes32 - ) - { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); - uint8 shortenedInterestRateMode = interestRateMode.toUint8(); - uint32 shortenedDeadline = deadline.toUint32(); - - bytes32 res; - assembly { - res := add( - assetId, - add( - shl(16, shortenedAmount), - add( - shl(144, shortenedInterestRateMode), - add(shl(152, shortenedDeadline), shl(184, permitV)) - ) - ) - ) - } - return (res, permitR, permitS); - } - - /** - * @notice Encodes repay with aToken parameters from standard input to compact representation of 1 bytes32 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @return compact representation of repay with aToken parameters - */ - function encodeRepayWithATokensParams( - address asset, - uint256 amount, - uint256 interestRateMode - ) external view returns (bytes32) { - return encodeRepayParams(asset, amount, interestRateMode); - } - - /** - * @notice Encodes swap borrow rate mode parameters from standard input to compact representation of 1 bytes32 - * @param asset The address of the underlying asset borrowed - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - * @return compact representation of swap borrow rate mode parameters - */ - function encodeSwapBorrowRateMode(address asset, uint256 interestRateMode) - external - view - returns (bytes32) - { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - uint16 assetId = data.id; - uint8 shortenedInterestRateMode = interestRateMode.toUint8(); - bytes32 res; - assembly { - res := add(assetId, shl(16, shortenedInterestRateMode)) - } - return res; - } - - /** - * @notice Encodes rebalance stable borrow rate parameters from standard input to compact representation of 1 bytes32 - * @param asset The address of the underlying asset borrowed - * @param user The address of the user to be rebalanced - * @return compact representation of rebalance stable borrow rate parameters - */ - function encodeRebalanceStableBorrowRate(address asset, address user) - external - view - returns (bytes32) - { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - uint16 assetId = data.id; - - bytes32 res; - assembly { - res := add(assetId, shl(16, user)) - } - return res; - } - - /** - * @notice Encodes set user use reserve as collateral parameters from standard input to compact representation of 1 bytes32 - * @param asset The address of the underlying asset borrowed - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - * @return compact representation of set user use reserve as collateral parameters - */ - function encodeSetUserUseReserveAsCollateral(address asset, bool useAsCollateral) - external - view - returns (bytes32) - { - DataTypes.ReserveData memory data = POOL.getReserveData(asset); - uint16 assetId = data.id; - bytes32 res; - assembly { - res := add(assetId, shl(16, useAsCollateral)) - } - return res; - } - - /** - * @notice Encodes liquidation call parameters from standard input to compact representation of 2 bytes32 - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - * @return First half ot compact representation of liquidation call parameters - * @return Second half ot compact representation of liquidation call parameters - */ - function encodeLiquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external view returns (bytes32, bytes32) { - DataTypes.ReserveData memory collateralData = POOL.getReserveData(collateralAsset); - uint16 collateralAssetId = collateralData.id; - - DataTypes.ReserveData memory debtData = POOL.getReserveData(debtAsset); - uint16 debtAssetId = debtData.id; - - uint128 shortenedDebtToCover = debtToCover == type(uint256).max - ? type(uint128).max - : debtToCover.toUint128(); - - bytes32 res1; - bytes32 res2; - - assembly { - res1 := add(add(collateralAssetId, shl(16, debtAssetId)), shl(32, user)) - res2 := add(shortenedDebtToCover, shl(128, receiveAToken)) - } - return (res1, res2); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol deleted file mode 100644 index 7202f1a1..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol +++ /dev/null @@ -1,78 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {FlashLoanReceiverBase} from '../../flashloan/base/FlashLoanReceiverBase.sol'; -import {MintableERC20} from '../tokens/MintableERC20.sol'; - -contract MockFlashLoanReceiver is FlashLoanReceiverBase { - using GPv2SafeERC20 for IERC20; - - event ExecutedWithFail(address[] _assets, uint256[] _amounts, uint256[] _premiums); - event ExecutedWithSuccess(address[] _assets, uint256[] _amounts, uint256[] _premiums); - - bool internal _failExecution; - uint256 internal _amountToApprove; - bool internal _simulateEOA; - - constructor(IPoolAddressesProvider provider) FlashLoanReceiverBase(provider) {} - - function setFailExecutionTransfer(bool fail) public { - _failExecution = fail; - } - - function setAmountToApprove(uint256 amountToApprove) public { - _amountToApprove = amountToApprove; - } - - function setSimulateEOA(bool flag) public { - _simulateEOA = flag; - } - - function getAmountToApprove() public view returns (uint256) { - return _amountToApprove; - } - - function simulateEOA() public view returns (bool) { - return _simulateEOA; - } - - function executeOperation( - address[] memory assets, - uint256[] memory amounts, - uint256[] memory premiums, - address, // initiator - bytes memory // params - ) public override returns (bool) { - if (_failExecution) { - emit ExecutedWithFail(assets, amounts, premiums); - return !_simulateEOA; - } - - for (uint256 i = 0; i < assets.length; i++) { - //mint to this contract the specific amount - MintableERC20 token = MintableERC20(assets[i]); - - //check the contract has the specified balance - require( - amounts[i] <= IERC20(assets[i]).balanceOf(address(this)), - 'Invalid balance for the contract' - ); - - uint256 amountToReturn = (_amountToApprove != 0) - ? _amountToApprove - : amounts[i] + premiums[i]; - //execution does not fail - mint tokens and return them to the _destination - - token.mint(premiums[i]); - - IERC20(assets[i]).approve(address(POOL), amountToReturn); - } - - emit ExecutedWithSuccess(assets, amounts, premiums); - - return true; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol deleted file mode 100644 index a20feae4..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol +++ /dev/null @@ -1,87 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; - -contract MockIncentivesController is IAaveIncentivesController { - function getAssetData(address) - external - pure - override - returns ( - uint256, - uint256, - uint256 - ) - { - return (0, 0, 0); - } - - function assets(address) - external - pure - override - returns ( - uint128, - uint128, - uint256 - ) - { - return (0, 0, 0); - } - - function setClaimer(address, address) external override {} - - function getClaimer(address) external pure override returns (address) { - return address(1); - } - - function configureAssets(address[] calldata, uint256[] calldata) external override {} - - function handleAction( - address, - uint256, - uint256 - ) external override {} - - function getRewardsBalance(address[] calldata, address) external pure override returns (uint256) { - return 0; - } - - function claimRewards( - address[] calldata, - uint256, - address - ) external pure override returns (uint256) { - return 0; - } - - function claimRewardsOnBehalf( - address[] calldata, - uint256, - address, - address - ) external pure override returns (uint256) { - return 0; - } - - function getUserUnclaimedRewards(address) external pure override returns (uint256) { - return 0; - } - - function getUserAssetData(address, address) external pure override returns (uint256) { - return 0; - } - - function REWARD_TOKEN() external pure override returns (address) { - return address(0); - } - - function PRECISION() external pure override returns (uint8) { - return 0; - } - - function DISTRIBUTION_END() external pure override returns (uint256) { - return 0; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol deleted file mode 100644 index 08ac0a22..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {L2Pool} from '../../protocol/pool/L2Pool.sol'; - -contract MockL2Pool is L2Pool { - function getRevision() internal pure override returns (uint256) { - return 0x3; - } - - constructor(IPoolAddressesProvider provider) L2Pool(provider) {} -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockPool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockPool.sol deleted file mode 100644 index 258b9631..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockPool.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; - -contract MockPool { - // Reserved storage space to avoid layout collisions. - uint256[100] private ______gap; - - address internal _addressesProvider; - address[] internal _reserveList; - - function initialize(address provider) external { - _addressesProvider = provider; - } - - function addReserveToReservesList(address reserve) external { - _reserveList.push(reserve); - } - - function getReservesList() external view returns (address[] memory) { - address[] memory reservesList = new address[](_reserveList.length); - for (uint256 i; i < _reserveList.length; i++) { - reservesList[i] = _reserveList[i]; - } - return reservesList; - } -} - -import {Pool} from '../../protocol/pool/Pool.sol'; - -contract MockPoolInherited is Pool { - uint16 internal _maxNumberOfReserves = 128; - - function getRevision() internal pure override returns (uint256) { - return 0x3; - } - - constructor(IPoolAddressesProvider provider) Pool(provider) {} - - function setMaxNumberOfReserves(uint16 newMaxNumberOfReserves) public { - _maxNumberOfReserves = newMaxNumberOfReserves; - } - - function MAX_NUMBER_RESERVES() public view override returns (uint16) { - return _maxNumberOfReserves; - } - - function dropReserve(address asset) external override { - _reservesList[_reserves[asset].id] = address(0); - delete _reserves[asset]; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol deleted file mode 100644 index 4774da4b..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol +++ /dev/null @@ -1,174 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {ReserveConfiguration} from '../../protocol/libraries/configuration/ReserveConfiguration.sol'; -import {DataTypes} from '../../protocol/libraries/types/DataTypes.sol'; - -contract MockReserveConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - DataTypes.ReserveConfigurationMap public configuration; - - function setLtv(uint256 ltv) external { - DataTypes.ReserveConfigurationMap memory config = configuration; - config.setLtv(ltv); - configuration = config; - } - - function getLtv() external view returns (uint256) { - return configuration.getLtv(); - } - - function setLiquidationBonus(uint256 bonus) external { - DataTypes.ReserveConfigurationMap memory config = configuration; - config.setLiquidationBonus(bonus); - configuration = config; - } - - function getLiquidationBonus() external view returns (uint256) { - return configuration.getLiquidationBonus(); - } - - function setLiquidationThreshold(uint256 threshold) external { - DataTypes.ReserveConfigurationMap memory config = configuration; - config.setLiquidationThreshold(threshold); - configuration = config; - } - - function getLiquidationThreshold() external view returns (uint256) { - return configuration.getLiquidationThreshold(); - } - - function setDecimals(uint256 decimals) external { - DataTypes.ReserveConfigurationMap memory config = configuration; - config.setDecimals(decimals); - configuration = config; - } - - function getDecimals() external view returns (uint256) { - return configuration.getDecimals(); - } - - function setFrozen(bool frozen) external { - DataTypes.ReserveConfigurationMap memory config = configuration; - config.setFrozen(frozen); - configuration = config; - } - - function getFrozen() external view returns (bool) { - return configuration.getFrozen(); - } - - function setBorrowingEnabled(bool enabled) external { - DataTypes.ReserveConfigurationMap memory config = configuration; - config.setBorrowingEnabled(enabled); - configuration = config; - } - - function getBorrowingEnabled() external view returns (bool) { - return configuration.getBorrowingEnabled(); - } - - function setStableRateBorrowingEnabled(bool enabled) external { - DataTypes.ReserveConfigurationMap memory config = configuration; - config.setStableRateBorrowingEnabled(enabled); - configuration = config; - } - - function getStableRateBorrowingEnabled() external view returns (bool) { - return configuration.getStableRateBorrowingEnabled(); - } - - function setReserveFactor(uint256 reserveFactor) external { - DataTypes.ReserveConfigurationMap memory config = configuration; - config.setReserveFactor(reserveFactor); - configuration = config; - } - - function getReserveFactor() external view returns (uint256) { - return configuration.getReserveFactor(); - } - - function setBorrowCap(uint256 borrowCap) external { - DataTypes.ReserveConfigurationMap memory config = configuration; - config.setBorrowCap(borrowCap); - configuration = config; - } - - function getBorrowCap() external view returns (uint256) { - return configuration.getBorrowCap(); - } - - function getEModeCategory() external view returns (uint256) { - return configuration.getEModeCategory(); - } - - function setEModeCategory(uint256 categoryId) external { - DataTypes.ReserveConfigurationMap memory config = configuration; - config.setEModeCategory(categoryId); - configuration = config; - } - - function setSupplyCap(uint256 supplyCap) external { - DataTypes.ReserveConfigurationMap memory config = configuration; - config.setSupplyCap(supplyCap); - configuration = config; - } - - function getSupplyCap() external view returns (uint256) { - return configuration.getSupplyCap(); - } - - function setLiquidationProtocolFee(uint256 liquidationProtocolFee) external { - DataTypes.ReserveConfigurationMap memory config = configuration; - config.setLiquidationProtocolFee(liquidationProtocolFee); - configuration = config; - } - - function getLiquidationProtocolFee() external view returns (uint256) { - return configuration.getLiquidationProtocolFee(); - } - - function setUnbackedMintCap(uint256 unbackedMintCap) external { - DataTypes.ReserveConfigurationMap memory config = configuration; - config.setUnbackedMintCap(unbackedMintCap); - configuration = config; - } - - function getUnbackedMintCap() external view returns (uint256) { - return configuration.getUnbackedMintCap(); - } - - function getFlags() - external - view - returns ( - bool, - bool, - bool, - bool, - bool - ) - { - return configuration.getFlags(); - } - - function getParams() - external - view - returns ( - uint256, - uint256, - uint256, - uint256, - uint256, - uint256 - ) - { - return configuration.getParams(); - } - - function getCaps() external view returns (uint256, uint256) { - return configuration.getCaps(); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol deleted file mode 100644 index 0fbdb633..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {ERC20} from '../../dependencies/openzeppelin/contracts/ERC20.sol'; -import {IDelegationToken} from '../../interfaces/IDelegationToken.sol'; - -/** - * @title MintableDelegationERC20 - * @dev ERC20 minting logic with delegation - */ -contract MintableDelegationERC20 is IDelegationToken, ERC20 { - address public delegatee; - - constructor( - string memory name, - string memory symbol, - uint8 decimals - ) ERC20(name, symbol) { - _setupDecimals(decimals); - } - - /** - * @dev Function to mint tokens - * @param value The amount of tokens to mint. - * @return A boolean that indicates if the operation was successful. - */ - function mint(uint256 value) public returns (bool) { - _mint(msg.sender, value); - return true; - } - - function delegate(address delegateeAddress) external override { - delegatee = delegateeAddress; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol deleted file mode 100644 index 37fa2be8..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol +++ /dev/null @@ -1,92 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {ERC20} from '../../dependencies/openzeppelin/contracts/ERC20.sol'; -import {IERC20WithPermit} from '../../interfaces/IERC20WithPermit.sol'; - -/** - * @title ERC20Mintable - * @dev ERC20 minting logic - */ -contract MintableERC20 is IERC20WithPermit, ERC20 { - bytes public constant EIP712_REVISION = bytes('1'); - bytes32 internal constant EIP712_DOMAIN = - keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); - bytes32 public constant PERMIT_TYPEHASH = - keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); - - // Map of address nonces (address => nonce) - mapping(address => uint256) internal _nonces; - - bytes32 public DOMAIN_SEPARATOR; - - constructor( - string memory name, - string memory symbol, - uint8 decimals - ) ERC20(name, symbol) { - uint256 chainId = block.chainid; - - DOMAIN_SEPARATOR = keccak256( - abi.encode( - EIP712_DOMAIN, - keccak256(bytes(name)), - keccak256(EIP712_REVISION), - chainId, - address(this) - ) - ); - _setupDecimals(decimals); - } - - /// @inheritdoc IERC20WithPermit - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external override { - require(owner != address(0), 'INVALID_OWNER'); - //solium-disable-next-line - require(block.timestamp <= deadline, 'INVALID_EXPIRATION'); - uint256 currentValidNonce = _nonces[owner]; - bytes32 digest = keccak256( - abi.encodePacked( - '\x19\x01', - DOMAIN_SEPARATOR, - keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentValidNonce, deadline)) - ) - ); - require(owner == ecrecover(digest, v, r, s), 'INVALID_SIGNATURE'); - _nonces[owner] = currentValidNonce + 1; - _approve(owner, spender, value); - } - - /** - * @dev Function to mint tokens - * @param value The amount of tokens to mint. - * @return A boolean that indicates if the operation was successful. - */ - function mint(uint256 value) public returns (bool) { - _mint(_msgSender(), value); - return true; - } - - /** - * @dev Function to mint tokens to address - * @param account The account to mint tokens. - * @param value The amount of tokens to mint. - * @return A boolean that indicates if the operation was successful. - */ - function mint(address account, uint256 value) public returns (bool) { - _mint(account, value); - return true; - } - - function nonces(address owner) public view virtual returns (uint256) { - return _nonces[owner]; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol deleted file mode 100644 index 7a105fbc..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {AToken} from '../../protocol/tokenization/AToken.sol'; -import {IPool} from '../../interfaces/IPool.sol'; -import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; - -contract MockAToken is AToken { - constructor(IPool pool) AToken(pool) {} - - function getRevision() internal pure override returns (uint256) { - return 0x2; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol deleted file mode 100644 index e70eab11..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {VersionedInitializable} from '../../protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; - -contract MockInitializableImple is VersionedInitializable { - uint256 public value; - string public text; - uint256[] public values; - - uint256 public constant REVISION = 1; - - /** - * @dev returns the revision number of the contract - * Needs to be defined in the inherited class as a constant. - **/ - function getRevision() internal pure override returns (uint256) { - return REVISION; - } - - function initialize( - uint256 val, - string memory txt, - uint256[] memory vals - ) external initializer { - value = val; - text = txt; - values = vals; - } - - function setValue(uint256 newValue) public { - value = newValue; - } - - function setValueViaProxy(uint256 newValue) public { - value = newValue; - } -} - -contract MockInitializableImpleV2 is VersionedInitializable { - uint256 public value; - string public text; - uint256[] public values; - - uint256 public constant REVISION = 2; - - /** - * @dev returns the revision number of the contract - * Needs to be defined in the inherited class as a constant. - **/ - function getRevision() internal pure override returns (uint256) { - return REVISION; - } - - function initialize( - uint256 val, - string memory txt, - uint256[] memory vals - ) public initializer { - value = val; - text = txt; - values = vals; - } - - function setValue(uint256 newValue) public { - value = newValue; - } - - function setValueViaProxy(uint256 newValue) public { - value = newValue; - } -} - -contract MockInitializableFromConstructorImple is VersionedInitializable { - uint256 public value; - - uint256 public constant REVISION = 2; - - /** - * @dev returns the revision number of the contract - * Needs to be defined in the inherited class as a constant. - **/ - function getRevision() internal pure override returns (uint256) { - return REVISION; - } - - constructor(uint256 val) { - initialize(val); - } - - function initialize(uint256 val) public initializer { - value = val; - } -} - -contract MockReentrantInitializableImple is VersionedInitializable { - uint256 public value; - - uint256 public constant REVISION = 2; - - /** - * @dev returns the revision number of the contract - * Needs to be defined in the inherited class as a constant. - **/ - function getRevision() internal pure override returns (uint256) { - return REVISION; - } - - function initialize(uint256 val) public initializer { - value = val; - if (value < 2) { - initialize(value + 1); - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol deleted file mode 100644 index 3c93bfe3..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {StableDebtToken} from '../../protocol/tokenization/StableDebtToken.sol'; -import {IPool} from '../../interfaces/IPool.sol'; - -contract MockStableDebtToken is StableDebtToken { - constructor(IPool pool) StableDebtToken(pool) {} - - function getRevision() internal pure override returns (uint256) { - return 0x3; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol deleted file mode 100644 index 3c302028..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {VariableDebtToken} from '../../protocol/tokenization/VariableDebtToken.sol'; -import {IPool} from '../../interfaces/IPool.sol'; - -contract MockVariableDebtToken is VariableDebtToken { - constructor(IPool pool) VariableDebtToken(pool) {} - - function getRevision() internal pure override returns (uint256) { - return 0x3; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol deleted file mode 100644 index 7b03541d..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol +++ /dev/null @@ -1,134 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {AccessControl} from '../../dependencies/openzeppelin/contracts/AccessControl.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {IACLManager} from '../../interfaces/IACLManager.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; - -/** - * @title ACLManager - * @author Aave - * @notice Access Control List Manager. Main registry of system roles and permissions. - */ -contract ACLManager is AccessControl, IACLManager { - bytes32 public constant override POOL_ADMIN_ROLE = keccak256('POOL_ADMIN'); - bytes32 public constant override EMERGENCY_ADMIN_ROLE = keccak256('EMERGENCY_ADMIN'); - bytes32 public constant override RISK_ADMIN_ROLE = keccak256('RISK_ADMIN'); - bytes32 public constant override FLASH_BORROWER_ROLE = keccak256('FLASH_BORROWER'); - bytes32 public constant override BRIDGE_ROLE = keccak256('BRIDGE'); - bytes32 public constant override ASSET_LISTING_ADMIN_ROLE = keccak256('ASSET_LISTING_ADMIN'); - - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @dev Constructor - * @dev The ACL admin should be initialized at the addressesProvider beforehand - * @param provider The address of the PoolAddressesProvider - */ - constructor(IPoolAddressesProvider provider) { - ADDRESSES_PROVIDER = provider; - address aclAdmin = provider.getACLAdmin(); - require(aclAdmin != address(0), Errors.ACL_ADMIN_CANNOT_BE_ZERO); - _setupRole(DEFAULT_ADMIN_ROLE, aclAdmin); - } - - /// @inheritdoc IACLManager - function setRoleAdmin(bytes32 role, bytes32 adminRole) - external - override - onlyRole(DEFAULT_ADMIN_ROLE) - { - _setRoleAdmin(role, adminRole); - } - - /// @inheritdoc IACLManager - function addPoolAdmin(address admin) external override { - grantRole(POOL_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removePoolAdmin(address admin) external override { - revokeRole(POOL_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isPoolAdmin(address admin) external view override returns (bool) { - return hasRole(POOL_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function addEmergencyAdmin(address admin) external override { - grantRole(EMERGENCY_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removeEmergencyAdmin(address admin) external override { - revokeRole(EMERGENCY_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isEmergencyAdmin(address admin) external view override returns (bool) { - return hasRole(EMERGENCY_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function addRiskAdmin(address admin) external override { - grantRole(RISK_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removeRiskAdmin(address admin) external override { - revokeRole(RISK_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isRiskAdmin(address admin) external view override returns (bool) { - return hasRole(RISK_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function addFlashBorrower(address borrower) external override { - grantRole(FLASH_BORROWER_ROLE, borrower); - } - - /// @inheritdoc IACLManager - function removeFlashBorrower(address borrower) external override { - revokeRole(FLASH_BORROWER_ROLE, borrower); - } - - /// @inheritdoc IACLManager - function isFlashBorrower(address borrower) external view override returns (bool) { - return hasRole(FLASH_BORROWER_ROLE, borrower); - } - - /// @inheritdoc IACLManager - function addBridge(address bridge) external override { - grantRole(BRIDGE_ROLE, bridge); - } - - /// @inheritdoc IACLManager - function removeBridge(address bridge) external override { - revokeRole(BRIDGE_ROLE, bridge); - } - - /// @inheritdoc IACLManager - function isBridge(address bridge) external view override returns (bool) { - return hasRole(BRIDGE_ROLE, bridge); - } - - /// @inheritdoc IACLManager - function addAssetListingAdmin(address admin) external override { - grantRole(ASSET_LISTING_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removeAssetListingAdmin(address admin) external override { - revokeRole(ASSET_LISTING_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isAssetListingAdmin(address admin) external view override returns (bool) { - return hasRole(ASSET_LISTING_ADMIN_ROLE, admin); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol deleted file mode 100644 index 073e92f3..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol +++ /dev/null @@ -1,210 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {Ownable} from '../../dependencies/openzeppelin/contracts/Ownable.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {InitializableImmutableAdminUpgradeabilityProxy} from '../libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; - -/** - * @title PoolAddressesProvider - * @author Aave - * @notice Main registry of addresses part of or connected to the protocol, including permissioned roles - * @dev Acts as factory of proxies and admin of those, so with right to change its implementations - * @dev Owned by the Aave Governance - **/ -contract PoolAddressesProvider is Ownable, IPoolAddressesProvider { - // Identifier of the Aave Market - string private _marketId; - - // Map of registered addresses (identifier => registeredAddress) - mapping(bytes32 => address) private _addresses; - - // Main identifiers - bytes32 private constant POOL = 'POOL'; - bytes32 private constant POOL_CONFIGURATOR = 'POOL_CONFIGURATOR'; - bytes32 private constant PRICE_ORACLE = 'PRICE_ORACLE'; - bytes32 private constant ACL_MANAGER = 'ACL_MANAGER'; - bytes32 private constant ACL_ADMIN = 'ACL_ADMIN'; - bytes32 private constant PRICE_ORACLE_SENTINEL = 'PRICE_ORACLE_SENTINEL'; - bytes32 private constant DATA_PROVIDER = 'DATA_PROVIDER'; - - /** - * @dev Constructor. - * @param marketId The identifier of the market. - * @param owner The owner address of this contract. - */ - constructor(string memory marketId, address owner) { - _setMarketId(marketId); - transferOwnership(owner); - } - - /// @inheritdoc IPoolAddressesProvider - function getMarketId() external view override returns (string memory) { - return _marketId; - } - - /// @inheritdoc IPoolAddressesProvider - function setMarketId(string memory newMarketId) external override onlyOwner { - _setMarketId(newMarketId); - } - - /// @inheritdoc IPoolAddressesProvider - function getAddress(bytes32 id) public view override returns (address) { - return _addresses[id]; - } - - /// @inheritdoc IPoolAddressesProvider - function setAddress(bytes32 id, address newAddress) external override onlyOwner { - address oldAddress = _addresses[id]; - _addresses[id] = newAddress; - emit AddressSet(id, oldAddress, newAddress); - } - - /// @inheritdoc IPoolAddressesProvider - function setAddressAsProxy(bytes32 id, address newImplementationAddress) - external - override - onlyOwner - { - address proxyAddress = _addresses[id]; - address oldImplementationAddress = _getProxyImplementation(id); - _updateImpl(id, newImplementationAddress); - emit AddressSetAsProxy(id, proxyAddress, oldImplementationAddress, newImplementationAddress); - } - - /// @inheritdoc IPoolAddressesProvider - function getPool() external view override returns (address) { - return getAddress(POOL); - } - - /// @inheritdoc IPoolAddressesProvider - function setPoolImpl(address newPoolImpl) external override onlyOwner { - address oldPoolImpl = _getProxyImplementation(POOL); - _updateImpl(POOL, newPoolImpl); - emit PoolUpdated(oldPoolImpl, newPoolImpl); - } - - /// @inheritdoc IPoolAddressesProvider - function getPoolConfigurator() external view override returns (address) { - return getAddress(POOL_CONFIGURATOR); - } - - /// @inheritdoc IPoolAddressesProvider - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external override onlyOwner { - address oldPoolConfiguratorImpl = _getProxyImplementation(POOL_CONFIGURATOR); - _updateImpl(POOL_CONFIGURATOR, newPoolConfiguratorImpl); - emit PoolConfiguratorUpdated(oldPoolConfiguratorImpl, newPoolConfiguratorImpl); - } - - /// @inheritdoc IPoolAddressesProvider - function getPriceOracle() external view override returns (address) { - return getAddress(PRICE_ORACLE); - } - - /// @inheritdoc IPoolAddressesProvider - function setPriceOracle(address newPriceOracle) external override onlyOwner { - address oldPriceOracle = _addresses[PRICE_ORACLE]; - _addresses[PRICE_ORACLE] = newPriceOracle; - emit PriceOracleUpdated(oldPriceOracle, newPriceOracle); - } - - /// @inheritdoc IPoolAddressesProvider - function getACLManager() external view override returns (address) { - return getAddress(ACL_MANAGER); - } - - /// @inheritdoc IPoolAddressesProvider - function setACLManager(address newAclManager) external override onlyOwner { - address oldAclManager = _addresses[ACL_MANAGER]; - _addresses[ACL_MANAGER] = newAclManager; - emit ACLManagerUpdated(oldAclManager, newAclManager); - } - - /// @inheritdoc IPoolAddressesProvider - function getACLAdmin() external view override returns (address) { - return getAddress(ACL_ADMIN); - } - - /// @inheritdoc IPoolAddressesProvider - function setACLAdmin(address newAclAdmin) external override onlyOwner { - address oldAclAdmin = _addresses[ACL_ADMIN]; - _addresses[ACL_ADMIN] = newAclAdmin; - emit ACLAdminUpdated(oldAclAdmin, newAclAdmin); - } - - /// @inheritdoc IPoolAddressesProvider - function getPriceOracleSentinel() external view override returns (address) { - return getAddress(PRICE_ORACLE_SENTINEL); - } - - /// @inheritdoc IPoolAddressesProvider - function setPriceOracleSentinel(address newPriceOracleSentinel) external override onlyOwner { - address oldPriceOracleSentinel = _addresses[PRICE_ORACLE_SENTINEL]; - _addresses[PRICE_ORACLE_SENTINEL] = newPriceOracleSentinel; - emit PriceOracleSentinelUpdated(oldPriceOracleSentinel, newPriceOracleSentinel); - } - - /// @inheritdoc IPoolAddressesProvider - function getPoolDataProvider() external view override returns (address) { - return getAddress(DATA_PROVIDER); - } - - /// @inheritdoc IPoolAddressesProvider - function setPoolDataProvider(address newDataProvider) external override onlyOwner { - address oldDataProvider = _addresses[DATA_PROVIDER]; - _addresses[DATA_PROVIDER] = newDataProvider; - emit PoolDataProviderUpdated(oldDataProvider, newDataProvider); - } - - /** - * @notice Internal function to update the implementation of a specific proxied component of the protocol. - * @dev If there is no proxy registered with the given identifier, it creates the proxy setting `newAddress` - * as implementation and calls the initialize() function on the proxy - * @dev If there is already a proxy registered, it just updates the implementation to `newAddress` and - * calls the initialize() function via upgradeToAndCall() in the proxy - * @param id The id of the proxy to be updated - * @param newAddress The address of the new implementation - **/ - function _updateImpl(bytes32 id, address newAddress) internal { - address proxyAddress = _addresses[id]; - InitializableImmutableAdminUpgradeabilityProxy proxy; - bytes memory params = abi.encodeWithSignature('initialize(address)', address(this)); - - if (proxyAddress == address(0)) { - proxy = new InitializableImmutableAdminUpgradeabilityProxy(address(this)); - _addresses[id] = proxyAddress = address(proxy); - proxy.initialize(newAddress, params); - emit ProxyCreated(id, proxyAddress, newAddress); - } else { - proxy = InitializableImmutableAdminUpgradeabilityProxy(payable(proxyAddress)); - proxy.upgradeToAndCall(newAddress, params); - } - } - - /** - * @notice Updates the identifier of the Aave market. - * @param newMarketId The new id of the market - **/ - function _setMarketId(string memory newMarketId) internal { - string memory oldMarketId = _marketId; - _marketId = newMarketId; - emit MarketIdSet(oldMarketId, newMarketId); - } - - /** - * @notice Returns the the implementation contract of the proxy contract by its identifier. - * @dev It returns ZERO if there is no registered address with the given id - * @dev It reverts if the registered address with the given id is not `InitializableImmutableAdminUpgradeabilityProxy` - * @param id The id - * @return The address of the implementation contract - */ - function _getProxyImplementation(bytes32 id) internal returns (address) { - address proxyAddress = _addresses[id]; - if (proxyAddress == address(0)) { - return address(0); - } else { - address payable payableProxyAddress = payable(proxyAddress); - return InitializableImmutableAdminUpgradeabilityProxy(payableProxyAddress).implementation(); - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol deleted file mode 100644 index f5cb3d37..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol +++ /dev/null @@ -1,105 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {Ownable} from '../../dependencies/openzeppelin/contracts/Ownable.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; -import {IPoolAddressesProviderRegistry} from '../../interfaces/IPoolAddressesProviderRegistry.sol'; - -/** - * @title PoolAddressesProviderRegistry - * @author Aave - * @notice Main registry of PoolAddressesProvider of Aave markets. - * @dev Used for indexing purposes of Aave protocol's markets. The id assigned to a PoolAddressesProvider refers to the - * market it is connected with, for example with `1` for the Aave main market and `2` for the next created. - **/ -contract PoolAddressesProviderRegistry is Ownable, IPoolAddressesProviderRegistry { - // Map of address provider ids (addressesProvider => id) - mapping(address => uint256) private _addressesProviderToId; - // Map of id to address provider (id => addressesProvider) - mapping(uint256 => address) private _idToAddressesProvider; - // List of addresses providers - address[] private _addressesProvidersList; - // Map of address provider list indexes (addressesProvider => indexInList) - mapping(address => uint256) private _addressesProvidersIndexes; - - /** - * @dev Constructor. - * @param owner The owner address of this contract. - */ - constructor(address owner) { - transferOwnership(owner); - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function getAddressesProvidersList() external view override returns (address[] memory) { - return _addressesProvidersList; - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function registerAddressesProvider(address provider, uint256 id) external override onlyOwner { - require(id != 0, Errors.INVALID_ADDRESSES_PROVIDER_ID); - require(_idToAddressesProvider[id] == address(0), Errors.INVALID_ADDRESSES_PROVIDER_ID); - require(_addressesProviderToId[provider] == 0, Errors.ADDRESSES_PROVIDER_ALREADY_ADDED); - - _addressesProviderToId[provider] = id; - _idToAddressesProvider[id] = provider; - - _addToAddressesProvidersList(provider); - emit AddressesProviderRegistered(provider, id); - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function unregisterAddressesProvider(address provider) external override onlyOwner { - require(_addressesProviderToId[provider] != 0, Errors.ADDRESSES_PROVIDER_NOT_REGISTERED); - uint256 oldId = _addressesProviderToId[provider]; - _idToAddressesProvider[oldId] = address(0); - _addressesProviderToId[provider] = 0; - - _removeFromAddressesProvidersList(provider); - - emit AddressesProviderUnregistered(provider, oldId); - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function getAddressesProviderIdByAddress(address addressesProvider) - external - view - override - returns (uint256) - { - return _addressesProviderToId[addressesProvider]; - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function getAddressesProviderAddressById(uint256 id) external view override returns (address) { - return _idToAddressesProvider[id]; - } - - /** - * @notice Adds the addresses provider address to the list. - * @param provider The address of the PoolAddressesProvider - */ - function _addToAddressesProvidersList(address provider) internal { - _addressesProvidersIndexes[provider] = _addressesProvidersList.length; - _addressesProvidersList.push(provider); - } - - /** - * @notice Removes the addresses provider address from the list. - * @param provider The address of the PoolAddressesProvider - */ - function _removeFromAddressesProvidersList(address provider) internal { - uint256 index = _addressesProvidersIndexes[provider]; - - _addressesProvidersIndexes[provider] = 0; - - // Swap the index of the last addresses provider in the list with the index of the provider to remove - uint256 lastIndex = _addressesProvidersList.length - 1; - if (index < lastIndex) { - address lastProvider = _addressesProvidersList[lastIndex]; - _addressesProvidersList[index] = lastProvider; - _addressesProvidersIndexes[lastProvider] = index; - } - _addressesProvidersList.pop(); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol deleted file mode 100644 index 87550c2e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,86 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {BaseUpgradeabilityProxy} from '../../../dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol'; - -/** - * @title BaseImmutableAdminUpgradeabilityProxy - * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern - * @notice This contract combines an upgradeability proxy with an authorization - * mechanism for administrative tasks. - * @dev The admin role is stored in an immutable, which helps saving transactions costs - * All external functions in this contract must be guarded by the - * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity - * feature proposal that would enable this to be done automatically. - */ -contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - address internal immutable _admin; - - /** - * @dev Constructor. - * @param admin The address of the admin - */ - constructor(address admin) { - _admin = admin; - } - - modifier ifAdmin() { - if (msg.sender == _admin) { - _; - } else { - _fallback(); - } - } - - /** - * @notice Return the admin address - * @return The address of the proxy admin. - */ - function admin() external ifAdmin returns (address) { - return _admin; - } - - /** - * @notice Return the implementation address - * @return The address of the implementation. - */ - function implementation() external ifAdmin returns (address) { - return _implementation(); - } - - /** - * @notice Upgrade the backing implementation of the proxy. - * @dev Only the admin can call this function. - * @param newImplementation The address of the new implementation. - */ - function upgradeTo(address newImplementation) external ifAdmin { - _upgradeTo(newImplementation); - } - - /** - * @notice Upgrade the backing implementation of the proxy and call a function - * on the new implementation. - * @dev This is useful to initialize the proxied contract. - * @param newImplementation The address of the new implementation. - * @param data Data to send as msg.data in the low level call. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - */ - function upgradeToAndCall(address newImplementation, bytes calldata data) - external - payable - ifAdmin - { - _upgradeTo(newImplementation); - (bool success, ) = newImplementation.delegatecall(data); - require(success); - } - - /** - * @notice Only fall back when the sender is not the admin. - */ - function _willFallback() internal virtual override { - require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); - super._willFallback(); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol deleted file mode 100644 index 655e5f9e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {InitializableUpgradeabilityProxy} from '../../../dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol'; -import {Proxy} from '../../../dependencies/openzeppelin/upgradeability/Proxy.sol'; -import {BaseImmutableAdminUpgradeabilityProxy} from './BaseImmutableAdminUpgradeabilityProxy.sol'; - -/** - * @title InitializableAdminUpgradeabilityProxy - * @author Aave - * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function - */ -contract InitializableImmutableAdminUpgradeabilityProxy is - BaseImmutableAdminUpgradeabilityProxy, - InitializableUpgradeabilityProxy -{ - /** - * @dev Constructor. - * @param admin The address of the admin - */ - constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { - // Intentionally left blank - } - - /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy - function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { - BaseImmutableAdminUpgradeabilityProxy._willFallback(); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol deleted file mode 100644 index 570c319e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - **/ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - **/ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index ed38c5c3..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,633 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant STABLE_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant EMODE_CATEGORY_MASK = 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant STABLE_BORROWING_ENABLED_START_BIT_POSITION = 59; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - /// @dev bit 63 reserved - - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - uint256 internal constant EMODE_CATEGORY_START_BIT_POSITION = 168; - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_EMODE_CATEGORY = 255; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - **/ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - **/ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - **/ - function setLiquidationThreshold(DataTypes.ReserveConfigurationMap memory self, uint256 threshold) - internal - pure - { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - **/ - function getLiquidationThreshold(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - **/ - function setLiquidationBonus(DataTypes.ReserveConfigurationMap memory self, uint256 bonus) - internal - pure - { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - **/ - function getLiquidationBonus(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - **/ - function setDecimals(DataTypes.ReserveConfigurationMap memory self, uint256 decimals) - internal - pure - { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - **/ - function getDecimals(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - **/ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - **/ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - **/ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - **/ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - **/ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - **/ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - **/ - function setBorrowableInIsolation(DataTypes.ReserveConfigurationMap memory self, bool borrowable) - internal - pure - { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - **/ - function getBorrowableInIsolation(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (bool) - { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - **/ - function setSiloedBorrowing(DataTypes.ReserveConfigurationMap memory self, bool siloed) - internal - pure - { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - **/ - function getSiloedBorrowing(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (bool) - { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - **/ - function setBorrowingEnabled(DataTypes.ReserveConfigurationMap memory self, bool enabled) - internal - pure - { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - **/ - function getBorrowingEnabled(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (bool) - { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables stable rate borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the stable rate borrowing needs to be enabled, false otherwise - **/ - function setStableRateBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & STABLE_BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << STABLE_BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the stable rate borrowing state of the reserve - * @param self The reserve configuration - * @return The stable rate borrowing state - **/ - function getStableRateBorrowingEnabled(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (bool) - { - return (self.data & ~STABLE_BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - **/ - function setReserveFactor(DataTypes.ReserveConfigurationMap memory self, uint256 reserveFactor) - internal - pure - { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - **/ - function getReserveFactor(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - **/ - function setBorrowCap(DataTypes.ReserveConfigurationMap memory self, uint256 borrowCap) - internal - pure - { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - **/ - function getBorrowCap(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - **/ - function setSupplyCap(DataTypes.ReserveConfigurationMap memory self, uint256 supplyCap) - internal - pure - { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - **/ - function getSupplyCap(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - **/ - function setDebtCeiling(DataTypes.ReserveConfigurationMap memory self, uint256 ceiling) - internal - pure - { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - **/ - function getDebtCeiling(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - **/ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - **/ - function getLiquidationProtocolFee(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - **/ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - **/ - function getUnbackedMintCap(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the eMode asset category - * @param self The reserve configuration - * @param category The asset category when the user selects the eMode - **/ - function setEModeCategory(DataTypes.ReserveConfigurationMap memory self, uint256 category) - internal - pure - { - require(category <= MAX_VALID_EMODE_CATEGORY, Errors.INVALID_EMODE_CATEGORY); - - self.data = (self.data & EMODE_CATEGORY_MASK) | (category << EMODE_CATEGORY_START_BIT_POSITION); - } - - /** - * @dev Gets the eMode asset category - * @param self The reserve configuration - * @return The eMode category for the asset - **/ - function getEModeCategory(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing stableRateBorrowing enabled - * @return The state flag representing paused - **/ - function getFlags(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns ( - bool, - bool, - bool, - bool, - bool - ) - { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~STABLE_BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - * @return The state param representing eMode category - **/ - function getParams(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns ( - uint256, - uint256, - uint256, - uint256, - uint256, - uint256 - ) - { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION, - (dataLocal & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - **/ - function getCaps(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256, uint256) - { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index cc9df478..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,251 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - **/ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - **/ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - **/ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - **/ - function isBorrowing(DataTypes.UserConfigurationMap memory self, uint256 reserveIndex) - internal - pure - returns (bool) - { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - **/ - function isUsingAsCollateral(DataTypes.UserConfigurationMap memory self, uint256 reserveIndex) - internal - pure - returns (bool) - { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - **/ - function isUsingAsCollateralOne(DataTypes.UserConfigurationMap memory self) - internal - pure - returns (bool) - { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - **/ - function isUsingAsCollateralAny(DataTypes.UserConfigurationMap memory self) - internal - pure - returns (bool) - { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - **/ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - **/ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - **/ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) - internal - view - returns ( - bool, - address, - uint256 - ) - { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask(DataTypes.UserConfigurationMap memory self, uint256 mask) - internal - pure - returns (uint256) - { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index 640e4632..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' - string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/helpers/Helpers.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/helpers/Helpers.sol deleted file mode 100644 index 180d72a4..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/helpers/Helpers.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title Helpers library - * @author Aave - */ -library Helpers { - /** - * @notice Fetches the user current stable and variable debt balances - * @param user The user address - * @param reserveCache The reserve cache data object - * @return The stable debt balance - * @return The variable debt balance - **/ - function getUserCurrentDebt(address user, DataTypes.ReserveCache memory reserveCache) - internal - view - returns (uint256, uint256) - { - return ( - IERC20(reserveCache.stableDebtTokenAddress).balanceOf(user), - IERC20(reserveCache.variableDebtTokenAddress).balanceOf(user) - ); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol deleted file mode 100644 index 0559305f..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol +++ /dev/null @@ -1,349 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IStableDebtToken} from '../../../interfaces/IStableDebtToken.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {Helpers} from '../helpers/Helpers.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {IsolationModeLogic} from './IsolationModeLogic.sol'; - -/** - * @title BorrowLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to borrowing - */ -library BorrowLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - event RebalanceStableBorrowRate(address indexed reserve, address indexed user); - event SwapBorrowRateMode( - address indexed reserve, - address indexed user, - DataTypes.InterestRateMode interestRateMode - ); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the - * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the - * isolated debt. - * @dev Emits the `Borrow()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the borrow function - */ - function executeBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteBorrowParams memory params - ) public { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ( - bool isolationModeActive, - address isolationModeCollateralAddress, - uint256 isolationModeDebtCeiling - ) = userConfig.getIsolationModeState(reservesData, reservesList); - - ValidationLogic.validateBorrow( - reservesData, - reservesList, - eModeCategories, - DataTypes.ValidateBorrowParams({ - reserveCache: reserveCache, - userConfig: userConfig, - asset: params.asset, - userAddress: params.onBehalfOf, - amount: params.amount, - interestRateMode: params.interestRateMode, - maxStableLoanPercent: params.maxStableRateBorrowSizePercent, - reservesCount: params.reservesCount, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory, - priceOracleSentinel: params.priceOracleSentinel, - isolationModeActive: isolationModeActive, - isolationModeCollateralAddress: isolationModeCollateralAddress, - isolationModeDebtCeiling: isolationModeDebtCeiling - }) - ); - - uint256 currentStableRate = 0; - bool isFirstBorrowing = false; - - if (params.interestRateMode == DataTypes.InterestRateMode.STABLE) { - currentStableRate = reserve.currentStableBorrowRate; - - ( - isFirstBorrowing, - reserveCache.nextTotalStableDebt, - reserveCache.nextAvgStableBorrowRate - ) = IStableDebtToken(reserveCache.stableDebtTokenAddress).mint( - params.user, - params.onBehalfOf, - params.amount, - currentStableRate - ); - } else { - (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); - } - - if (isFirstBorrowing) { - userConfig.setBorrowing(reserve.id, true); - } - - if (isolationModeActive) { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt += (params.amount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - - reserve.updateInterestRates( - reserveCache, - params.asset, - 0, - params.releaseUnderlying ? params.amount : 0 - ); - - if (params.releaseUnderlying) { - IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); - } - - emit Borrow( - params.asset, - params.user, - params.onBehalfOf, - params.amount, - params.interestRateMode, - params.interestRateMode == DataTypes.InterestRateMode.STABLE - ? currentStableRate - : reserve.currentVariableBorrowRate, - params.referralCode - ); - } - - /** - * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the - * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also - * reduces the isolated debt. - * @dev Emits the `Repay()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the repay function - * @return The actual amount being repaid - */ - function executeRepay( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteRepayParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - - (uint256 stableDebt, uint256 variableDebt) = Helpers.getUserCurrentDebt( - params.onBehalfOf, - reserveCache - ); - - ValidationLogic.validateRepay( - reserveCache, - params.amount, - params.interestRateMode, - params.onBehalfOf, - stableDebt, - variableDebt - ); - - uint256 paybackAmount = params.interestRateMode == DataTypes.InterestRateMode.STABLE - ? stableDebt - : variableDebt; - - // Allows a user to repay with aTokens without leaving dust from interest. - if (params.useATokens && params.amount == type(uint256).max) { - params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); - } - - if (params.amount < paybackAmount) { - paybackAmount = params.amount; - } - - if (params.interestRateMode == DataTypes.InterestRateMode.STABLE) { - (reserveCache.nextTotalStableDebt, reserveCache.nextAvgStableBorrowRate) = IStableDebtToken( - reserveCache.stableDebtTokenAddress - ).burn(params.onBehalfOf, paybackAmount); - } else { - reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); - } - - reserve.updateInterestRates( - reserveCache, - params.asset, - params.useATokens ? 0 : paybackAmount, - 0 - ); - - if (stableDebt + variableDebt - paybackAmount == 0) { - userConfig.setBorrowing(reserve.id, false); - } - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - reserveCache, - paybackAmount - ); - - if (params.useATokens) { - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - reserveCache.aTokenAddress, - paybackAmount, - reserveCache.nextLiquidityIndex - ); - } else { - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); - IAToken(reserveCache.aTokenAddress).handleRepayment(msg.sender, paybackAmount); - } - - emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); - - return paybackAmount; - } - - /** - * @notice Implements the rebalance stable borrow rate feature. In case of liquidity crunches on the protocol, stable - * rate borrows might need to be rebalanced to bring back equilibrium between the borrow and supply APYs. - * @dev The rules that define if a position can be rebalanced are implemented in `ValidationLogic.validateRebalanceStableBorrowRate()` - * @dev Emits the `RebalanceStableBorrowRate()` event - * @param reserve The state of the reserve of the asset being repaid - * @param asset The asset of the position being rebalanced - * @param user The user being rebalanced - */ - function executeRebalanceStableBorrowRate( - DataTypes.ReserveData storage reserve, - address asset, - address user - ) external { - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - - ValidationLogic.validateRebalanceStableBorrowRate(reserve, reserveCache, asset); - - IStableDebtToken stableDebtToken = IStableDebtToken(reserveCache.stableDebtTokenAddress); - uint256 stableDebt = IERC20(address(stableDebtToken)).balanceOf(user); - - stableDebtToken.burn(user, stableDebt); - - (, reserveCache.nextTotalStableDebt, reserveCache.nextAvgStableBorrowRate) = stableDebtToken - .mint(user, user, stableDebt, reserve.currentStableBorrowRate); - - reserve.updateInterestRates(reserveCache, asset, 0, 0); - - emit RebalanceStableBorrowRate(asset, user); - } - - /** - * @notice Implements the swap borrow rate feature. Borrowers can swap from variable to stable positions at any time. - * @dev Emits the `Swap()` event - * @param reserve The of the reserve of the asset being repaid - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param asset The asset of the position being swapped - * @param interestRateMode The current interest rate mode of the position being swapped - */ - function executeSwapBorrowRateMode( - DataTypes.ReserveData storage reserve, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - DataTypes.InterestRateMode interestRateMode - ) external { - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - (uint256 stableDebt, uint256 variableDebt) = Helpers.getUserCurrentDebt( - msg.sender, - reserveCache - ); - - ValidationLogic.validateSwapRateMode( - reserve, - reserveCache, - userConfig, - stableDebt, - variableDebt, - interestRateMode - ); - - if (interestRateMode == DataTypes.InterestRateMode.STABLE) { - (reserveCache.nextTotalStableDebt, reserveCache.nextAvgStableBorrowRate) = IStableDebtToken( - reserveCache.stableDebtTokenAddress - ).burn(msg.sender, stableDebt); - - (, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).mint(msg.sender, msg.sender, stableDebt, reserveCache.nextVariableBorrowIndex); - } else { - reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).burn(msg.sender, variableDebt, reserveCache.nextVariableBorrowIndex); - - (, reserveCache.nextTotalStableDebt, reserveCache.nextAvgStableBorrowRate) = IStableDebtToken( - reserveCache.stableDebtTokenAddress - ).mint(msg.sender, msg.sender, variableDebt, reserve.currentStableBorrowRate); - } - - reserve.updateInterestRates(reserveCache, asset, 0, 0); - - emit SwapBorrowRateMode(asset, msg.sender, interestRateMode); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol deleted file mode 100644 index d5f1ce9e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol +++ /dev/null @@ -1,141 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -library BridgeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. - * @dev Essentially a supply without transferring the underlying. - * @dev Emits the `MintUnbacked` event - * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param asset The address of the underlying asset to mint aTokens of - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function executeMintUnbacked( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, amount); - - uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); - uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); - - uint256 unbacked = reserve.unbacked += amount.toUint128(); - - require(unbacked <= unbackedMintCap * (10**reserveDecimals), Errors.UNBACKED_MINT_CAP_EXCEEDED); - - reserve.updateInterestRates(reserveCache, asset, 0, 0); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - onBehalfOf, - amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); - } - } - - emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); - } - - /** - * @notice Back the current unbacked with `amount` and pay `fee`. - * @dev Emits the `BackUnbacked` event - * @param reserve The reserve to back unbacked for - * @param asset The address of the underlying asset to repay - * @param amount The amount to back - * @param fee The amount paid in fees - * @param protocolFeeBps The fraction of fees in basis points paid to the protocol - **/ - function executeBackUnbacked( - DataTypes.ReserveData storage reserve, - address asset, - uint256 amount, - uint256 fee, - uint256 protocolFeeBps - ) external { - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; - - uint256 feeToProtocol = fee.percentMul(protocolFeeBps); - uint256 feeToLP = fee - feeToProtocol; - uint256 added = backingAmount + fee; - - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply(), - feeToLP - ); - - reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - - reserve.unbacked -= backingAmount.toUint128(); - reserve.updateInterestRates(reserveCache, asset, added, 0); - - IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); - - emit BackUnbacked(asset, msg.sender, backingAmount, fee); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol deleted file mode 100644 index 5ef53e03..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol +++ /dev/null @@ -1,322 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -/** - * @title CalldataLogic library - * @author Aave - * @notice Library to decode calldata, used to optimize calldata size in L2Pool for transaction cost reduction - */ -library CalldataLogic { - /** - * @notice Decodes compressed supply params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed supply params - * @return The address of the underlying reserve - * @return The amount to supply - * @return The referralCode - */ - function decodeSupplyParams(mapping(uint256 => address) storage reservesList, bytes32 args) - internal - view - returns ( - address, - uint256, - uint16 - ) - { - uint16 assetId; - uint256 amount; - uint16 referralCode; - - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - referralCode := and(shr(144, args), 0xFFFF) - } - return (reservesList[assetId], amount, referralCode); - } - - /** - * @notice Decodes compressed supply params to standard params along with permit params - * @param reservesList The addresses of all the active reserves - * @param args The packed supply with permit params - * @return The address of the underlying reserve - * @return The amount to supply - * @return The referralCode - * @return The deadline of the permit - * @return The V value of the permit signature - */ - function decodeSupplyWithPermitParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) - internal - view - returns ( - address, - uint256, - uint16, - uint256, - uint8 - ) - { - uint256 deadline; - uint8 permitV; - - assembly { - deadline := and(shr(160, args), 0xFFFFFFFF) - permitV := and(shr(192, args), 0xFF) - } - (address asset, uint256 amount, uint16 referralCode) = decodeSupplyParams(reservesList, args); - - return (asset, amount, referralCode, deadline, permitV); - } - - /** - * @notice Decodes compressed withdraw params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed withdraw params - * @return The address of the underlying reserve - * @return The amount to withdraw - */ - function decodeWithdrawParams(mapping(uint256 => address) storage reservesList, bytes32 args) - internal - view - returns (address, uint256) - { - uint16 assetId; - uint256 amount; - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - } - if (amount == type(uint128).max) { - amount = type(uint256).max; - } - return (reservesList[assetId], amount); - } - - /** - * @notice Decodes compressed borrow params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed borrow params - * @return The address of the underlying reserve - * @return The amount to borrow - * @return The interestRateMode, 1 for stable or 2 for variable debt - * @return The referralCode - */ - function decodeBorrowParams(mapping(uint256 => address) storage reservesList, bytes32 args) - internal - view - returns ( - address, - uint256, - uint256, - uint16 - ) - { - uint16 assetId; - uint256 amount; - uint256 interestRateMode; - uint16 referralCode; - - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - interestRateMode := and(shr(144, args), 0xFF) - referralCode := and(shr(152, args), 0xFFFF) - } - - return (reservesList[assetId], amount, interestRateMode, referralCode); - } - - /** - * @notice Decodes compressed repay params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed repay params - * @return The address of the underlying reserve - * @return The amount to repay - * @return The interestRateMode, 1 for stable or 2 for variable debt - */ - function decodeRepayParams(mapping(uint256 => address) storage reservesList, bytes32 args) - internal - view - returns ( - address, - uint256, - uint256 - ) - { - uint16 assetId; - uint256 amount; - uint256 interestRateMode; - - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - interestRateMode := and(shr(144, args), 0xFF) - } - - if (amount == type(uint128).max) { - amount = type(uint256).max; - } - - return (reservesList[assetId], amount, interestRateMode); - } - - /** - * @notice Decodes compressed repay params to standard params along with permit params - * @param reservesList The addresses of all the active reserves - * @param args The packed repay with permit params - * @return The address of the underlying reserve - * @return The amount to repay - * @return The interestRateMode, 1 for stable or 2 for variable debt - * @return The deadline of the permit - * @return The V value of the permit signature - */ - function decodeRepayWithPermitParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) - internal - view - returns ( - address, - uint256, - uint256, - uint256, - uint8 - ) - { - uint256 deadline; - uint8 permitV; - - (address asset, uint256 amount, uint256 interestRateMode) = decodeRepayParams( - reservesList, - args - ); - - assembly { - deadline := and(shr(152, args), 0xFFFFFFFF) - permitV := and(shr(184, args), 0xFF) - } - - return (asset, amount, interestRateMode, deadline, permitV); - } - - /** - * @notice Decodes compressed swap borrow rate mode params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed swap borrow rate mode params - * @return The address of the underlying reserve - * @return The interest rate mode, 1 for stable 2 for variable debt - */ - function decodeSwapBorrowRateModeParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256) { - uint16 assetId; - uint256 interestRateMode; - - assembly { - assetId := and(args, 0xFFFF) - interestRateMode := and(shr(16, args), 0xFF) - } - - return (reservesList[assetId], interestRateMode); - } - - /** - * @notice Decodes compressed rebalance stable borrow rate params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed rabalance stable borrow rate params - * @return The address of the underlying reserve - * @return The address of the user to rebalance - */ - function decodeRebalanceStableBorrowRateParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, address) { - uint16 assetId; - address user; - assembly { - assetId := and(args, 0xFFFF) - user := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - } - return (reservesList[assetId], user); - } - - /** - * @notice Decodes compressed set user use reserve as collateral params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed set user use reserve as collateral params - * @return The address of the underlying reserve - * @return True if to set using as collateral, false otherwise - */ - function decodeSetUserUseReserveAsCollateralParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, bool) { - uint16 assetId; - bool useAsCollateral; - assembly { - assetId := and(args, 0xFFFF) - useAsCollateral := and(shr(16, args), 0x1) - } - return (reservesList[assetId], useAsCollateral); - } - - /** - * @notice Decodes compressed liquidation call params to standard params - * @param reservesList The addresses of all the active reserves - * @param args1 The first half of packed liquidation call params - * @param args2 The second half of the packed liquidation call params - * @return The address of the underlying collateral asset - * @return The address of the underlying debt asset - * @return The address of the user to liquidate - * @return The amount of debt to cover - * @return True if receiving aTokens, false otherwise - */ - function decodeLiquidationCallParams( - mapping(uint256 => address) storage reservesList, - bytes32 args1, - bytes32 args2 - ) - internal - view - returns ( - address, - address, - address, - uint256, - bool - ) - { - uint16 collateralAssetId; - uint16 debtAssetId; - address user; - uint256 debtToCover; - bool receiveAToken; - - assembly { - collateralAssetId := and(args1, 0xFFFF) - debtAssetId := and(shr(16, args1), 0xFFFF) - user := and(shr(32, args1), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - - debtToCover := and(args2, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - receiveAToken := and(shr(128, args2), 0x1) - } - - if (debtToCover == type(uint128).max) { - debtToCover = type(uint256).max; - } - - return ( - reservesList[collateralAssetId], - reservesList[debtAssetId], - user, - debtToCover, - receiveAToken - ); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ConfiguratorLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ConfiguratorLogic.sol deleted file mode 100644 index c29afa07..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ConfiguratorLogic.sol +++ /dev/null @@ -1,268 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IPool} from '../../../interfaces/IPool.sol'; -import {IInitializableAToken} from '../../../interfaces/IInitializableAToken.sol'; -import {IInitializableDebtToken} from '../../../interfaces/IInitializableDebtToken.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {InitializableImmutableAdminUpgradeabilityProxy} from '../aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ConfiguratorInputTypes} from '../types/ConfiguratorInputTypes.sol'; - -/** - * @title ConfiguratorLogic library - * @author Aave - * @notice Implements the functions to initialize reserves and update aTokens and debtTokens - */ -library ConfiguratorLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPoolConfigurator` for descriptions - event ReserveInitialized( - address indexed asset, - address indexed aToken, - address stableDebtToken, - address variableDebtToken, - address interestRateStrategyAddress - ); - event ATokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - event StableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - event VariableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @notice Initialize a reserve by creating and initializing aToken, stable debt token and variable debt token - * @dev Emits the `ReserveInitialized` event - * @param pool The Pool in which the reserve will be initialized - * @param input The needed parameters for the initialization - */ - function executeInitReserve(IPool pool, ConfiguratorInputTypes.InitReserveInput calldata input) - public - { - address aTokenProxyAddress = _initTokenWithProxy( - input.aTokenImpl, - abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - pool, - input.treasury, - input.underlyingAsset, - input.incentivesController, - input.underlyingAssetDecimals, - input.aTokenName, - input.aTokenSymbol, - input.params - ) - ); - - address stableDebtTokenProxyAddress = _initTokenWithProxy( - input.stableDebtTokenImpl, - abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - pool, - input.underlyingAsset, - input.incentivesController, - input.underlyingAssetDecimals, - input.stableDebtTokenName, - input.stableDebtTokenSymbol, - input.params - ) - ); - - address variableDebtTokenProxyAddress = _initTokenWithProxy( - input.variableDebtTokenImpl, - abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - pool, - input.underlyingAsset, - input.incentivesController, - input.underlyingAssetDecimals, - input.variableDebtTokenName, - input.variableDebtTokenSymbol, - input.params - ) - ); - - pool.initReserve( - input.underlyingAsset, - aTokenProxyAddress, - stableDebtTokenProxyAddress, - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - - DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); - - currentConfig.setDecimals(input.underlyingAssetDecimals); - - currentConfig.setActive(true); - currentConfig.setPaused(false); - currentConfig.setFrozen(false); - - pool.setConfiguration(input.underlyingAsset, currentConfig); - - emit ReserveInitialized( - input.underlyingAsset, - aTokenProxyAddress, - stableDebtTokenProxyAddress, - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - } - - /** - * @notice Updates the aToken implementation and initializes it - * @dev Emits the `ATokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the aToken - * @param input The parameters needed for the initialize call - */ - function executeUpdateAToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateATokenInput calldata input - ) public { - DataTypes.ReserveData memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - cachedPool, - input.treasury, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); - - emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); - } - - /** - * @notice Updates the stable debt token implementation and initializes it - * @dev Emits the `StableDebtTokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the stable debt token - * @param input The parameters needed for the initialize call - */ - function executeUpdateStableDebtToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) public { - DataTypes.ReserveData memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - cachedPool, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation( - reserveData.stableDebtTokenAddress, - input.implementation, - encodedCall - ); - - emit StableDebtTokenUpgraded( - input.asset, - reserveData.stableDebtTokenAddress, - input.implementation - ); - } - - /** - * @notice Updates the variable debt token implementation and initializes it - * @dev Emits the `VariableDebtTokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the variable debt token - * @param input The parameters needed for the initialize call - */ - function executeUpdateVariableDebtToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) public { - DataTypes.ReserveData memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, , ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - cachedPool, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation( - reserveData.variableDebtTokenAddress, - input.implementation, - encodedCall - ); - - emit VariableDebtTokenUpgraded( - input.asset, - reserveData.variableDebtTokenAddress, - input.implementation - ); - } - - /** - * @notice Creates a new proxy and initializes the implementation - * @param implementation The address of the implementation - * @param initParams The parameters that is passed to the implementation to initialize - * @return The address of initialized proxy - */ - function _initTokenWithProxy(address implementation, bytes memory initParams) - internal - returns (address) - { - InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( - address(this) - ); - - proxy.initialize(implementation, initParams); - - return address(proxy); - } - - /** - * @notice Upgrades the implementation and makes call to the proxy - * @dev The call is used to initialize the new implementation. - * @param proxyAddress The address of the proxy - * @param implementation The address of the new implementation - * @param initParams The parameters to the call after the upgrade - */ - function _upgradeTokenImplementation( - address proxyAddress, - address implementation, - bytes memory initParams - ) internal { - InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( - payable(proxyAddress) - ); - - proxy.upgradeToAndCall(implementation, initParams); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index e329828b..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,121 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - ValidationLogic.validateSetUserEMode( - reservesData, - reservesList, - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - uint8 prevCategoryId = usersEModeCategory[msg.sender]; - usersEModeCategory[msg.sender] = params.categoryId; - - if (prevCategoryId != 0) { - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - } - emit UserEModeSet(msg.sender, params.categoryId); - } - - /** - * @notice Gets the eMode configuration and calculates the eMode asset price if a custom oracle is configured - * @dev The eMode asset price returned is 0 if no oracle is specified - * @param category The user eMode category - * @param oracle The price oracle - * @return The eMode ltv - * @return The eMode liquidation threshold - * @return The eMode asset price - **/ - function getEModeConfiguration( - DataTypes.EModeCategory storage category, - IPriceOracleGetter oracle - ) - internal - view - returns ( - uint256, - uint256, - uint256 - ) - { - uint256 eModeAssetPrice = 0; - address eModePriceSource = category.priceSource; - - if (eModePriceSource != address(0)) { - eModeAssetPrice = oracle.getAssetPrice(eModePriceSource); - } - - return (category.ltv, category.liquidationThreshold, eModeAssetPrice); - } - - /** - * @notice Checks if eMode is active for a user and if yes, if the asset belongs to the eMode category chosen - * @param eModeUserCategory The user eMode category - * @param eModeAssetCategory The asset eMode category - * @return True if eMode is active and the asset belongs to the eMode category chosen by the user, false otherwise - **/ - function isInEModeCategory(uint256 eModeUserCategory, uint256 eModeAssetCategory) - internal - pure - returns (bool) - { - return (eModeUserCategory != 0 && eModeAssetCategory == eModeUserCategory); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol deleted file mode 100644 index fa800e32..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol +++ /dev/null @@ -1,262 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IFlashLoanReceiver} from '../../../flashloan/interfaces/IFlashLoanReceiver.sol'; -import {IFlashLoanSimpleReceiver} from '../../../flashloan/interfaces/IFlashLoanSimpleReceiver.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {BorrowLogic} from './BorrowLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title FlashLoanLogic library - * @author Aave - * @notice Implements the logic for the flash loans - */ -library FlashLoanLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - - // See `IPool` for descriptions - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - // Helper struct for internal variables used in the `executeFlashLoan` function - struct FlashLoanLocalVars { - IFlashLoanReceiver receiver; - uint256 i; - address currentAsset; - uint256 currentAmount; - uint256[] totalPremiums; - uint256 flashloanPremiumTotal; - uint256 flashloanPremiumToProtocol; - } - - /** - * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction - * as long as the amount taken plus fee is returned or debt is opened. - * @dev For authorized flashborrowers the fee is waived - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the flashloan function - */ - function executeFlashLoan( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.FlashloanParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); - - FlashLoanLocalVars memory vars; - - vars.totalPremiums = new uint256[](params.assets.length); - - vars.receiver = IFlashLoanReceiver(params.receiverAddress); - (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower - ? (0, 0) - : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); - - for (vars.i = 0; vars.i < params.assets.length; vars.i++) { - vars.currentAmount = params.amounts[vars.i]; - vars.totalPremiums[vars.i] = vars.currentAmount.percentMul(vars.flashloanPremiumTotal); - IAToken(reservesData[params.assets[vars.i]].aTokenAddress).transferUnderlyingTo( - params.receiverAddress, - vars.currentAmount - ); - } - - require( - vars.receiver.executeOperation( - params.assets, - params.amounts, - vars.totalPremiums, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - for (vars.i = 0; vars.i < params.assets.length; vars.i++) { - vars.currentAsset = params.assets[vars.i]; - vars.currentAmount = params.amounts[vars.i]; - - if ( - DataTypes.InterestRateMode(params.interestRateModes[vars.i]) == - DataTypes.InterestRateMode.NONE - ) { - _handleFlashLoanRepayment( - reservesData[vars.currentAsset], - DataTypes.FlashLoanRepaymentParams({ - asset: vars.currentAsset, - receiverAddress: params.receiverAddress, - amount: vars.currentAmount, - totalPremium: vars.totalPremiums[vars.i], - flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } else { - // If the user chose to not return the funds, the system checks if there is enough collateral and - // eventually opens a debt position - BorrowLogic.executeBorrow( - reservesData, - reservesList, - eModeCategories, - userConfig, - DataTypes.ExecuteBorrowParams({ - asset: vars.currentAsset, - user: msg.sender, - onBehalfOf: params.onBehalfOf, - amount: vars.currentAmount, - interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[vars.i]), - referralCode: params.referralCode, - releaseUnderlying: false, - maxStableRateBorrowSizePercent: params.maxStableRateBorrowSizePercent, - reservesCount: params.reservesCount, - oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), - userEModeCategory: params.userEModeCategory, - priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) - .getPriceOracleSentinel() - }) - ); - // no premium is paid when taking on the flashloan as debt - emit FlashLoan( - params.receiverAddress, - msg.sender, - vars.currentAsset, - vars.currentAmount, - DataTypes.InterestRateMode(params.interestRateModes[vars.i]), - 0, - params.referralCode - ); - } - } - } - - /** - * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one - * transaction as long as the amount taken plus fee is returned. - * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the simple flashloan function - */ - function executeFlashLoanSimple( - DataTypes.ReserveData storage reserve, - DataTypes.FlashloanSimpleParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloanSimple(reserve); - - IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); - uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); - IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); - - require( - receiver.executeOperation( - params.asset, - params.amount, - totalPremium, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - _handleFlashLoanRepayment( - reserve, - DataTypes.FlashLoanRepaymentParams({ - asset: params.asset, - receiverAddress: params.receiverAddress, - amount: params.amount, - totalPremium: totalPremium, - flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } - - /** - * @notice Handles repayment of flashloaned assets + premium - * @dev Will pull the amount + premium from the receiver, so must have approved pool - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the repayment function - */ - function _handleFlashLoanRepayment( - DataTypes.ReserveData storage reserve, - DataTypes.FlashLoanRepaymentParams memory params - ) internal { - uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); - uint256 premiumToLP = params.totalPremium - premiumToProtocol; - uint256 amountPlusPremium = params.amount + params.totalPremium; - - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply(), - premiumToLP - ); - - reserve.accruedToTreasury += premiumToProtocol - .rayDiv(reserveCache.nextLiquidityIndex) - .toUint128(); - - reserve.updateInterestRates(reserveCache, params.asset, amountPlusPremium, 0); - - IERC20(params.asset).safeTransferFrom( - params.receiverAddress, - reserveCache.aTokenAddress, - amountPlusPremium - ); - - IAToken(reserveCache.aTokenAddress).handleRepayment(params.receiverAddress, amountPlusPremium); - - emit FlashLoan( - params.receiverAddress, - msg.sender, - params.asset, - params.amount, - DataTypes.InterestRateMode(0), - params.totalPremium, - params.referralCode - ); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index a03fc3ca..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,280 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeAssetPrice; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - uint256 eModeAssetCategory; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - **/ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) - internal - view - returns ( - uint256, - uint256, - uint256, - uint256, - uint256, - bool - ) - { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - (vars.eModeLtv, vars.eModeLiqThreshold, vars.eModeAssetPrice) = EModeLogic - .getEModeConfiguration( - eModeCategories[params.userEModeCategory], - IPriceOracleGetter(params.oracle) - ); - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - ( - vars.ltv, - vars.liquidationThreshold, - , - vars.decimals, - , - vars.eModeAssetCategory - ) = currentReserve.configuration.getParams(); - - unchecked { - vars.assetUnit = 10**vars.decimals; - } - - vars.assetPrice = vars.eModeAssetPrice != 0 && - params.userEModeCategory == vars.eModeAssetCategory - ? vars.eModeAssetPrice - : IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = EModeLogic.isInEModeCategory( - params.userEModeCategory, - vars.eModeAssetCategory - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - **/ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency < totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the stable and variable debt tokens for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - **/ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt != 0) { - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()); - } - - userTotalDebt = userTotalDebt + IERC20(reserve.stableDebtTokenAddress).balanceOf(user); - - userTotalDebt = assetPrice * userTotalDebt; - - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - **/ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/IsolationModeLogic.sol deleted file mode 100644 index e2995c16..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/IsolationModeLogic.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/LiquidationLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/LiquidationLogic.sol deleted file mode 100644 index 7d91d336..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ /dev/null @@ -1,538 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts//IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {PercentageMath} from '../../libraries/math/PercentageMath.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Helpers} from '../../libraries/helpers/Helpers.sol'; -import {DataTypes} from '../../libraries/types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {IsolationModeLogic} from './IsolationModeLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; -import {UserConfiguration} from '../../libraries/configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../../libraries/configuration/ReserveConfiguration.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IStableDebtToken} from '../../../interfaces/IStableDebtToken.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; - -/** - * @title LiquidationLogic library - * @author Aave - * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations - **/ -library LiquidationLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Default percentage of borrower's debt to be repaid in a liquidation. - * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 0.5e4 results in 50.00% - */ - uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; - - /** - * @dev Maximum percentage of borrower's debt to be repaid in a liquidation - * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 1e4 results in 100.00% - */ - uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; - - /** - * @dev This constant represents below which health factor value it is possible to liquidate - * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. - * A value of 0.95e18 results in 0.95 - */ - uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; - - struct LiquidationCallLocalVars { - uint256 userCollateralBalance; - uint256 userVariableDebt; - uint256 userTotalDebt; - uint256 actualDebtToLiquidate; - uint256 actualCollateralToLiquidate; - uint256 liquidationBonus; - uint256 healthFactor; - uint256 liquidationProtocolFeeAmount; - address collateralPriceSource; - address debtPriceSource; - IAToken collateralAToken; - DataTypes.ReserveCache debtReserveCache; - } - - /** - * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) - * covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportional amount of the `collateralAsset` plus a bonus to cover market risk - * @dev Emits the `LiquidationCall()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params The additional parameters needed to execute the liquidation function - **/ - function executeLiquidationCall( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ExecuteLiquidationCallParams memory params - ) external { - LiquidationCallLocalVars memory vars; - - DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; - DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; - DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; - vars.debtReserveCache = debtReserve.cache(); - debtReserve.updateState(vars.debtReserveCache); - - (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: params.reservesCount, - user: params.user, - oracle: params.priceOracle, - userEModeCategory: params.userEModeCategory - }) - ); - - (vars.userVariableDebt, vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( - vars.debtReserveCache, - params, - vars.healthFactor - ); - - ValidationLogic.validateLiquidationCall( - userConfig, - collateralReserve, - DataTypes.ValidateLiquidationCallParams({ - debtReserveCache: vars.debtReserveCache, - totalDebt: vars.userTotalDebt, - healthFactor: vars.healthFactor, - priceOracleSentinel: params.priceOracleSentinel - }) - ); - - ( - vars.collateralAToken, - vars.collateralPriceSource, - vars.debtPriceSource, - vars.liquidationBonus - ) = _getConfigurationData(eModeCategories, collateralReserve, params); - - vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); - - ( - vars.actualCollateralToLiquidate, - vars.actualDebtToLiquidate, - vars.liquidationProtocolFeeAmount - ) = _calculateAvailableCollateralToLiquidate( - collateralReserve, - vars.debtReserveCache, - vars.collateralPriceSource, - vars.debtPriceSource, - vars.actualDebtToLiquidate, - vars.userCollateralBalance, - vars.liquidationBonus, - IPriceOracleGetter(params.priceOracle) - ); - - if (vars.userTotalDebt == vars.actualDebtToLiquidate) { - userConfig.setBorrowing(debtReserve.id, false); - } - - _burnDebtTokens(params, vars); - - debtReserve.updateInterestRates( - vars.debtReserveCache, - params.debtAsset, - vars.actualDebtToLiquidate, - 0 - ); - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - vars.debtReserveCache, - vars.actualDebtToLiquidate - ); - - if (params.receiveAToken) { - _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); - } else { - _burnCollateralATokens(collateralReserve, params, vars); - } - - // Transfer fee to treasury if it is non-zero - if (vars.liquidationProtocolFeeAmount != 0) { - vars.collateralAToken.transferOnLiquidation( - params.user, - vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), - vars.liquidationProtocolFeeAmount - ); - } - - // If the collateral being liquidated is equal to the user balance, - // we set the currency as not being used as collateral anymore - if (vars.actualCollateralToLiquidate == vars.userCollateralBalance) { - userConfig.setUsingAsCollateral(collateralReserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); - } - - // Transfers the debt asset being repaid to the aToken, where the liquidity is kept - IERC20(params.debtAsset).safeTransferFrom( - msg.sender, - vars.debtReserveCache.aTokenAddress, - vars.actualDebtToLiquidate - ); - - IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( - msg.sender, - vars.actualDebtToLiquidate - ); - - emit LiquidationCall( - params.collateralAsset, - params.debtAsset, - params.user, - vars.actualDebtToLiquidate, - vars.actualCollateralToLiquidate, - msg.sender, - params.receiveAToken - ); - } - - /** - * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. - * @dev The function also updates the state and the interest rate of the collateral reserve. - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _burnCollateralATokens( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); - collateralReserve.updateState(collateralReserveCache); - collateralReserve.updateInterestRates( - collateralReserveCache, - params.collateralAsset, - 0, - vars.actualCollateralToLiquidate - ); - - // Burn the equivalent amount of aToken, sending the underlying to the liquidator - vars.collateralAToken.burn( - params.user, - msg.sender, - vars.actualCollateralToLiquidate, - collateralReserveCache.nextLiquidityIndex - ); - } - - /** - * @notice Liquidates the user aTokens by transferring them to the liquidator. - * @dev The function also checks the state of the liquidator and activates the aToken as collateral - * as in standard transfers if the isolation mode constraints are respected. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _liquidateATokens( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); - vars.collateralAToken.transferOnLiquidation( - params.user, - msg.sender, - vars.actualCollateralToLiquidate - ); - - if (liquidatorPreviousATokenBalance == 0) { - DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; - if ( - ValidationLogic.validateUseAsCollateral( - reservesData, - reservesList, - liquidatorConfig, - collateralReserve.configuration - ) - ) { - liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); - } - } - } - - /** - * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. - * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. - * @param params The additional parameters needed to execute the liquidation function - * @param vars the executeLiquidationCall() function local vars - */ - function _burnDebtTokens( - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - if (vars.userVariableDebt >= vars.actualDebtToLiquidate) { - vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( - vars.debtReserveCache.variableDebtTokenAddress - ).burn( - params.user, - vars.actualDebtToLiquidate, - vars.debtReserveCache.nextVariableBorrowIndex - ); - } else { - // If the user doesn't have variable debt, no need to try to burn variable debt tokens - if (vars.userVariableDebt != 0) { - vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( - vars.debtReserveCache.variableDebtTokenAddress - ).burn(params.user, vars.userVariableDebt, vars.debtReserveCache.nextVariableBorrowIndex); - } - ( - vars.debtReserveCache.nextTotalStableDebt, - vars.debtReserveCache.nextAvgStableBorrowRate - ) = IStableDebtToken(vars.debtReserveCache.stableDebtTokenAddress).burn( - params.user, - vars.actualDebtToLiquidate - vars.userVariableDebt - ); - } - } - - /** - * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor - * and corresponding close factor. - * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR - * @param debtReserveCache The reserve cache data object of the debt reserve - * @param params The additional parameters needed to execute the liquidation function - * @param healthFactor The health factor of the position - * @return The variable debt of the user - * @return The total debt of the user - * @return The actual debt to liquidate as a function of the closeFactor - */ - function _calculateDebt( - DataTypes.ReserveCache memory debtReserveCache, - DataTypes.ExecuteLiquidationCallParams memory params, - uint256 healthFactor - ) - internal - view - returns ( - uint256, - uint256, - uint256 - ) - { - (uint256 userStableDebt, uint256 userVariableDebt) = Helpers.getUserCurrentDebt( - params.user, - debtReserveCache - ); - - uint256 userTotalDebt = userStableDebt + userVariableDebt; - - uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD - ? DEFAULT_LIQUIDATION_CLOSE_FACTOR - : MAX_LIQUIDATION_CLOSE_FACTOR; - - uint256 maxLiquidatableDebt = userTotalDebt.percentMul(closeFactor); - - uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt - ? maxLiquidatableDebt - : params.debtToCover; - - return (userVariableDebt, userTotalDebt, actualDebtToLiquidate); - } - - /** - * @notice Returns the configuration data for the debt and the collateral reserves. - * @param eModeCategories The configuration of all the efficiency mode categories - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @return The collateral aToken - * @return The address to use as price source for the collateral - * @return The address to use as price source for the debt - * @return The liquidation bonus to apply to the collateral - */ - function _getConfigurationData( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params - ) - internal - view - returns ( - IAToken, - address, - address, - uint256 - ) - { - IAToken collateralAToken = IAToken(collateralReserve.aTokenAddress); - uint256 liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); - - address collateralPriceSource = params.collateralAsset; - address debtPriceSource = params.debtAsset; - - if (params.userEModeCategory != 0) { - address eModePriceSource = eModeCategories[params.userEModeCategory].priceSource; - - if ( - EModeLogic.isInEModeCategory( - params.userEModeCategory, - collateralReserve.configuration.getEModeCategory() - ) - ) { - liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; - - if (eModePriceSource != address(0)) { - collateralPriceSource = eModePriceSource; - } - } - - // when in eMode, debt will always be in the same eMode category, can skip matching category check - if (eModePriceSource != address(0)) { - debtPriceSource = eModePriceSource; - } - } - - return (collateralAToken, collateralPriceSource, debtPriceSource, liquidationBonus); - } - - struct AvailableCollateralToLiquidateLocalVars { - uint256 collateralPrice; - uint256 debtAssetPrice; - uint256 maxCollateralToLiquidate; - uint256 baseCollateral; - uint256 bonusCollateral; - uint256 debtAssetDecimals; - uint256 collateralDecimals; - uint256 collateralAssetUnit; - uint256 debtAssetUnit; - uint256 collateralAmount; - uint256 debtAmountNeeded; - uint256 liquidationProtocolFeePercentage; - uint256 liquidationProtocolFee; - } - - /** - * @notice Calculates how much of a specific collateral can be liquidated, given - * a certain amount of debt asset. - * @dev This function needs to be called after all the checks to validate the liquidation have been performed, - * otherwise it might fail. - * @param collateralReserve The data of the collateral reserve - * @param debtReserveCache The cached data of the debt reserve - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated - * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation - * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) - * @return The amount to repay with the liquidation - * @return The fee taken from the liquidation bonus amount to be paid to the protocol - **/ - function _calculateAvailableCollateralToLiquidate( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveCache memory debtReserveCache, - address collateralAsset, - address debtAsset, - uint256 debtToCover, - uint256 userCollateralBalance, - uint256 liquidationBonus, - IPriceOracleGetter oracle - ) - internal - view - returns ( - uint256, - uint256, - uint256 - ) - { - AvailableCollateralToLiquidateLocalVars memory vars; - - vars.collateralPrice = oracle.getAssetPrice(collateralAsset); - vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); - - vars.collateralDecimals = collateralReserve.configuration.getDecimals(); - vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); - - unchecked { - vars.collateralAssetUnit = 10**vars.collateralDecimals; - vars.debtAssetUnit = 10**vars.debtAssetDecimals; - } - - vars.liquidationProtocolFeePercentage = collateralReserve - .configuration - .getLiquidationProtocolFee(); - - // This is the base collateral to liquidate based on the given debt to cover - vars.baseCollateral = - ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / - (vars.collateralPrice * vars.debtAssetUnit); - - vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); - - if (vars.maxCollateralToLiquidate > userCollateralBalance) { - vars.collateralAmount = userCollateralBalance; - vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / - (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); - } else { - vars.collateralAmount = vars.maxCollateralToLiquidate; - vars.debtAmountNeeded = debtToCover; - } - - if (vars.liquidationProtocolFeePercentage != 0) { - vars.bonusCollateral = - vars.collateralAmount - - vars.collateralAmount.percentDiv(liquidationBonus); - - vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( - vars.liquidationProtocolFeePercentage - ); - - return ( - vars.collateralAmount - vars.liquidationProtocolFee, - vars.debtAmountNeeded, - vars.liquidationProtocolFee - ); - } else { - return (vars.collateralAmount, vars.debtAmountNeeded, 0); - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/PoolLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/PoolLogic.sol deleted file mode 100644 index 954066fd..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/PoolLogic.sol +++ /dev/null @@ -1,192 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; - -/** - * @title PoolLogic library - * @author Aave - * @notice Implements the logic for Pool specific functions - */ -library PoolLogic { - using GPv2SafeERC20 for IERC20; - using WadRayMath for uint256; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice Initialize an asset reserve and add the reserve to the list of reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param params Additional parameters needed for initiation - * @return true if appended, false if inserted at existing empty spot - **/ - function executeInitReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.InitReserveParams memory params - ) external returns (bool) { - require(Address.isContract(params.asset), Errors.NOT_CONTRACT); - reservesData[params.asset].init( - params.aTokenAddress, - params.stableDebtAddress, - params.variableDebtAddress, - params.interestRateStrategyAddress - ); - - bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || - reservesList[0] == params.asset; - require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); - - for (uint16 i = 0; i < params.reservesCount; i++) { - if (reservesList[i] == address(0)) { - reservesData[params.asset].id = i; - reservesList[i] = params.asset; - return false; - } - } - - require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); - reservesData[params.asset].id = params.reservesCount; - reservesList[params.reservesCount] = params.asset; - return true; - } - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function executeRescueTokens( - address token, - address to, - uint256 amount - ) external { - IERC20(token).safeTransfer(to, amount); - } - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param reservesData The state of all the reserves - * @param assets The list of reserves for which the minting needs to be executed - **/ - function executeMintToTreasury( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] calldata assets - ) external { - for (uint256 i = 0; i < assets.length; i++) { - address assetAddress = assets[i]; - - DataTypes.ReserveData storage reserve = reservesData[assetAddress]; - - // this cover both inactive reserves and invalid reserves since the flag will be 0 for both - if (!reserve.configuration.getActive()) { - continue; - } - - uint256 accruedToTreasury = reserve.accruedToTreasury; - - if (accruedToTreasury != 0) { - reserve.accruedToTreasury = 0; - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); - IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); - - emit MintedToTreasury(assetAddress, amountToMint); - } - } - } - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function executeResetIsolationModeTotalDebt( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset - ) external { - require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); - reservesData[asset].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(asset, 0); - } - - /** - * @notice Drop a reserve - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param asset The address of the underlying asset of the reserve - **/ - function executeDropReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - address asset - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - ValidationLogic.validateDropReserve(reservesList, reserve, asset); - reservesList[reservesData[asset].id] = address(0); - delete reservesData[asset]; - } - - /** - * @notice Returns the user account data across all the reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the calculation - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - **/ - function executeGetUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ) - { - ( - totalCollateralBase, - totalDebtBase, - ltv, - currentLiquidationThreshold, - healthFactor, - - ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); - - availableBorrowsBase = GenericLogic.calculateAvailableBorrows( - totalCollateralBase, - totalDebtBase, - ltv - ); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index a946c381..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,362 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IStableDebtToken} from '../../../interfaces/IStableDebtToken.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - **/ - function getNormalizedIncome(DataTypes.ReserveData storage reserve) - internal - view - returns (uint256) - { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - **/ - function getNormalizedDebt(DataTypes.ReserveData storage reserve) - internal - view - returns (uint256) - { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - **/ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - **/ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param stableDebtTokenAddress The address of the overlying stable debt token contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - **/ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.stableDebtTokenAddress = stableDebtTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - struct UpdateInterestRatesLocalVars { - uint256 nextLiquidityRate; - uint256 nextStableRate; - uint256 nextVariableRate; - uint256 totalVariableDebt; - } - - /** - * @notice Updates the reserve current stable borrow rate, the current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - **/ - function updateInterestRates( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - UpdateInterestRatesLocalVars memory vars; - - vars.totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - ( - vars.nextLiquidityRate, - vars.nextStableRate, - vars.nextVariableRate - ) = IReserveInterestRateStrategy(reserve.interestRateStrategyAddress).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserveCache.reserveConfiguration.getUnbackedMintCap() != 0 - ? reserve.unbacked - : 0, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalStableDebt: reserveCache.nextTotalStableDebt, - totalVariableDebt: vars.totalVariableDebt, - averageStableBorrowRate: reserveCache.nextAvgStableBorrowRate, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - aToken: reserveCache.aTokenAddress - }) - ); - - reserve.currentLiquidityRate = vars.nextLiquidityRate.toUint128(); - reserve.currentStableBorrowRate = vars.nextStableRate.toUint128(); - reserve.currentVariableBorrowRate = vars.nextVariableRate.toUint128(); - - emit ReserveDataUpdated( - reserveAddress, - vars.nextLiquidityRate, - vars.nextStableRate, - vars.nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - struct AccrueToTreasuryLocalVars { - uint256 prevTotalStableDebt; - uint256 prevTotalVariableDebt; - uint256 currTotalVariableDebt; - uint256 cumulatedStableInterest; - uint256 totalDebtAccrued; - uint256 amountToMint; - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - **/ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - AccrueToTreasuryLocalVars memory vars; - - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - vars.prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - vars.currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //calculate the stable debt until the last timestamp update - vars.cumulatedStableInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currAvgStableBorrowRate, - reserveCache.stableDebtLastUpdateTimestamp, - reserveCache.reserveLastUpdateTimestamp - ); - - vars.prevTotalStableDebt = reserveCache.currPrincipalStableDebt.rayMul( - vars.cumulatedStableInterest - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - vars.totalDebtAccrued = - vars.currTotalVariableDebt + - reserveCache.currTotalStableDebt - - vars.prevTotalVariableDebt - - vars.prevTotalStableDebt; - - vars.amountToMint = vars.totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (vars.amountToMint != 0) { - reserve.accruedToTreasury += vars - .amountToMint - .rayDiv(reserveCache.nextLiquidityIndex) - .toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - **/ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - reserveCache.nextLiquidityIndex = reserveCache.currLiquidityIndex; - reserveCache.nextVariableBorrowIndex = reserveCache.currVariableBorrowIndex; - - //only cumulating if there is any income being produced - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - - //as the liquidity rate might come only from stable rate loans, we need to ensure - //that there is actual variable debt before accumulating - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache(DataTypes.ReserveData storage reserve) - internal - view - returns (DataTypes.ReserveCache memory) - { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserve.variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.stableDebtTokenAddress = reserve.stableDebtTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - ( - reserveCache.currPrincipalStableDebt, - reserveCache.currTotalStableDebt, - reserveCache.currAvgStableBorrowRate, - reserveCache.stableDebtLastUpdateTimestamp - ) = IStableDebtToken(reserveCache.stableDebtTokenAddress).getSupplyData(); - - // by default the actions are considered as not affecting the debt balances. - // if the action involves mint/burn of debt, the cache needs to be updated - reserveCache.nextTotalStableDebt = reserveCache.currTotalStableDebt; - reserveCache.nextAvgStableBorrowRate = reserveCache.currAvgStableBorrowRate; - - return reserveCache; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol deleted file mode 100644 index 98ad8e8f..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol +++ /dev/null @@ -1,290 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; - -/** - * @title SupplyLogic library - * @author Aave - * @notice Implements the base logic for supply/withdraw - */ -library SupplyLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. - * @dev Emits the `Supply()` event. - * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as - * collateral. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the supply function - */ - function executeSupply( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSupplyParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, params.amount); - - reserve.updateInterestRates(reserveCache, params.asset, params.amount, 0); - - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - params.onBehalfOf, - params.amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); - } - } - - emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); - } - - /** - * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset - * previously supplied in the Aave protocol. - * @dev Emits the `Withdraw()` event. - * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the withdraw function - * @return The actual amount withdrawn - */ - function executeWithdraw( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteWithdrawParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( - reserveCache.nextLiquidityIndex - ); - - uint256 amountToWithdraw = params.amount; - - if (params.amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - - ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); - - reserve.updateInterestRates(reserveCache, params.asset, 0, amountToWithdraw); - - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - params.to, - amountToWithdraw, - reserveCache.nextLiquidityIndex - ); - - if (userConfig.isUsingAsCollateral(reserve.id)) { - if (userConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - params.asset, - msg.sender, - params.reservesCount, - params.oracle, - params.userEModeCategory - ); - } - - if (amountToWithdraw == userBalance) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - } - - emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); - - return amountToWithdraw; - } - - /** - * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid - * collateralization constraints violation. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as - * collateral. - * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param params The additional parameters needed to execute the finalizeTransfer function - */ - function executeFinalizeTransfer( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.FinalizeTransferParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - - ValidationLogic.validateTransfer(reserve); - - uint256 reserveId = reserve.id; - - if (params.from != params.to && params.amount != 0) { - DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; - - if (fromConfig.isUsingAsCollateral(reserveId)) { - if (fromConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - usersConfig[params.from], - params.asset, - params.from, - params.reservesCount, - params.oracle, - params.fromEModeCategory - ); - } - if (params.balanceFromBefore == params.amount) { - fromConfig.setUsingAsCollateral(reserveId, false); - emit ReserveUsedAsCollateralDisabled(params.asset, params.from); - } - } - - if (params.balanceToBefore == 0) { - DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; - if ( - ValidationLogic.validateUseAsCollateral( - reservesData, - reservesList, - toConfig, - reserve.configuration - ) - ) { - toConfig.setUsingAsCollateral(reserveId, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.to); - } - } - } - } - - /** - * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as - * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor - * checks to ensure collateralization. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. - * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The users configuration mapping that track the supplied/borrowed assets - * @param asset The address of the asset being configured as collateral - * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise - * @param reservesCount The number of initialized reserves - * @param priceOracle The address of the price oracle - * @param userEModeCategory The eMode category chosen by the user - */ - function executeUseReserveAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - bool useAsCollateral, - uint256 reservesCount, - address priceOracle, - uint8 userEModeCategory - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); - - ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); - - if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; - - if (useAsCollateral) { - require( - ValidationLogic.validateUseAsCollateral(reservesData, reservesList, userConfig, reserveCache.reserveConfiguration), - Errors.USER_IN_ISOLATION_MODE - ); - - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, msg.sender); - } else { - userConfig.setUsingAsCollateral(reserve.id, false); - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - asset, - msg.sender, - reservesCount, - priceOracle, - userEModeCategory - ); - - emit ReserveUsedAsCollateralDisabled(asset, msg.sender); - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index fb2eda0c..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,726 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IStableDebtToken} from '../../../interfaces/IStableDebtToken.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply(DataTypes.ReserveCache memory reserveCache, uint256 amount) - internal - view - { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , , bool isPaused) = reserveCache - .reserveConfiguration - .getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - (IAToken(reserveCache.aTokenAddress).scaledTotalSupply().rayMul( - reserveCache.nextLiquidityIndex - ) + amount) <= - supplyCap * (10**reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address eModePriceSource; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool stableRateBorrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - ( - vars.isActive, - vars.isFrozen, - vars.borrowingEnabled, - vars.stableRateBorrowingEnabled, - vars.isPaused - ) = params.reserveCache.reserveConfiguration.getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE || - params.interestRateMode == DataTypes.InterestRateMode.STABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10**vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = - params.reserveCache.currTotalStableDebt + - vars.totalSupplyVariableDebt + - params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / 10**(vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - params.reserveCache.reserveConfiguration.getEModeCategory() == params.userEModeCategory, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - vars.eModePriceSource = eModeCategories[params.userEModeCategory].priceSource; - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice( - vars.eModePriceSource != address(0) ? vars.eModePriceSource : params.asset - ) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - /** - * Following conditions need to be met if the user is borrowing at a stable rate: - * 1. Reserve must be enabled for stable rate borrowing - * 2. Users cannot borrow from the reserve if their collateral is (mostly) the same currency - * they are borrowing, to prevent abuses. - * 3. Users will be able to borrow only a portion of the total available liquidity - **/ - - if (params.interestRateMode == DataTypes.InterestRateMode.STABLE) { - //check if the borrow mode is stable and if stable rate borrowing is enabled on this reserve - - require(vars.stableRateBorrowingEnabled, Errors.STABLE_BORROWING_NOT_ENABLED); - - require( - !params.userConfig.isUsingAsCollateral(reservesData[params.asset].id) || - params.reserveCache.reserveConfiguration.getLtv() == 0 || - params.amount > IERC20(params.reserveCache.aTokenAddress).balanceOf(params.userAddress), - Errors.COLLATERAL_SAME_AS_BORROWING_CURRENCY - ); - - vars.availableLiquidity = IERC20(params.asset).balanceOf(params.reserveCache.aTokenAddress); - - //calculate the max available loan size in stable rate mode as a percentage of the - //available liquidity - uint256 maxLoanSizeStable = vars.availableLiquidity.percentMul(params.maxStableLoanPercent); - - require(params.amount <= maxLoanSizeStable, Errors.AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE); - } - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param interestRateMode The interest rate mode of the debt being repaid - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param stableDebt The borrow balance of the user - * @param variableDebt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 stableDebt, - uint256 variableDebt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - uint256 variableDebtPreviousIndex = IScaledBalanceToken(reserveCache.variableDebtTokenAddress) - .getPreviousIndex(onBehalfOf); - - uint40 stableRatePreviousTimestamp = IStableDebtToken(reserveCache.stableDebtTokenAddress) - .getUserLastUpdated(onBehalfOf); - - require( - (stableRatePreviousTimestamp < uint40(block.timestamp) && - interestRateMode == DataTypes.InterestRateMode.STABLE) || - (variableDebtPreviousIndex < reserveCache.nextVariableBorrowIndex && - interestRateMode == DataTypes.InterestRateMode.VARIABLE), - Errors.SAME_BLOCK_BORROW_REPAY - ); - - require( - (stableDebt != 0 && interestRateMode == DataTypes.InterestRateMode.STABLE) || - (variableDebt != 0 && interestRateMode == DataTypes.InterestRateMode.VARIABLE), - Errors.NO_DEBT_OF_SELECTED_TYPE - ); - } - - /** - * @notice Validates a swap of borrow rate mode. - * @param reserve The reserve state on which the user is swapping the rate - * @param reserveCache The cached data of the reserve - * @param userConfig The user reserves configuration - * @param stableDebt The stable debt of the user - * @param variableDebt The variable debt of the user - * @param currentRateMode The rate mode of the debt being swapped - */ - function validateSwapRateMode( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - DataTypes.UserConfigurationMap storage userConfig, - uint256 stableDebt, - uint256 variableDebt, - DataTypes.InterestRateMode currentRateMode - ) internal view { - (bool isActive, bool isFrozen, , bool stableRateEnabled, bool isPaused) = reserveCache - .reserveConfiguration - .getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - - if (currentRateMode == DataTypes.InterestRateMode.STABLE) { - require(stableDebt != 0, Errors.NO_OUTSTANDING_STABLE_DEBT); - } else if (currentRateMode == DataTypes.InterestRateMode.VARIABLE) { - require(variableDebt != 0, Errors.NO_OUTSTANDING_VARIABLE_DEBT); - /** - * user wants to swap to stable, before swapping we need to ensure that - * 1. stable borrow rate is enabled on the reserve - * 2. user is not trying to abuse the reserve by supplying - * more collateral than he is borrowing, artificially lowering - * the interest rate, borrowing at variable, and switching to stable - **/ - require(stableRateEnabled, Errors.STABLE_BORROWING_NOT_ENABLED); - - require( - !userConfig.isUsingAsCollateral(reserve.id) || - reserveCache.reserveConfiguration.getLtv() == 0 || - stableDebt + variableDebt > IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender), - Errors.COLLATERAL_SAME_AS_BORROWING_CURRENCY - ); - } else { - revert(Errors.INVALID_INTEREST_RATE_MODE_SELECTED); - } - } - - /** - * @notice Validates a stable borrow rate rebalance action. - * @dev Rebalancing is accepted when depositors are earning <= 90% of their earnings in pure supply/demand market (variable rate only) - * For this to be the case, there has to be quite large stable debt with an interest rate below the current variable rate. - * @param reserve The reserve state on which the user is getting rebalanced - * @param reserveCache The cached state of the reserve - * @param reserveAddress The address of the reserve - */ - function validateRebalanceStableBorrowRate( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress - ) internal view { - (bool isActive, , , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - uint256 totalDebt = IERC20(reserveCache.stableDebtTokenAddress).totalSupply() + - IERC20(reserveCache.variableDebtTokenAddress).totalSupply(); - - (uint256 liquidityRateVariableDebtOnly, , ) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: 0, - liquidityTaken: 0, - totalStableDebt: 0, - totalVariableDebt: totalDebt, - averageStableBorrowRate: 0, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - aToken: reserveCache.aTokenAddress - }) - ); - - require( - reserveCache.currLiquidityRate <= - liquidityRateVariableDebtOnly.percentMul(REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD), - Errors.INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET - ); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - DataTypes.ReserveConfigurationMap memory configuration = reservesData[assets[i]] - .configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple(DataTypes.ReserveData storage reserve) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - **/ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require(IERC20(reserve.stableDebtTokenAddress).totalSupply() == 0, Errors.STABLE_DEBT_NOT_ZERO); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require(IERC20(reserve.aTokenAddress).totalSupply() == 0, Errors.ATOKEN_SUPPLY_NOT_ZERO); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - **/ - function validateSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategories[categoryId].liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - //eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - DataTypes.ReserveConfigurationMap memory configuration = reservesData[reservesList[i]] - .configuration; - require( - configuration.getEModeCategory() == categoryId, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - } - } - } - } - } - - /** - * @notice Validates if an asset can be activated as collateral in the following actions: supply, transfer, - * set as collateral, mint unbacked, and liquidate - * @dev This is used to ensure that the constraints for isolated assets are respected by all the actions that - * generate transfers of aTokens - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - **/ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index bd6e0838..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,101 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - **/ - function calculateLinearInterest(uint256 rate, uint40 lastUpdateTimestamp) - internal - view - returns (uint256) - { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - **/ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - **/ - function calculateCompoundedInterest(uint256 rate, uint40 lastUpdateTimestamp) - internal - view - returns (uint256) - { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index 5306105b..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - **/ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - **/ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - **/ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index dbe1a40d..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - **/ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - **/ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - **/ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - **/ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - **/ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - **/ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - **/ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol deleted file mode 100644 index 61de06a3..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -library ConfiguratorInputTypes { - struct InitReserveInput { - address aTokenImpl; - address stableDebtTokenImpl; - address variableDebtTokenImpl; - uint8 underlyingAssetDecimals; - address interestRateStrategyAddress; - address underlyingAsset; - address treasury; - address incentivesController; - string aTokenName; - string aTokenSymbol; - string variableDebtTokenName; - string variableDebtTokenSymbol; - string stableDebtTokenName; - string stableDebtTokenSymbol; - bytes params; - } - - struct UpdateATokenInput { - address asset; - address treasury; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } - - struct UpdateDebtTokenInput { - address asset; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 7113a0a5..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,268 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -library DataTypes { - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - //the current stable borrow rate. Expressed in ray - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - //stableDebtToken address - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62-63: reserved - //bit 64-79: reserve factor - //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167 liquidation protocol fee - //bit 168-175 eMode category - //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // each eMode category may or may not have a custom oracle to override the individual assets price oracles - address priceSource; - string label; - } - - enum InterestRateMode { - NONE, - STABLE, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currPrincipalStableDebt; - uint256 currAvgStableBorrowRate; - uint256 currTotalStableDebt; - uint256 nextAvgStableBorrowRate; - uint256 nextTotalStableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address stableDebtTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - uint40 stableDebtLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address addressesProvider; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 maxStableLoanPercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalStableDebt; - uint256 totalVariableDebt; - uint256 averageStableBorrowRate; - uint256 reserveFactor; - address reserve; - address aToken; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address stableDebtAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol deleted file mode 100644 index 7d082a96..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol +++ /dev/null @@ -1,299 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {WadRayMath} from '../libraries/math/WadRayMath.sol'; -import {PercentageMath} from '../libraries/math/PercentageMath.sol'; -import {DataTypes} from '../libraries/types/DataTypes.sol'; -import {IReserveInterestRateStrategy} from '../../interfaces/IReserveInterestRateStrategy.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; - -/** - * @title DefaultReserveInterestRateStrategy contract - * @author Aave - * @notice Implements the calculation of the interest rates depending on the reserve state - * @dev The model of interest rate is based on 2 slopes, one before the `OPTIMAL_USAGE_RATIO` - * point of usage and another from that one to 100%. - * - An instance of this same contract, can't be used across different Aave markets, due to the caching - * of the PoolAddressesProvider - **/ -contract DefaultReserveInterestRateStrategy is IReserveInterestRateStrategy { - using WadRayMath for uint256; - using PercentageMath for uint256; - - /** - * @dev This constant represents the usage ratio at which the pool aims to obtain most competitive borrow rates. - * Expressed in ray - **/ - uint256 public immutable OPTIMAL_USAGE_RATIO; - - /** - * @dev This constant represents the optimal stable debt to total debt ratio of the reserve. - * Expressed in ray - */ - uint256 public immutable OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO; - - /** - * @dev This constant represents the excess usage ratio above the optimal. It's always equal to - * 1-optimal usage ratio. Added as a constant here for gas optimizations. - * Expressed in ray - **/ - uint256 public immutable MAX_EXCESS_USAGE_RATIO; - - /** - * @dev This constant represents the excess stable debt ratio above the optimal. It's always equal to - * 1-optimal stable to total debt ratio. Added as a constant here for gas optimizations. - * Expressed in ray - **/ - uint256 public immutable MAX_EXCESS_STABLE_TO_TOTAL_DEBT_RATIO; - - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - // Base variable borrow rate when usage rate = 0. Expressed in ray - uint256 internal immutable _baseVariableBorrowRate; - - // Slope of the variable interest curve when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO. Expressed in ray - uint256 internal immutable _variableRateSlope1; - - // Slope of the variable interest curve when usage ratio > OPTIMAL_USAGE_RATIO. Expressed in ray - uint256 internal immutable _variableRateSlope2; - - // Slope of the stable interest curve when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO. Expressed in ray - uint256 internal immutable _stableRateSlope1; - - // Slope of the stable interest curve when usage ratio > OPTIMAL_USAGE_RATIO. Expressed in ray - uint256 internal immutable _stableRateSlope2; - - // Premium on top of `_variableRateSlope1` for base stable borrowing rate - uint256 internal immutable _baseStableRateOffset; - - // Additional premium applied to stable rate when stable debt surpass `OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO` - uint256 internal immutable _stableRateExcessOffset; - - /** - * @dev Constructor. - * @param provider The address of the PoolAddressesProvider contract - * @param optimalUsageRatio The optimal usage ratio - * @param baseVariableBorrowRate The base variable borrow rate - * @param variableRateSlope1 The variable rate slope below optimal usage ratio - * @param variableRateSlope2 The variable rate slope above optimal usage ratio - * @param stableRateSlope1 The stable rate slope below optimal usage ratio - * @param stableRateSlope2 The stable rate slope above optimal usage ratio - * @param baseStableRateOffset The premium on top of variable rate for base stable borrowing rate - * @param stableRateExcessOffset The premium on top of stable rate when there stable debt surpass the threshold - * @param optimalStableToTotalDebtRatio The optimal stable debt to total debt ratio of the reserve - */ - constructor( - IPoolAddressesProvider provider, - uint256 optimalUsageRatio, - uint256 baseVariableBorrowRate, - uint256 variableRateSlope1, - uint256 variableRateSlope2, - uint256 stableRateSlope1, - uint256 stableRateSlope2, - uint256 baseStableRateOffset, - uint256 stableRateExcessOffset, - uint256 optimalStableToTotalDebtRatio - ) { - require(WadRayMath.RAY >= optimalUsageRatio, Errors.INVALID_OPTIMAL_USAGE_RATIO); - require( - WadRayMath.RAY >= optimalStableToTotalDebtRatio, - Errors.INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO - ); - OPTIMAL_USAGE_RATIO = optimalUsageRatio; - MAX_EXCESS_USAGE_RATIO = WadRayMath.RAY - optimalUsageRatio; - OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = optimalStableToTotalDebtRatio; - MAX_EXCESS_STABLE_TO_TOTAL_DEBT_RATIO = WadRayMath.RAY - optimalStableToTotalDebtRatio; - ADDRESSES_PROVIDER = provider; - _baseVariableBorrowRate = baseVariableBorrowRate; - _variableRateSlope1 = variableRateSlope1; - _variableRateSlope2 = variableRateSlope2; - _stableRateSlope1 = stableRateSlope1; - _stableRateSlope2 = stableRateSlope2; - _baseStableRateOffset = baseStableRateOffset; - _stableRateExcessOffset = stableRateExcessOffset; - } - - /** - * @notice Returns the variable rate slope below optimal usage ratio - * @dev Its the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO - * @return The variable rate slope - **/ - function getVariableRateSlope1() external view returns (uint256) { - return _variableRateSlope1; - } - - /** - * @notice Returns the variable rate slope above optimal usage ratio - * @dev Its the variable rate when usage ratio > OPTIMAL_USAGE_RATIO - * @return The variable rate slope - **/ - function getVariableRateSlope2() external view returns (uint256) { - return _variableRateSlope2; - } - - /** - * @notice Returns the stable rate slope below optimal usage ratio - * @dev Its the stable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO - * @return The stable rate slope - **/ - function getStableRateSlope1() external view returns (uint256) { - return _stableRateSlope1; - } - - /** - * @notice Returns the stable rate slope above optimal usage ratio - * @dev Its the variable rate when usage ratio > OPTIMAL_USAGE_RATIO - * @return The stable rate slope - **/ - function getStableRateSlope2() external view returns (uint256) { - return _stableRateSlope2; - } - - /** - * @notice Returns the stable rate excess offset - * @dev An additional premium applied to the stable when stable debt > OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO - * @return The stable rate excess offset - */ - function getStableRateExcessOffset() external view returns (uint256) { - return _stableRateExcessOffset; - } - - /** - * @notice Returns the base stable borrow rate - * @return The base stable borrow rate - **/ - function getBaseStableBorrowRate() public view returns (uint256) { - return _variableRateSlope1 + _baseStableRateOffset; - } - - /// @inheritdoc IReserveInterestRateStrategy - function getBaseVariableBorrowRate() external view override returns (uint256) { - return _baseVariableBorrowRate; - } - - /// @inheritdoc IReserveInterestRateStrategy - function getMaxVariableBorrowRate() external view override returns (uint256) { - return _baseVariableBorrowRate + _variableRateSlope1 + _variableRateSlope2; - } - - struct CalcInterestRatesLocalVars { - uint256 availableLiquidity; - uint256 totalDebt; - uint256 currentVariableBorrowRate; - uint256 currentStableBorrowRate; - uint256 currentLiquidityRate; - uint256 borrowUsageRatio; - uint256 supplyUsageRatio; - uint256 stableToTotalDebtRatio; - uint256 availableLiquidityPlusDebt; - } - - /// @inheritdoc IReserveInterestRateStrategy - function calculateInterestRates(DataTypes.CalculateInterestRatesParams calldata params) - external - view - override - returns ( - uint256, - uint256, - uint256 - ) - { - CalcInterestRatesLocalVars memory vars; - - vars.totalDebt = params.totalStableDebt + params.totalVariableDebt; - - vars.currentLiquidityRate = 0; - vars.currentVariableBorrowRate = _baseVariableBorrowRate; - vars.currentStableBorrowRate = getBaseStableBorrowRate(); - - if (vars.totalDebt != 0) { - vars.stableToTotalDebtRatio = params.totalStableDebt.rayDiv(vars.totalDebt); - vars.availableLiquidity = - IERC20(params.reserve).balanceOf(params.aToken) + - params.liquidityAdded - - params.liquidityTaken; - - vars.availableLiquidityPlusDebt = vars.availableLiquidity + vars.totalDebt; - vars.borrowUsageRatio = vars.totalDebt.rayDiv(vars.availableLiquidityPlusDebt); - vars.supplyUsageRatio = vars.totalDebt.rayDiv( - vars.availableLiquidityPlusDebt + params.unbacked - ); - } - - if (vars.borrowUsageRatio > OPTIMAL_USAGE_RATIO) { - uint256 excessBorrowUsageRatio = (vars.borrowUsageRatio - OPTIMAL_USAGE_RATIO).rayDiv( - MAX_EXCESS_USAGE_RATIO - ); - - vars.currentStableBorrowRate += - _stableRateSlope1 + - _stableRateSlope2.rayMul(excessBorrowUsageRatio); - - vars.currentVariableBorrowRate += - _variableRateSlope1 + - _variableRateSlope2.rayMul(excessBorrowUsageRatio); - } else { - vars.currentStableBorrowRate += _stableRateSlope1.rayMul(vars.borrowUsageRatio).rayDiv( - OPTIMAL_USAGE_RATIO - ); - - vars.currentVariableBorrowRate += _variableRateSlope1.rayMul(vars.borrowUsageRatio).rayDiv( - OPTIMAL_USAGE_RATIO - ); - } - - if (vars.stableToTotalDebtRatio > OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO) { - uint256 excessStableDebtRatio = (vars.stableToTotalDebtRatio - - OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO).rayDiv(MAX_EXCESS_STABLE_TO_TOTAL_DEBT_RATIO); - vars.currentStableBorrowRate += _stableRateExcessOffset.rayMul(excessStableDebtRatio); - } - - vars.currentLiquidityRate = _getOverallBorrowRate( - params.totalStableDebt, - params.totalVariableDebt, - vars.currentVariableBorrowRate, - params.averageStableBorrowRate - ).rayMul(vars.supplyUsageRatio).percentMul( - PercentageMath.PERCENTAGE_FACTOR - params.reserveFactor - ); - - return ( - vars.currentLiquidityRate, - vars.currentStableBorrowRate, - vars.currentVariableBorrowRate - ); - } - - /** - * @dev Calculates the overall borrow rate as the weighted average between the total variable debt and total stable - * debt - * @param totalStableDebt The total borrowed from the reserve at a stable rate - * @param totalVariableDebt The total borrowed from the reserve at a variable rate - * @param currentVariableBorrowRate The current variable borrow rate of the reserve - * @param currentAverageStableBorrowRate The current weighted average of all the stable rate loans - * @return The weighted averaged borrow rate - **/ - function _getOverallBorrowRate( - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 currentVariableBorrowRate, - uint256 currentAverageStableBorrowRate - ) internal pure returns (uint256) { - uint256 totalDebt = totalStableDebt + totalVariableDebt; - - if (totalDebt == 0) return 0; - - uint256 weightedVariableRate = totalVariableDebt.wadToRay().rayMul(currentVariableBorrowRate); - - uint256 weightedStableRate = totalStableDebt.wadToRay().rayMul(currentAverageStableBorrowRate); - - uint256 overallBorrowRate = (weightedVariableRate + weightedStableRate).rayDiv( - totalDebt.wadToRay() - ); - - return overallBorrowRate; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/L2Pool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/L2Pool.sol deleted file mode 100644 index 0e2b5a1c..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/L2Pool.sol +++ /dev/null @@ -1,135 +0,0 @@ -pragma solidity ^0.8.10; - -import {Pool} from './Pool.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {IL2Pool} from '../../interfaces/IL2Pool.sol'; -import {CalldataLogic} from '../libraries/logic/CalldataLogic.sol'; - -/** - * @title L2Pool - * @author Aave - * @notice Calldata optimized extension of the Pool contract allowing users to pass compact calldata representation - * to reduce transaction costs on rollups. - */ -contract L2Pool is Pool, IL2Pool { - /** - * @dev Constructor. - * @param provider The address of the PoolAddressesProvider contract - */ - constructor(IPoolAddressesProvider provider) Pool(provider) { - // Intentionally left blank - } - - /// @inheritdoc IL2Pool - function supply(bytes32 args) external override { - (address asset, uint256 amount, uint16 referralCode) = CalldataLogic.decodeSupplyParams( - _reservesList, - args - ); - - supply(asset, amount, msg.sender, referralCode); - } - - /// @inheritdoc IL2Pool - function supplyWithPermit( - bytes32 args, - bytes32 r, - bytes32 s - ) external override { - (address asset, uint256 amount, uint16 referralCode, uint256 deadline, uint8 v) = CalldataLogic - .decodeSupplyWithPermitParams(_reservesList, args); - - supplyWithPermit(asset, amount, msg.sender, referralCode, deadline, v, r, s); - } - - /// @inheritdoc IL2Pool - function withdraw(bytes32 args) external override { - (address asset, uint256 amount) = CalldataLogic.decodeWithdrawParams(_reservesList, args); - - withdraw(asset, amount, msg.sender); - } - - /// @inheritdoc IL2Pool - function borrow(bytes32 args) external override { - (address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode) = CalldataLogic - .decodeBorrowParams(_reservesList, args); - - borrow(asset, amount, interestRateMode, referralCode, msg.sender); - } - - /// @inheritdoc IL2Pool - function repay(bytes32 args) external override returns (uint256) { - (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( - _reservesList, - args - ); - - return repay(asset, amount, interestRateMode, msg.sender); - } - - /// @inheritdoc IL2Pool - function repayWithPermit( - bytes32 args, - bytes32 r, - bytes32 s - ) external override returns (uint256) { - ( - address asset, - uint256 amount, - uint256 interestRateMode, - uint256 deadline, - uint8 v - ) = CalldataLogic.decodeRepayWithPermitParams(_reservesList, args); - - return repayWithPermit(asset, amount, interestRateMode, msg.sender, deadline, v, r, s); - } - - /// @inheritdoc IL2Pool - function repayWithATokens(bytes32 args) external override returns (uint256) { - (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( - _reservesList, - args - ); - - return repayWithATokens(asset, amount, interestRateMode); - } - - /// @inheritdoc IL2Pool - function swapBorrowRateMode(bytes32 args) external override { - (address asset, uint256 interestRateMode) = CalldataLogic.decodeSwapBorrowRateModeParams( - _reservesList, - args - ); - swapBorrowRateMode(asset, interestRateMode); - } - - /// @inheritdoc IL2Pool - function rebalanceStableBorrowRate(bytes32 args) external override { - (address asset, address user) = CalldataLogic.decodeRebalanceStableBorrowRateParams( - _reservesList, - args - ); - rebalanceStableBorrowRate(asset, user); - } - - /// @inheritdoc IL2Pool - function setUserUseReserveAsCollateral(bytes32 args) external override { - (address asset, bool useAsCollateral) = CalldataLogic.decodeSetUserUseReserveAsCollateralParams( - _reservesList, - args - ); - setUserUseReserveAsCollateral(asset, useAsCollateral); - } - - /// @inheritdoc IL2Pool - function liquidationCall(bytes32 args1, bytes32 args2) external override { - ( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) = CalldataLogic.decodeLiquidationCallParams(_reservesList, args1, args2); - liquidationCall(collateralAsset, debtAsset, user, debtToCover, receiveAToken); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/Pool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/Pool.sol deleted file mode 100644 index b89b3b60..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/Pool.sol +++ /dev/null @@ -1,773 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {VersionedInitializable} from '../libraries/aave-upgradeability/VersionedInitializable.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; -import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; -import {PoolLogic} from '../libraries/logic/PoolLogic.sol'; -import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; -import {EModeLogic} from '../libraries/logic/EModeLogic.sol'; -import {SupplyLogic} from '../libraries/logic/SupplyLogic.sol'; -import {FlashLoanLogic} from '../libraries/logic/FlashLoanLogic.sol'; -import {BorrowLogic} from '../libraries/logic/BorrowLogic.sol'; -import {LiquidationLogic} from '../libraries/logic/LiquidationLogic.sol'; -import {DataTypes} from '../libraries/types/DataTypes.sol'; -import {BridgeLogic} from '../libraries/logic/BridgeLogic.sol'; -import {IERC20WithPermit} from '../../interfaces/IERC20WithPermit.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../interfaces/IPool.sol'; -import {IACLManager} from '../../interfaces/IACLManager.sol'; -import {PoolStorage} from './PoolStorage.sol'; - -/** - * @title Pool contract - * @author Aave - * @notice Main point of interaction with an Aave protocol's market - * - Users can: - * # Supply - * # Withdraw - * # Borrow - * # Repay - * # Swap their loans between variable and stable rate - * # Enable/disable their supplied assets as collateral rebalance stable rate borrow positions - * # Liquidate positions - * # Execute Flash Loans - * @dev To be covered by a proxy contract, owned by the PoolAddressesProvider of the specific market - * @dev All admin functions are callable by the PoolConfigurator contract defined also in the - * PoolAddressesProvider - **/ -contract Pool is VersionedInitializable, PoolStorage, IPool { - using ReserveLogic for DataTypes.ReserveData; - - uint256 public constant POOL_REVISION = 0x1; - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @dev Only pool configurator can call functions marked by this modifier. - **/ - modifier onlyPoolConfigurator() { - _onlyPoolConfigurator(); - _; - } - - /** - * @dev Only pool admin can call functions marked by this modifier. - **/ - modifier onlyPoolAdmin() { - _onlyPoolAdmin(); - _; - } - - /** - * @dev Only bridge can call functions marked by this modifier. - **/ - modifier onlyBridge() { - _onlyBridge(); - _; - } - - function _onlyPoolConfigurator() internal view virtual { - require( - ADDRESSES_PROVIDER.getPoolConfigurator() == msg.sender, - Errors.CALLER_NOT_POOL_CONFIGURATOR - ); - } - - function _onlyPoolAdmin() internal view virtual { - require( - IACLManager(ADDRESSES_PROVIDER.getACLManager()).isPoolAdmin(msg.sender), - Errors.CALLER_NOT_POOL_ADMIN - ); - } - - function _onlyBridge() internal view virtual { - require( - IACLManager(ADDRESSES_PROVIDER.getACLManager()).isBridge(msg.sender), - Errors.CALLER_NOT_BRIDGE - ); - } - - function getRevision() internal pure virtual override returns (uint256) { - return POOL_REVISION; - } - - /** - * @dev Constructor. - * @param provider The address of the PoolAddressesProvider contract - */ - constructor(IPoolAddressesProvider provider) { - ADDRESSES_PROVIDER = provider; - } - - /** - * @notice Initializes the Pool. - * @dev Function is invoked by the proxy contract when the Pool contract is added to the - * PoolAddressesProvider of the market. - * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations - * @param provider The address of the PoolAddressesProvider - **/ - function initialize(IPoolAddressesProvider provider) external virtual initializer { - require(provider == ADDRESSES_PROVIDER, Errors.INVALID_ADDRESSES_PROVIDER); - _maxStableRateBorrowSizePercent = 0.25e4; - _flashLoanPremiumTotal = 0.0009e4; - _flashLoanPremiumToProtocol = 0; - } - - /// @inheritdoc IPool - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external virtual override onlyBridge { - BridgeLogic.executeMintUnbacked( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - asset, - amount, - onBehalfOf, - referralCode - ); - } - - /// @inheritdoc IPool - function backUnbacked( - address asset, - uint256 amount, - uint256 fee - ) external virtual override onlyBridge { - BridgeLogic.executeBackUnbacked(_reserves[asset], asset, amount, fee, _bridgeProtocolFee); - } - - /// @inheritdoc IPool - function supply( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) public virtual override { - SupplyLogic.executeSupply( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteSupplyParams({ - asset: asset, - amount: amount, - onBehalfOf: onBehalfOf, - referralCode: referralCode - }) - ); - } - - /// @inheritdoc IPool - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) public virtual override { - IERC20WithPermit(asset).permit( - msg.sender, - address(this), - amount, - deadline, - permitV, - permitR, - permitS - ); - SupplyLogic.executeSupply( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteSupplyParams({ - asset: asset, - amount: amount, - onBehalfOf: onBehalfOf, - referralCode: referralCode - }) - ); - } - - /// @inheritdoc IPool - function withdraw( - address asset, - uint256 amount, - address to - ) public virtual override returns (uint256) { - return - SupplyLogic.executeWithdraw( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[msg.sender], - DataTypes.ExecuteWithdrawParams({ - asset: asset, - amount: amount, - to: to, - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[msg.sender] - }) - ); - } - - /// @inheritdoc IPool - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) public virtual override { - BorrowLogic.executeBorrow( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[onBehalfOf], - DataTypes.ExecuteBorrowParams({ - asset: asset, - user: msg.sender, - onBehalfOf: onBehalfOf, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - referralCode: referralCode, - releaseUnderlying: true, - maxStableRateBorrowSizePercent: _maxStableRateBorrowSizePercent, - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[onBehalfOf], - priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() - }) - ); - } - - /// @inheritdoc IPool - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) public virtual override returns (uint256) { - return - BorrowLogic.executeRepay( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteRepayParams({ - asset: asset, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - onBehalfOf: onBehalfOf, - useATokens: false - }) - ); - } - - /// @inheritdoc IPool - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) public virtual override returns (uint256) { - { - IERC20WithPermit(asset).permit( - msg.sender, - address(this), - amount, - deadline, - permitV, - permitR, - permitS - ); - } - { - DataTypes.ExecuteRepayParams memory params = DataTypes.ExecuteRepayParams({ - asset: asset, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - onBehalfOf: onBehalfOf, - useATokens: false - }); - return BorrowLogic.executeRepay(_reserves, _reservesList, _usersConfig[onBehalfOf], params); - } - } - - /// @inheritdoc IPool - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) public virtual override returns (uint256) { - return - BorrowLogic.executeRepay( - _reserves, - _reservesList, - _usersConfig[msg.sender], - DataTypes.ExecuteRepayParams({ - asset: asset, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - onBehalfOf: msg.sender, - useATokens: true - }) - ); - } - - /// @inheritdoc IPool - function swapBorrowRateMode(address asset, uint256 interestRateMode) public virtual override { - BorrowLogic.executeSwapBorrowRateMode( - _reserves[asset], - _usersConfig[msg.sender], - asset, - DataTypes.InterestRateMode(interestRateMode) - ); - } - - /// @inheritdoc IPool - function rebalanceStableBorrowRate(address asset, address user) public virtual override { - BorrowLogic.executeRebalanceStableBorrowRate(_reserves[asset], asset, user); - } - - /// @inheritdoc IPool - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) - public - virtual - override - { - SupplyLogic.executeUseReserveAsCollateral( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[msg.sender], - asset, - useAsCollateral, - _reservesCount, - ADDRESSES_PROVIDER.getPriceOracle(), - _usersEModeCategory[msg.sender] - ); - } - - /// @inheritdoc IPool - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) public virtual override { - LiquidationLogic.executeLiquidationCall( - _reserves, - _reservesList, - _usersConfig, - _eModeCategories, - DataTypes.ExecuteLiquidationCallParams({ - reservesCount: _reservesCount, - debtToCover: debtToCover, - collateralAsset: collateralAsset, - debtAsset: debtAsset, - user: user, - receiveAToken: receiveAToken, - priceOracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[user], - priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() - }) - ); - } - - /// @inheritdoc IPool - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) public virtual override { - DataTypes.FlashloanParams memory flashParams = DataTypes.FlashloanParams({ - receiverAddress: receiverAddress, - assets: assets, - amounts: amounts, - interestRateModes: interestRateModes, - onBehalfOf: onBehalfOf, - params: params, - referralCode: referralCode, - flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, - flashLoanPremiumTotal: _flashLoanPremiumTotal, - maxStableRateBorrowSizePercent: _maxStableRateBorrowSizePercent, - reservesCount: _reservesCount, - addressesProvider: address(ADDRESSES_PROVIDER), - userEModeCategory: _usersEModeCategory[onBehalfOf], - isAuthorizedFlashBorrower: IACLManager(ADDRESSES_PROVIDER.getACLManager()).isFlashBorrower( - msg.sender - ) - }); - - FlashLoanLogic.executeFlashLoan( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[onBehalfOf], - flashParams - ); - } - - /// @inheritdoc IPool - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) public virtual override { - DataTypes.FlashloanSimpleParams memory flashParams = DataTypes.FlashloanSimpleParams({ - receiverAddress: receiverAddress, - asset: asset, - amount: amount, - params: params, - referralCode: referralCode, - flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, - flashLoanPremiumTotal: _flashLoanPremiumTotal - }); - FlashLoanLogic.executeFlashLoanSimple(_reserves[asset], flashParams); - } - - /// @inheritdoc IPool - function mintToTreasury(address[] calldata assets) external virtual override { - PoolLogic.executeMintToTreasury(_reserves, assets); - } - - /// @inheritdoc IPool - function getReserveData(address asset) - external - view - virtual - override - returns (DataTypes.ReserveData memory) - { - return _reserves[asset]; - } - - /// @inheritdoc IPool - function getUserAccountData(address user) - external - view - virtual - override - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ) - { - return - PoolLogic.executeGetUserAccountData( - _reserves, - _reservesList, - _eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: _usersConfig[user], - reservesCount: _reservesCount, - user: user, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[user] - }) - ); - } - - /// @inheritdoc IPool - function getConfiguration(address asset) - external - view - virtual - override - returns (DataTypes.ReserveConfigurationMap memory) - { - return _reserves[asset].configuration; - } - - /// @inheritdoc IPool - function getUserConfiguration(address user) - external - view - virtual - override - returns (DataTypes.UserConfigurationMap memory) - { - return _usersConfig[user]; - } - - /// @inheritdoc IPool - function getReserveNormalizedIncome(address asset) - external - view - virtual - override - returns (uint256) - { - return _reserves[asset].getNormalizedIncome(); - } - - /// @inheritdoc IPool - function getReserveNormalizedVariableDebt(address asset) - external - view - virtual - override - returns (uint256) - { - return _reserves[asset].getNormalizedDebt(); - } - - /// @inheritdoc IPool - function getReservesList() external view virtual override returns (address[] memory) { - uint256 reservesListCount = _reservesCount; - uint256 droppedReservesCount = 0; - address[] memory reservesList = new address[](reservesListCount); - - for (uint256 i = 0; i < reservesListCount; i++) { - if (_reservesList[i] != address(0)) { - reservesList[i - droppedReservesCount] = _reservesList[i]; - } else { - droppedReservesCount++; - } - } - - // Reduces the length of the reserves array by `droppedReservesCount` - assembly { - mstore(reservesList, sub(reservesListCount, droppedReservesCount)) - } - return reservesList; - } - - /// @inheritdoc IPool - function getReserveAddressById(uint16 id) external view returns (address) { - return _reservesList[id]; - } - - /// @inheritdoc IPool - function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() public view virtual override returns (uint256) { - return _maxStableRateBorrowSizePercent; - } - - /// @inheritdoc IPool - function BRIDGE_PROTOCOL_FEE() public view virtual override returns (uint256) { - return _bridgeProtocolFee; - } - - /// @inheritdoc IPool - function FLASHLOAN_PREMIUM_TOTAL() public view virtual override returns (uint128) { - return _flashLoanPremiumTotal; - } - - /// @inheritdoc IPool - function FLASHLOAN_PREMIUM_TO_PROTOCOL() public view virtual override returns (uint128) { - return _flashLoanPremiumToProtocol; - } - - /// @inheritdoc IPool - function MAX_NUMBER_RESERVES() public view virtual override returns (uint16) { - return ReserveConfiguration.MAX_RESERVES_COUNT; - } - - /// @inheritdoc IPool - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external virtual override { - require(msg.sender == _reserves[asset].aTokenAddress, Errors.CALLER_NOT_ATOKEN); - SupplyLogic.executeFinalizeTransfer( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig, - DataTypes.FinalizeTransferParams({ - asset: asset, - from: from, - to: to, - amount: amount, - balanceFromBefore: balanceFromBefore, - balanceToBefore: balanceToBefore, - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - fromEModeCategory: _usersEModeCategory[from] - }) - ); - } - - /// @inheritdoc IPool - function initReserve( - address asset, - address aTokenAddress, - address stableDebtAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external virtual override onlyPoolConfigurator { - if ( - PoolLogic.executeInitReserve( - _reserves, - _reservesList, - DataTypes.InitReserveParams({ - asset: asset, - aTokenAddress: aTokenAddress, - stableDebtAddress: stableDebtAddress, - variableDebtAddress: variableDebtAddress, - interestRateStrategyAddress: interestRateStrategyAddress, - reservesCount: _reservesCount, - maxNumberReserves: MAX_NUMBER_RESERVES() - }) - ) - ) { - _reservesCount++; - } - } - - /// @inheritdoc IPool - function dropReserve(address asset) external virtual override onlyPoolConfigurator { - PoolLogic.executeDropReserve(_reserves, _reservesList, asset); - } - - /// @inheritdoc IPool - function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress) - external - virtual - override - onlyPoolConfigurator - { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - _reserves[asset].interestRateStrategyAddress = rateStrategyAddress; - } - - /// @inheritdoc IPool - function setConfiguration(address asset, DataTypes.ReserveConfigurationMap calldata configuration) - external - virtual - override - onlyPoolConfigurator - { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - _reserves[asset].configuration = configuration; - } - - /// @inheritdoc IPool - function updateBridgeProtocolFee(uint256 protocolFee) - external - virtual - override - onlyPoolConfigurator - { - _bridgeProtocolFee = protocolFee; - } - - /// @inheritdoc IPool - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external virtual override onlyPoolConfigurator { - _flashLoanPremiumTotal = flashLoanPremiumTotal; - _flashLoanPremiumToProtocol = flashLoanPremiumToProtocol; - } - - /// @inheritdoc IPool - function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory category) - external - virtual - override - onlyPoolConfigurator - { - // category 0 is reserved for volatile heterogeneous assets and it's always disabled - require(id != 0, Errors.EMODE_CATEGORY_RESERVED); - _eModeCategories[id] = category; - } - - /// @inheritdoc IPool - function getEModeCategoryData(uint8 id) - external - view - virtual - override - returns (DataTypes.EModeCategory memory) - { - return _eModeCategories[id]; - } - - /// @inheritdoc IPool - function setUserEMode(uint8 categoryId) external virtual override { - EModeLogic.executeSetUserEMode( - _reserves, - _reservesList, - _eModeCategories, - _usersEModeCategory, - _usersConfig[msg.sender], - DataTypes.ExecuteSetUserEModeParams({ - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - categoryId: categoryId - }) - ); - } - - /// @inheritdoc IPool - function getUserEMode(address user) external view virtual override returns (uint256) { - return _usersEModeCategory[user]; - } - - /// @inheritdoc IPool - function resetIsolationModeTotalDebt(address asset) - external - virtual - override - onlyPoolConfigurator - { - PoolLogic.executeResetIsolationModeTotalDebt(_reserves, asset); - } - - /// @inheritdoc IPool - function rescueTokens( - address token, - address to, - uint256 amount - ) external virtual override onlyPoolAdmin { - PoolLogic.executeRescueTokens(token, to, amount); - } - - /// @inheritdoc IPool - /// @dev Deprecated: maintained for compatibility purposes - function deposit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external virtual override { - SupplyLogic.executeSupply( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteSupplyParams({ - asset: asset, - amount: amount, - onBehalfOf: onBehalfOf, - referralCode: referralCode - }) - ); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol deleted file mode 100644 index b99610c2..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol +++ /dev/null @@ -1,528 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {VersionedInitializable} from '../libraries/aave-upgradeability/VersionedInitializable.sol'; -import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; -import {PercentageMath} from '../libraries/math/PercentageMath.sol'; -import {DataTypes} from '../libraries/types/DataTypes.sol'; -import {ConfiguratorLogic} from '../libraries/logic/ConfiguratorLogic.sol'; -import {ConfiguratorInputTypes} from '../libraries/types/ConfiguratorInputTypes.sol'; -import {IPoolConfigurator} from '../../interfaces/IPoolConfigurator.sol'; -import {IPool} from '../../interfaces/IPool.sol'; -import {IACLManager} from '../../interfaces/IACLManager.sol'; -import {IPoolDataProvider} from '../../interfaces/IPoolDataProvider.sol'; - -/** - * @title PoolConfigurator - * @author Aave - * @dev Implements the configuration methods for the Aave protocol - **/ -contract PoolConfigurator is VersionedInitializable, IPoolConfigurator { - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - IPoolAddressesProvider internal _addressesProvider; - IPool internal _pool; - - /** - * @dev Only pool admin can call functions marked by this modifier. - **/ - modifier onlyPoolAdmin() { - _onlyPoolAdmin(); - _; - } - - /** - * @dev Only emergency admin can call functions marked by this modifier. - **/ - modifier onlyEmergencyAdmin() { - _onlyEmergencyAdmin(); - _; - } - - /** - * @dev Only emergency or pool admin can call functions marked by this modifier. - **/ - modifier onlyEmergencyOrPoolAdmin() { - _onlyPoolOrEmergencyAdmin(); - _; - } - - /** - * @dev Only asset listing or pool admin can call functions marked by this modifier. - **/ - modifier onlyAssetListingOrPoolAdmins() { - _onlyAssetListingOrPoolAdmins(); - _; - } - - /** - * @dev Only risk or pool admin can call functions marked by this modifier. - **/ - modifier onlyRiskOrPoolAdmins() { - _onlyRiskOrPoolAdmins(); - _; - } - - uint256 public constant CONFIGURATOR_REVISION = 0x1; - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return CONFIGURATOR_REVISION; - } - - function initialize(IPoolAddressesProvider provider) public initializer { - _addressesProvider = provider; - _pool = IPool(_addressesProvider.getPool()); - } - - /// @inheritdoc IPoolConfigurator - function initReserves(ConfiguratorInputTypes.InitReserveInput[] calldata input) - external - override - onlyAssetListingOrPoolAdmins - { - IPool cachedPool = _pool; - for (uint256 i = 0; i < input.length; i++) { - ConfiguratorLogic.executeInitReserve(cachedPool, input[i]); - } - } - - /// @inheritdoc IPoolConfigurator - function dropReserve(address asset) external override onlyPoolAdmin { - _pool.dropReserve(asset); - emit ReserveDropped(asset); - } - - /// @inheritdoc IPoolConfigurator - function updateAToken(ConfiguratorInputTypes.UpdateATokenInput calldata input) - external - override - onlyPoolAdmin - { - ConfiguratorLogic.executeUpdateAToken(_pool, input); - } - - /// @inheritdoc IPoolConfigurator - function updateStableDebtToken(ConfiguratorInputTypes.UpdateDebtTokenInput calldata input) - external - override - onlyPoolAdmin - { - ConfiguratorLogic.executeUpdateStableDebtToken(_pool, input); - } - - /// @inheritdoc IPoolConfigurator - function updateVariableDebtToken(ConfiguratorInputTypes.UpdateDebtTokenInput calldata input) - external - override - onlyPoolAdmin - { - ConfiguratorLogic.executeUpdateVariableDebtToken(_pool, input); - } - - /// @inheritdoc IPoolConfigurator - function setReserveBorrowing(address asset, bool enabled) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - if (!enabled) { - require(!currentConfig.getStableRateBorrowingEnabled(), Errors.STABLE_BORROWING_ENABLED); - } - currentConfig.setBorrowingEnabled(enabled); - _pool.setConfiguration(asset, currentConfig); - emit ReserveBorrowing(asset, enabled); - } - - /// @inheritdoc IPoolConfigurator - function configureReserveAsCollateral( - address asset, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus - ) external override onlyRiskOrPoolAdmins { - //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_RESERVE_PARAMS); - - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - if (liquidationThreshold != 0) { - //liquidation bonus must be bigger than 100.00%, otherwise the liquidator would receive less - //collateral than needed to cover the debt - require(liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_PARAMS); - - //if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment - //a loan is taken there is enough collateral available to cover the liquidation bonus - require( - liquidationThreshold.percentMul(liquidationBonus) <= PercentageMath.PERCENTAGE_FACTOR, - Errors.INVALID_RESERVE_PARAMS - ); - } else { - require(liquidationBonus == 0, Errors.INVALID_RESERVE_PARAMS); - //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 supplied - _checkNoSuppliers(asset); - } - - currentConfig.setLtv(ltv); - currentConfig.setLiquidationThreshold(liquidationThreshold); - currentConfig.setLiquidationBonus(liquidationBonus); - - _pool.setConfiguration(asset, currentConfig); - - emit CollateralConfigurationChanged(asset, ltv, liquidationThreshold, liquidationBonus); - } - - /// @inheritdoc IPoolConfigurator - function setReserveStableRateBorrowing(address asset, bool enabled) - external - override - onlyRiskOrPoolAdmins - { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - if (enabled) { - require(currentConfig.getBorrowingEnabled(), Errors.BORROWING_NOT_ENABLED); - } - currentConfig.setStableRateBorrowingEnabled(enabled); - _pool.setConfiguration(asset, currentConfig); - emit ReserveStableRateBorrowing(asset, enabled); - } - - /// @inheritdoc IPoolConfigurator - function setReserveActive(address asset, bool active) external override onlyPoolAdmin { - if (!active) _checkNoSuppliers(asset); - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setActive(active); - _pool.setConfiguration(asset, currentConfig); - emit ReserveActive(asset, active); - } - - /// @inheritdoc IPoolConfigurator - function setReserveFreeze(address asset, bool freeze) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setFrozen(freeze); - _pool.setConfiguration(asset, currentConfig); - emit ReserveFrozen(asset, freeze); - } - - /// @inheritdoc IPoolConfigurator - function setBorrowableInIsolation(address asset, bool borrowable) - external - override - onlyRiskOrPoolAdmins - { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setBorrowableInIsolation(borrowable); - _pool.setConfiguration(asset, currentConfig); - emit BorrowableInIsolationChanged(asset, borrowable); - } - - /// @inheritdoc IPoolConfigurator - function setReservePause(address asset, bool paused) public override onlyEmergencyOrPoolAdmin { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setPaused(paused); - _pool.setConfiguration(asset, currentConfig); - emit ReservePaused(asset, paused); - } - - /// @inheritdoc IPoolConfigurator - function setReserveFactor(address asset, uint256 newReserveFactor) - external - override - onlyRiskOrPoolAdmins - { - require(newReserveFactor <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldReserveFactor = currentConfig.getReserveFactor(); - currentConfig.setReserveFactor(newReserveFactor); - _pool.setConfiguration(asset, currentConfig); - emit ReserveFactorChanged(asset, oldReserveFactor, newReserveFactor); - } - - /// @inheritdoc IPoolConfigurator - function setDebtCeiling(address asset, uint256 newDebtCeiling) - external - override - onlyRiskOrPoolAdmins - { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - uint256 oldDebtCeiling = currentConfig.getDebtCeiling(); - if (oldDebtCeiling == 0) { - _checkNoSuppliers(asset); - } - currentConfig.setDebtCeiling(newDebtCeiling); - _pool.setConfiguration(asset, currentConfig); - - if (newDebtCeiling == 0) { - _pool.resetIsolationModeTotalDebt(asset); - } - - emit DebtCeilingChanged(asset, oldDebtCeiling, newDebtCeiling); - } - - /// @inheritdoc IPoolConfigurator - function setSiloedBorrowing(address asset, bool newSiloed) - external - override - onlyRiskOrPoolAdmins - { - if (newSiloed) { - _checkNoBorrowers(asset); - } - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - bool oldSiloed = currentConfig.getSiloedBorrowing(); - - currentConfig.setSiloedBorrowing(newSiloed); - - _pool.setConfiguration(asset, currentConfig); - - emit SiloedBorrowingChanged(asset, oldSiloed, newSiloed); - } - - /// @inheritdoc IPoolConfigurator - function setBorrowCap(address asset, uint256 newBorrowCap) - external - override - onlyRiskOrPoolAdmins - { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldBorrowCap = currentConfig.getBorrowCap(); - currentConfig.setBorrowCap(newBorrowCap); - _pool.setConfiguration(asset, currentConfig); - emit BorrowCapChanged(asset, oldBorrowCap, newBorrowCap); - } - - /// @inheritdoc IPoolConfigurator - function setSupplyCap(address asset, uint256 newSupplyCap) - external - override - onlyRiskOrPoolAdmins - { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldSupplyCap = currentConfig.getSupplyCap(); - currentConfig.setSupplyCap(newSupplyCap); - _pool.setConfiguration(asset, currentConfig); - emit SupplyCapChanged(asset, oldSupplyCap, newSupplyCap); - } - - /// @inheritdoc IPoolConfigurator - function setLiquidationProtocolFee(address asset, uint256 newFee) - external - override - onlyRiskOrPoolAdmins - { - require(newFee <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_LIQUIDATION_PROTOCOL_FEE); - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldFee = currentConfig.getLiquidationProtocolFee(); - currentConfig.setLiquidationProtocolFee(newFee); - _pool.setConfiguration(asset, currentConfig); - emit LiquidationProtocolFeeChanged(asset, oldFee, newFee); - } - - /// @inheritdoc IPoolConfigurator - function setEModeCategory( - uint8 categoryId, - uint16 ltv, - uint16 liquidationThreshold, - uint16 liquidationBonus, - address oracle, - string calldata label - ) external override onlyRiskOrPoolAdmins { - require(ltv != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); - require(liquidationThreshold != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); - - // 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_EMODE_CATEGORY_PARAMS); - require( - liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, - Errors.INVALID_EMODE_CATEGORY_PARAMS - ); - - // if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment - // a loan is taken there is enough collateral available to cover the liquidation bonus - require( - uint256(liquidationThreshold).percentMul(liquidationBonus) <= - PercentageMath.PERCENTAGE_FACTOR, - Errors.INVALID_EMODE_CATEGORY_PARAMS - ); - - address[] memory reserves = _pool.getReservesList(); - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(reserves[i]); - if (categoryId == currentConfig.getEModeCategory()) { - require(ltv > currentConfig.getLtv(), Errors.INVALID_EMODE_CATEGORY_PARAMS); - require( - liquidationThreshold > currentConfig.getLiquidationThreshold(), - Errors.INVALID_EMODE_CATEGORY_PARAMS - ); - } - } - - _pool.configureEModeCategory( - categoryId, - DataTypes.EModeCategory({ - ltv: ltv, - liquidationThreshold: liquidationThreshold, - liquidationBonus: liquidationBonus, - priceSource: oracle, - label: label - }) - ); - emit EModeCategoryAdded(categoryId, ltv, liquidationThreshold, liquidationBonus, oracle, label); - } - - /// @inheritdoc IPoolConfigurator - function setAssetEModeCategory(address asset, uint8 newCategoryId) - external - override - onlyRiskOrPoolAdmins - { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - if (newCategoryId != 0) { - DataTypes.EModeCategory memory categoryData = _pool.getEModeCategoryData(newCategoryId); - require( - categoryData.liquidationThreshold > currentConfig.getLiquidationThreshold(), - Errors.INVALID_EMODE_CATEGORY_ASSIGNMENT - ); - } - uint256 oldCategoryId = currentConfig.getEModeCategory(); - currentConfig.setEModeCategory(newCategoryId); - _pool.setConfiguration(asset, currentConfig); - emit EModeAssetCategoryChanged(asset, uint8(oldCategoryId), newCategoryId); - } - - /// @inheritdoc IPoolConfigurator - function setUnbackedMintCap(address asset, uint256 newUnbackedMintCap) - external - override - onlyRiskOrPoolAdmins - { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldUnbackedMintCap = currentConfig.getUnbackedMintCap(); - currentConfig.setUnbackedMintCap(newUnbackedMintCap); - _pool.setConfiguration(asset, currentConfig); - emit UnbackedMintCapChanged(asset, oldUnbackedMintCap, newUnbackedMintCap); - } - - /// @inheritdoc IPoolConfigurator - function setReserveInterestRateStrategyAddress(address asset, address newRateStrategyAddress) - external - override - onlyRiskOrPoolAdmins - { - DataTypes.ReserveData memory reserve = _pool.getReserveData(asset); - address oldRateStrategyAddress = reserve.interestRateStrategyAddress; - _pool.setReserveInterestRateStrategyAddress(asset, newRateStrategyAddress); - emit ReserveInterestRateStrategyChanged(asset, oldRateStrategyAddress, newRateStrategyAddress); - } - - /// @inheritdoc IPoolConfigurator - function setPoolPause(bool paused) external override onlyEmergencyAdmin { - address[] memory reserves = _pool.getReservesList(); - - for (uint256 i = 0; i < reserves.length; i++) { - if (reserves[i] != address(0)) { - setReservePause(reserves[i], paused); - } - } - } - - /// @inheritdoc IPoolConfigurator - function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external override onlyPoolAdmin { - require( - newBridgeProtocolFee <= PercentageMath.PERCENTAGE_FACTOR, - Errors.BRIDGE_PROTOCOL_FEE_INVALID - ); - uint256 oldBridgeProtocolFee = _pool.BRIDGE_PROTOCOL_FEE(); - _pool.updateBridgeProtocolFee(newBridgeProtocolFee); - emit BridgeProtocolFeeUpdated(oldBridgeProtocolFee, newBridgeProtocolFee); - } - - /// @inheritdoc IPoolConfigurator - function updateFlashloanPremiumTotal(uint128 newFlashloanPremiumTotal) - external - override - onlyPoolAdmin - { - require( - newFlashloanPremiumTotal <= PercentageMath.PERCENTAGE_FACTOR, - Errors.FLASHLOAN_PREMIUM_INVALID - ); - uint128 oldFlashloanPremiumTotal = _pool.FLASHLOAN_PREMIUM_TOTAL(); - _pool.updateFlashloanPremiums(newFlashloanPremiumTotal, _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL()); - emit FlashloanPremiumTotalUpdated(oldFlashloanPremiumTotal, newFlashloanPremiumTotal); - } - - /// @inheritdoc IPoolConfigurator - function updateFlashloanPremiumToProtocol(uint128 newFlashloanPremiumToProtocol) - external - override - onlyPoolAdmin - { - require( - newFlashloanPremiumToProtocol <= PercentageMath.PERCENTAGE_FACTOR, - Errors.FLASHLOAN_PREMIUM_INVALID - ); - uint128 oldFlashloanPremiumToProtocol = _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL(); - _pool.updateFlashloanPremiums(_pool.FLASHLOAN_PREMIUM_TOTAL(), newFlashloanPremiumToProtocol); - emit FlashloanPremiumToProtocolUpdated( - oldFlashloanPremiumToProtocol, - newFlashloanPremiumToProtocol - ); - } - - function _checkNoSuppliers(address asset) internal view { - uint256 totalATokens = IPoolDataProvider(_addressesProvider.getPoolDataProvider()) - .getATokenTotalSupply(asset); - require(totalATokens == 0, Errors.RESERVE_LIQUIDITY_NOT_ZERO); - } - - function _checkNoBorrowers(address asset) internal view { - uint256 totalDebt = IPoolDataProvider(_addressesProvider.getPoolDataProvider()).getTotalDebt( - asset - ); - require(totalDebt == 0, Errors.RESERVE_DEBT_NOT_ZERO); - } - - function _onlyPoolAdmin() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - } - - function _onlyEmergencyAdmin() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isEmergencyAdmin(msg.sender), Errors.CALLER_NOT_EMERGENCY_ADMIN); - } - - function _onlyPoolOrEmergencyAdmin() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isPoolAdmin(msg.sender) || aclManager.isEmergencyAdmin(msg.sender), - Errors.CALLER_NOT_POOL_OR_EMERGENCY_ADMIN - ); - } - - function _onlyAssetListingOrPoolAdmins() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), - Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN - ); - } - - function _onlyRiskOrPoolAdmins() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isRiskAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), - Errors.CALLER_NOT_RISK_OR_POOL_ADMIN - ); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/PoolStorage.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/PoolStorage.sol deleted file mode 100644 index 9fac0d96..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/pool/PoolStorage.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {UserConfiguration} from '../libraries/configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; -import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; -import {DataTypes} from '../libraries/types/DataTypes.sol'; - -/** - * @title PoolStorage - * @author Aave - * @notice Contract used as storage of the Pool contract. - * @dev It defines the storage layout of the Pool contract. - */ -contract PoolStorage { - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - // Map of reserves and their data (underlyingAssetOfReserve => reserveData) - mapping(address => DataTypes.ReserveData) internal _reserves; - - // Map of users address and their configuration data (userAddress => userConfiguration) - mapping(address => DataTypes.UserConfigurationMap) internal _usersConfig; - - // List of reserves as a map (reserveId => reserve). - // It is structured as a mapping for gas savings reasons, using the reserve id as index - mapping(uint256 => address) internal _reservesList; - - // List of eMode categories as a map (eModeCategoryId => eModeCategory). - // It is structured as a mapping for gas savings reasons, using the eModeCategoryId as index - mapping(uint8 => DataTypes.EModeCategory) internal _eModeCategories; - - // Map of users address and their eMode category (userAddress => eModeCategoryId) - mapping(address => uint8) internal _usersEModeCategory; - - // Fee of the protocol bridge, expressed in bps - uint256 internal _bridgeProtocolFee; - - // Total FlashLoan Premium, expressed in bps - uint128 internal _flashLoanPremiumTotal; - - // FlashLoan premium paid to protocol treasury, expressed in bps - uint128 internal _flashLoanPremiumToProtocol; - - // Available liquidity that can be borrowed at once at stable rate, expressed in bps - uint64 internal _maxStableRateBorrowSizePercent; - - // Maximum number of active reserves there have been in the protocol. It is the upper bound of the reserves list - uint16 internal _reservesCount; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/AToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/AToken.sol deleted file mode 100644 index 2bd122e6..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/AToken.sol +++ /dev/null @@ -1,272 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {VersionedInitializable} from '../libraries/aave-upgradeability/VersionedInitializable.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; -import {WadRayMath} from '../libraries/math/WadRayMath.sol'; -import {IPool} from '../../interfaces/IPool.sol'; -import {IAToken} from '../../interfaces/IAToken.sol'; -import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; -import {IInitializableAToken} from '../../interfaces/IInitializableAToken.sol'; -import {ScaledBalanceTokenBase} from './base/ScaledBalanceTokenBase.sol'; -import {IncentivizedERC20} from './base/IncentivizedERC20.sol'; -import {EIP712Base} from './base/EIP712Base.sol'; - -/** - * @title Aave ERC20 AToken - * @author Aave - * @notice Implementation of the interest bearing token for the Aave protocol - */ -contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, IAToken { - using WadRayMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - - bytes32 public constant PERMIT_TYPEHASH = - keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); - - uint256 public constant ATOKEN_REVISION = 0x1; - - address internal _treasury; - address internal _underlyingAsset; - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return ATOKEN_REVISION; - } - - /** - * @dev Constructor. - * @param pool The address of the Pool contract - */ - constructor(IPool pool) - ScaledBalanceTokenBase(pool, 'ATOKEN_IMPL', 'ATOKEN_IMPL', 0) - EIP712Base() - { - // Intentionally left blank - } - - /// @inheritdoc IInitializableAToken - function initialize( - IPool initializingPool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external override initializer { - require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); - _setName(aTokenName); - _setSymbol(aTokenSymbol); - _setDecimals(aTokenDecimals); - - _treasury = treasury; - _underlyingAsset = underlyingAsset; - _incentivesController = incentivesController; - - _domainSeparator = _calculateDomainSeparator(); - - emit Initialized( - underlyingAsset, - address(POOL), - treasury, - address(incentivesController), - aTokenDecimals, - aTokenName, - aTokenSymbol, - params - ); - } - - /// @inheritdoc IAToken - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external virtual override onlyPool returns (bool) { - return _mintScaled(caller, onBehalfOf, amount, index); - } - - /// @inheritdoc IAToken - function burn( - address from, - address receiverOfUnderlying, - uint256 amount, - uint256 index - ) external virtual override onlyPool { - _burnScaled(from, receiverOfUnderlying, amount, index); - if (receiverOfUnderlying != address(this)) { - IERC20(_underlyingAsset).safeTransfer(receiverOfUnderlying, amount); - } - } - - /// @inheritdoc IAToken - function mintToTreasury(uint256 amount, uint256 index) external override onlyPool { - if (amount == 0) { - return; - } - _mintScaled(address(POOL), _treasury, amount, index); - } - - /// @inheritdoc IAToken - function transferOnLiquidation( - address from, - address to, - uint256 value - ) external override onlyPool { - // Being a normal transfer, the Transfer() and BalanceTransfer() are emitted - // so no need to emit a specific event here - _transfer(from, to, value, false); - - emit Transfer(from, to, value); - } - - /// @inheritdoc IERC20 - function balanceOf(address user) - public - view - virtual - override(IncentivizedERC20, IERC20) - returns (uint256) - { - return super.balanceOf(user).rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { - uint256 currentSupplyScaled = super.totalSupply(); - - if (currentSupplyScaled == 0) { - return 0; - } - - return currentSupplyScaled.rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); - } - - /// @inheritdoc IAToken - function RESERVE_TREASURY_ADDRESS() external view override returns (address) { - return _treasury; - } - - /// @inheritdoc IAToken - function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { - return _underlyingAsset; - } - - /// @inheritdoc IAToken - function transferUnderlyingTo(address target, uint256 amount) external virtual override onlyPool { - IERC20(_underlyingAsset).safeTransfer(target, amount); - } - - /// @inheritdoc IAToken - function handleRepayment(address user, uint256 amount) external virtual override onlyPool { - // Intentionally left blank - } - - /// @inheritdoc IAToken - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external override { - require(owner != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - //solium-disable-next-line - require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); - uint256 currentValidNonce = _nonces[owner]; - bytes32 digest = keccak256( - abi.encodePacked( - '\x19\x01', - DOMAIN_SEPARATOR(), - keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentValidNonce, deadline)) - ) - ); - require(owner == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); - _nonces[owner] = currentValidNonce + 1; - _approve(owner, spender, value); - } - - /** - * @notice Transfers the aTokens between two users. Validates the transfer - * (ie checks for valid HF after the transfer) if required - * @param from The source address - * @param to The destination address - * @param amount The amount getting transferred - * @param validate True if the transfer needs to be validated, false otherwise - **/ - function _transfer( - address from, - address to, - uint256 amount, - bool validate - ) internal { - address underlyingAsset = _underlyingAsset; - - uint256 index = POOL.getReserveNormalizedIncome(underlyingAsset); - - uint256 fromBalanceBefore = super.balanceOf(from).rayMul(index); - uint256 toBalanceBefore = super.balanceOf(to).rayMul(index); - - super._transfer(from, to, amount.rayDiv(index).toUint128()); - - if (validate) { - POOL.finalizeTransfer(underlyingAsset, from, to, amount, fromBalanceBefore, toBalanceBefore); - } - - emit BalanceTransfer(from, to, amount, index); - } - - /** - * @notice Overrides the parent _transfer to force validated transfer() and transferFrom() - * @param from The source address - * @param to The destination address - * @param amount The amount getting transferred - **/ - function _transfer( - address from, - address to, - uint128 amount - ) internal override { - _transfer(from, to, amount, true); - } - - /** - * @dev Overrides the base function to fully implement IAToken - * @dev see `IncentivizedERC20.DOMAIN_SEPARATOR()` for more detailed documentation - */ - function DOMAIN_SEPARATOR() public view override(IAToken, EIP712Base) returns (bytes32) { - return super.DOMAIN_SEPARATOR(); - } - - /** - * @dev Overrides the base function to fully implement IAToken - * @dev see `IncentivizedERC20.nonces()` for more detailed documentation - */ - function nonces(address owner) public view override(IAToken, EIP712Base) returns (uint256) { - return super.nonces(owner); - } - - /// @inheritdoc EIP712Base - function _EIP712BaseId() internal view override returns (string memory) { - return name(); - } - - /// @inheritdoc IAToken - function rescueTokens( - address token, - address to, - uint256 amount - ) external override onlyPoolAdmin { - require(token != _underlyingAsset, Errors.UNDERLYING_CANNOT_BE_RESCUED); - IERC20(token).safeTransfer(to, amount); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol deleted file mode 100644 index 51a5f201..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IPool} from '../../interfaces/IPool.sol'; -import {IDelegationToken} from '../../interfaces/IDelegationToken.sol'; -import {AToken} from './AToken.sol'; - -/** - * @title DelegationAwareAToken - * @author Aave - * @notice AToken enabled to delegate voting power of the underlying asset to a different address - * @dev The underlying asset needs to be compatible with the COMP delegation interface - */ -contract DelegationAwareAToken is AToken { - /** - * @dev Emitted when underlying voting power is delegated - * @param delegatee The address of the delegatee - */ - event DelegateUnderlyingTo(address indexed delegatee); - - /** - * @dev Constructor. - * @param pool The address of the Pool contract - */ - constructor(IPool pool) AToken(pool) { - // Intentionally left blank - } - - /** - * @notice Delegates voting power of the underlying asset to a `delegatee` address - * @param delegatee The address that will receive the delegation - **/ - function delegateUnderlyingTo(address delegatee) external onlyPoolAdmin { - IDelegationToken(_underlyingAsset).delegate(delegatee); - emit DelegateUnderlyingTo(delegatee); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol deleted file mode 100644 index c37358ba..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol +++ /dev/null @@ -1,430 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {VersionedInitializable} from '../libraries/aave-upgradeability/VersionedInitializable.sol'; -import {MathUtils} from '../libraries/math/MathUtils.sol'; -import {WadRayMath} from '../libraries/math/WadRayMath.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; -import {IInitializableDebtToken} from '../../interfaces/IInitializableDebtToken.sol'; -import {IStableDebtToken} from '../../interfaces/IStableDebtToken.sol'; -import {IPool} from '../../interfaces/IPool.sol'; -import {EIP712Base} from './base/EIP712Base.sol'; -import {DebtTokenBase} from './base/DebtTokenBase.sol'; -import {IncentivizedERC20} from './base/IncentivizedERC20.sol'; -import {SafeCast} from '../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title StableDebtToken - * @author Aave - * @notice Implements a stable debt token to track the borrowing positions of users - * at stable rate mode - * @dev Transfer and approve functionalities are disabled since its a non-transferable token - **/ -contract StableDebtToken is DebtTokenBase, IncentivizedERC20, IStableDebtToken { - using WadRayMath for uint256; - using SafeCast for uint256; - - uint256 public constant DEBT_TOKEN_REVISION = 0x1; - - // Map of users address and the timestamp of their last update (userAddress => lastUpdateTimestamp) - mapping(address => uint40) internal _timestamps; - - uint128 internal _avgStableRate; - - // Timestamp of the last update of the total supply - uint40 internal _totalSupplyTimestamp; - - /** - * @dev Constructor. - * @param pool The address of the Pool contract - */ - constructor(IPool pool) - DebtTokenBase() - IncentivizedERC20(pool, 'STABLE_DEBT_TOKEN_IMPL', 'STABLE_DEBT_TOKEN_IMPL', 0) - { - // Intentionally left blank - } - - /// @inheritdoc IInitializableDebtToken - function initialize( - IPool initializingPool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external override initializer { - require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); - _setName(debtTokenName); - _setSymbol(debtTokenSymbol); - _setDecimals(debtTokenDecimals); - - _underlyingAsset = underlyingAsset; - _incentivesController = incentivesController; - - _domainSeparator = _calculateDomainSeparator(); - - emit Initialized( - underlyingAsset, - address(POOL), - address(incentivesController), - debtTokenDecimals, - debtTokenName, - debtTokenSymbol, - params - ); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return DEBT_TOKEN_REVISION; - } - - /// @inheritdoc IStableDebtToken - function getAverageStableRate() external view virtual override returns (uint256) { - return _avgStableRate; - } - - /// @inheritdoc IStableDebtToken - function getUserLastUpdated(address user) external view virtual override returns (uint40) { - return _timestamps[user]; - } - - /// @inheritdoc IStableDebtToken - function getUserStableRate(address user) external view virtual override returns (uint256) { - return _userState[user].additionalData; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - uint256 accountBalance = super.balanceOf(account); - uint256 stableRate = _userState[account].additionalData; - if (accountBalance == 0) { - return 0; - } - uint256 cumulatedInterest = MathUtils.calculateCompoundedInterest( - stableRate, - _timestamps[account] - ); - return accountBalance.rayMul(cumulatedInterest); - } - - struct MintLocalVars { - uint256 previousSupply; - uint256 nextSupply; - uint256 amountInRay; - uint256 currentStableRate; - uint256 nextStableRate; - uint256 currentAvgStableRate; - } - - /// @inheritdoc IStableDebtToken - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 rate - ) - external - virtual - override - onlyPool - returns ( - bool, - uint256, - uint256 - ) - { - MintLocalVars memory vars; - - if (user != onBehalfOf) { - _decreaseBorrowAllowance(onBehalfOf, user, amount); - } - - (, uint256 currentBalance, uint256 balanceIncrease) = _calculateBalanceIncrease(onBehalfOf); - - vars.previousSupply = totalSupply(); - vars.currentAvgStableRate = _avgStableRate; - vars.nextSupply = _totalSupply = vars.previousSupply + amount; - - vars.amountInRay = amount.wadToRay(); - - vars.currentStableRate = _userState[onBehalfOf].additionalData; - vars.nextStableRate = (vars.currentStableRate.rayMul(currentBalance.wadToRay()) + - vars.amountInRay.rayMul(rate)).rayDiv((currentBalance + amount).wadToRay()); - - _userState[onBehalfOf].additionalData = vars.nextStableRate.toUint128(); - - //solium-disable-next-line - _totalSupplyTimestamp = _timestamps[onBehalfOf] = uint40(block.timestamp); - - // Calculates the updated average stable rate - vars.currentAvgStableRate = _avgStableRate = ( - (vars.currentAvgStableRate.rayMul(vars.previousSupply.wadToRay()) + - rate.rayMul(vars.amountInRay)).rayDiv(vars.nextSupply.wadToRay()) - ).toUint128(); - - uint256 amountToMint = amount + balanceIncrease; - _mint(onBehalfOf, amountToMint, vars.previousSupply); - - emit Transfer(address(0), onBehalfOf, amountToMint); - emit Mint( - user, - onBehalfOf, - amountToMint, - currentBalance, - balanceIncrease, - vars.nextStableRate, - vars.currentAvgStableRate, - vars.nextSupply - ); - - return (currentBalance == 0, vars.nextSupply, vars.currentAvgStableRate); - } - - /// @inheritdoc IStableDebtToken - function burn(address from, uint256 amount) - external - virtual - override - onlyPool - returns (uint256, uint256) - { - (, uint256 currentBalance, uint256 balanceIncrease) = _calculateBalanceIncrease(from); - - uint256 previousSupply = totalSupply(); - uint256 nextAvgStableRate = 0; - uint256 nextSupply = 0; - uint256 userStableRate = _userState[from].additionalData; - - // Since the total supply and each single user debt accrue separately, - // there might be accumulation errors so that the last borrower repaying - // might actually try to repay more than the available debt supply. - // In this case we simply set the total supply and the avg stable rate to 0 - if (previousSupply <= amount) { - _avgStableRate = 0; - _totalSupply = 0; - } else { - nextSupply = _totalSupply = previousSupply - amount; - uint256 firstTerm = uint256(_avgStableRate).rayMul(previousSupply.wadToRay()); - uint256 secondTerm = userStableRate.rayMul(amount.wadToRay()); - - // For the same reason described above, when the last user is repaying it might - // happen that user rate * user balance > avg rate * total supply. In that case, - // we simply set the avg rate to 0 - if (secondTerm >= firstTerm) { - nextAvgStableRate = _totalSupply = _avgStableRate = 0; - } else { - nextAvgStableRate = _avgStableRate = ( - (firstTerm - secondTerm).rayDiv(nextSupply.wadToRay()) - ).toUint128(); - } - } - - if (amount == currentBalance) { - _userState[from].additionalData = 0; - _timestamps[from] = 0; - } else { - //solium-disable-next-line - _timestamps[from] = uint40(block.timestamp); - } - //solium-disable-next-line - _totalSupplyTimestamp = uint40(block.timestamp); - - if (balanceIncrease > amount) { - uint256 amountToMint = balanceIncrease - amount; - _mint(from, amountToMint, previousSupply); - emit Transfer(address(0), from, amountToMint); - emit Mint( - from, - from, - amountToMint, - currentBalance, - balanceIncrease, - userStableRate, - nextAvgStableRate, - nextSupply - ); - } else { - uint256 amountToBurn = amount - balanceIncrease; - _burn(from, amountToBurn, previousSupply); - emit Transfer(from, address(0), amountToBurn); - emit Burn(from, amountToBurn, currentBalance, balanceIncrease, nextAvgStableRate, nextSupply); - } - - return (nextSupply, nextAvgStableRate); - } - - /** - * @notice Calculates the increase in balance since the last user interaction - * @param user The address of the user for which the interest is being accumulated - * @return The previous principal balance - * @return The new principal balance - * @return The balance increase - **/ - function _calculateBalanceIncrease(address user) - internal - view - returns ( - uint256, - uint256, - uint256 - ) - { - uint256 previousPrincipalBalance = super.balanceOf(user); - - if (previousPrincipalBalance == 0) { - return (0, 0, 0); - } - - uint256 newPrincipalBalance = balanceOf(user); - - return ( - previousPrincipalBalance, - newPrincipalBalance, - newPrincipalBalance - previousPrincipalBalance - ); - } - - /// @inheritdoc IStableDebtToken - function getSupplyData() - external - view - override - returns ( - uint256, - uint256, - uint256, - uint40 - ) - { - uint256 avgRate = _avgStableRate; - return (super.totalSupply(), _calcTotalSupply(avgRate), avgRate, _totalSupplyTimestamp); - } - - /// @inheritdoc IStableDebtToken - function getTotalSupplyAndAvgRate() external view override returns (uint256, uint256) { - uint256 avgRate = _avgStableRate; - return (_calcTotalSupply(avgRate), avgRate); - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _calcTotalSupply(_avgStableRate); - } - - /// @inheritdoc IStableDebtToken - function getTotalSupplyLastUpdated() external view override returns (uint40) { - return _totalSupplyTimestamp; - } - - /// @inheritdoc IStableDebtToken - function principalBalanceOf(address user) external view virtual override returns (uint256) { - return super.balanceOf(user); - } - - /// @inheritdoc IStableDebtToken - function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { - return _underlyingAsset; - } - - /** - * @notice Calculates the total supply - * @param avgRate The average rate at which the total supply increases - * @return The debt balance of the user since the last burn/mint action - **/ - function _calcTotalSupply(uint256 avgRate) internal view returns (uint256) { - uint256 principalSupply = super.totalSupply(); - - if (principalSupply == 0) { - return 0; - } - - uint256 cumulatedInterest = MathUtils.calculateCompoundedInterest( - avgRate, - _totalSupplyTimestamp - ); - - return principalSupply.rayMul(cumulatedInterest); - } - - /** - * @notice Mints stable debt tokens to a user - * @param account The account receiving the debt tokens - * @param amount The amount being minted - * @param oldTotalSupply The total supply before the minting event - **/ - function _mint( - address account, - uint256 amount, - uint256 oldTotalSupply - ) internal { - uint128 castAmount = amount.toUint128(); - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance + castAmount; - - if (address(_incentivesController) != address(0)) { - _incentivesController.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } - - /** - * @notice Burns stable debt tokens of a user - * @param account The user getting his debt burned - * @param amount The amount being burned - * @param oldTotalSupply The total supply before the burning event - **/ - function _burn( - address account, - uint256 amount, - uint256 oldTotalSupply - ) internal { - uint128 castAmount = amount.toUint128(); - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance - castAmount; - - if (address(_incentivesController) != address(0)) { - _incentivesController.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } - - /// @inheritdoc EIP712Base - function _EIP712BaseId() internal view override returns (string memory) { - return name(); - } - - /** - * @dev Being non transferrable, the debt token does not implement any of the - * standard ERC20 functions for transfer and allowance. - **/ - function transfer(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function allowance(address, address) external view virtual override returns (uint256) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function approve(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function transferFrom( - address, - address, - uint256 - ) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function increaseAllowance(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function decreaseAllowance(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol deleted file mode 100644 index 6b73f4b5..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol +++ /dev/null @@ -1,157 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {SafeCast} from '../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {VersionedInitializable} from '../libraries/aave-upgradeability/VersionedInitializable.sol'; -import {WadRayMath} from '../libraries/math/WadRayMath.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; -import {IPool} from '../../interfaces/IPool.sol'; -import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; -import {IInitializableDebtToken} from '../../interfaces/IInitializableDebtToken.sol'; -import {IVariableDebtToken} from '../../interfaces/IVariableDebtToken.sol'; -import {EIP712Base} from './base/EIP712Base.sol'; -import {DebtTokenBase} from './base/DebtTokenBase.sol'; -import {ScaledBalanceTokenBase} from './base/ScaledBalanceTokenBase.sol'; - -/** - * @title VariableDebtToken - * @author Aave - * @notice Implements a variable debt token to track the borrowing positions of users - * at variable rate mode - * @dev Transfer and approve functionalities are disabled since its a non-transferable token - **/ -contract VariableDebtToken is DebtTokenBase, ScaledBalanceTokenBase, IVariableDebtToken { - using WadRayMath for uint256; - using SafeCast for uint256; - - uint256 public constant DEBT_TOKEN_REVISION = 0x1; - - /** - * @dev Constructor. - * @param pool The address of the Pool contract - */ - constructor(IPool pool) - DebtTokenBase() - ScaledBalanceTokenBase(pool, 'VARIABLE_DEBT_TOKEN_IMPL', 'VARIABLE_DEBT_TOKEN_IMPL', 0) - { - // Intentionally left blank - } - - /// @inheritdoc IInitializableDebtToken - function initialize( - IPool initializingPool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external override initializer { - require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); - _setName(debtTokenName); - _setSymbol(debtTokenSymbol); - _setDecimals(debtTokenDecimals); - - _underlyingAsset = underlyingAsset; - _incentivesController = incentivesController; - - _domainSeparator = _calculateDomainSeparator(); - - emit Initialized( - underlyingAsset, - address(POOL), - address(incentivesController), - debtTokenDecimals, - debtTokenName, - debtTokenSymbol, - params - ); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return DEBT_TOKEN_REVISION; - } - - /// @inheritdoc IERC20 - function balanceOf(address user) public view virtual override returns (uint256) { - uint256 scaledBalance = super.balanceOf(user); - - if (scaledBalance == 0) { - return 0; - } - - return scaledBalance.rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); - } - - /// @inheritdoc IVariableDebtToken - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external virtual override onlyPool returns (bool, uint256) { - if (user != onBehalfOf) { - _decreaseBorrowAllowance(onBehalfOf, user, amount); - } - return (_mintScaled(user, onBehalfOf, amount, index), scaledTotalSupply()); - } - - /// @inheritdoc IVariableDebtToken - function burn( - address from, - uint256 amount, - uint256 index - ) external virtual override onlyPool returns (uint256) { - _burnScaled(from, address(0), amount, index); - return scaledTotalSupply(); - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return super.totalSupply().rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); - } - - /// @inheritdoc EIP712Base - function _EIP712BaseId() internal view override returns (string memory) { - return name(); - } - - /** - * @dev Being non transferrable, the debt token does not implement any of the - * standard ERC20 functions for transfer and allowance. - **/ - function transfer(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function allowance(address, address) external view virtual override returns (uint256) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function approve(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function transferFrom( - address, - address, - uint256 - ) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function increaseAllowance(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function decreaseAllowance(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - /// @inheritdoc IVariableDebtToken - function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { - return _underlyingAsset; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/DebtTokenBase.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/DebtTokenBase.sol deleted file mode 100644 index 3e5ac909..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/DebtTokenBase.sol +++ /dev/null @@ -1,112 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {VersionedInitializable} from '../../libraries/aave-upgradeability/VersionedInitializable.sol'; -import {ICreditDelegationToken} from '../../../interfaces/ICreditDelegationToken.sol'; -import {EIP712Base} from './EIP712Base.sol'; - -/** - * @title DebtTokenBase - * @author Aave - * @notice Base contract for different types of debt tokens, like StableDebtToken or VariableDebtToken - */ -abstract contract DebtTokenBase is - VersionedInitializable, - EIP712Base, - Context, - ICreditDelegationToken -{ - // Map of borrow allowances (delegator => delegatee => borrowAllowanceAmount) - mapping(address => mapping(address => uint256)) internal _borrowAllowances; - - // Credit Delegation Typehash - bytes32 public constant DELEGATION_WITH_SIG_TYPEHASH = - keccak256('DelegationWithSig(address delegatee,uint256 value,uint256 nonce,uint256 deadline)'); - - address internal _underlyingAsset; - - /** - * @dev Constructor. - */ - constructor() EIP712Base() { - // Intentionally left blank - } - - /// @inheritdoc ICreditDelegationToken - function approveDelegation(address delegatee, uint256 amount) external override { - _approveDelegation(_msgSender(), delegatee, amount); - } - - /// @inheritdoc ICreditDelegationToken - function delegationWithSig( - address delegator, - address delegatee, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external { - require(delegator != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - //solium-disable-next-line - require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); - uint256 currentValidNonce = _nonces[delegator]; - bytes32 digest = keccak256( - abi.encodePacked( - '\x19\x01', - DOMAIN_SEPARATOR(), - keccak256( - abi.encode(DELEGATION_WITH_SIG_TYPEHASH, delegatee, value, currentValidNonce, deadline) - ) - ) - ); - require(delegator == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); - _nonces[delegator] = currentValidNonce + 1; - _approveDelegation(delegator, delegatee, value); - } - - /// @inheritdoc ICreditDelegationToken - function borrowAllowance(address fromUser, address toUser) - external - view - override - returns (uint256) - { - return _borrowAllowances[fromUser][toUser]; - } - - /** - * @notice Updates the borrow allowance of a user on the specific debt token. - * @param delegator The address delegating the borrowing power - * @param delegatee The address receiving the delegated borrowing power - * @param amount The allowance amount being delegated. - **/ - function _approveDelegation( - address delegator, - address delegatee, - uint256 amount - ) internal { - _borrowAllowances[delegator][delegatee] = amount; - emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, amount); - } - - /** - * @notice Decreases the borrow allowance of a user on the specific debt token. - * @param delegator The address delegating the borrowing power - * @param delegatee The address receiving the delegated borrowing power - * @param amount The amount to subtract from the current allowance - **/ - function _decreaseBorrowAllowance( - address delegator, - address delegatee, - uint256 amount - ) internal { - uint256 newAllowance = _borrowAllowances[delegator][delegatee] - amount; - - _borrowAllowances[delegator][delegatee] = newAllowance; - - emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, newAllowance); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/EIP712Base.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/EIP712Base.sol deleted file mode 100644 index bb161193..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/EIP712Base.sol +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -/** - * @title EIP712Base - * @author Aave - * @notice Base contract implementation of EIP712. - */ -abstract contract EIP712Base { - bytes public constant EIP712_REVISION = bytes('1'); - bytes32 internal constant EIP712_DOMAIN = - keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); - - // Map of address nonces (address => nonce) - mapping(address => uint256) internal _nonces; - - bytes32 internal _domainSeparator; - uint256 internal immutable _chainId; - - /** - * @dev Constructor. - */ - constructor() { - _chainId = block.chainid; - } - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { - if (block.chainid == _chainId) { - return _domainSeparator; - } - return _calculateDomainSeparator(); - } - - /** - * @notice Returns the nonce value for address specified as parameter - * @param owner The address for which the nonce is being returned - * @return The nonce value for the input address` - */ - function nonces(address owner) public view virtual returns (uint256) { - return _nonces[owner]; - } - - /** - * @notice Compute the current domain separator - * @return The domain separator for the token - */ - function _calculateDomainSeparator() internal view returns (bytes32) { - return - keccak256( - abi.encode( - EIP712_DOMAIN, - keccak256(bytes(_EIP712BaseId())), - keccak256(EIP712_REVISION), - block.chainid, - address(this) - ) - ); - } - - /** - * @notice Returns the user readable name of signing domain (e.g. token name) - * @return The name of the signing domain - */ - function _EIP712BaseId() internal view virtual returns (string memory); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4c0d83c1..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,253 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - **/ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - **/ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - **/ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. StableDebtTokens use - * this field to store the user's stable rate. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name; - _symbol = symbol; - _decimals = decimals; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - **/ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - **/ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance(address owner, address spender) - external - view - virtual - override - returns (uint256) - { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - **/ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - **/ - function decreaseAllowance(address spender, uint256 subtractedValue) - external - virtual - returns (bool) - { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer( - address sender, - address recipient, - uint128 amount - ) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - emit Transfer(sender, recipient, amount); - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve( - address owner, - address spender, - uint256 amount - ) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol deleted file mode 100644 index 51eba347..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IncentivizedERC20} from './IncentivizedERC20.sol'; - -/** - * @title MintableIncentivizedERC20 - * @author Aave - * @notice Implements mint and burn functions for IncentivizedERC20 - **/ -abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) IncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /** - * @notice Mints tokens to an account and apply incentives if defined - * @param account The address receiving tokens - * @param amount The amount of tokens to mint - */ - function _mint(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply + amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } - - /** - * @notice Burns tokens from an account and apply incentives if defined - * @param account The account whose tokens are burnt - * @param amount The amount of tokens to burn - */ - function _burn(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply - amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance - amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol deleted file mode 100644 index 1b0cc690..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/core-v3/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol +++ /dev/null @@ -1,128 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {MintableIncentivizedERC20} from './MintableIncentivizedERC20.sol'; - -/** - * @title ScaledBalanceTokenBase - * @author Aave - * @notice Basic ERC20 implementation of scaled balance token - **/ -abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) MintableIncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /// @inheritdoc IScaledBalanceToken - function scaledBalanceOf(address user) external view override returns (uint256) { - return super.balanceOf(user); - } - - /// @inheritdoc IScaledBalanceToken - function getScaledUserBalanceAndSupply(address user) - external - view - override - returns (uint256, uint256) - { - return (super.balanceOf(user), super.totalSupply()); - } - - /// @inheritdoc IScaledBalanceToken - function scaledTotalSupply() public view virtual override returns (uint256) { - return super.totalSupply(); - } - - /// @inheritdoc IScaledBalanceToken - function getPreviousIndex(address user) external view virtual override returns (uint256) { - return _userState[user].additionalData; - } - - /** - * @notice Implements the basic logic to mint a scaled balance token. - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the scaled tokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - **/ - function _mintScaled( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) internal returns (bool) { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); - - uint256 scaledBalance = super.balanceOf(onBehalfOf); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[onBehalfOf].additionalData); - - _userState[onBehalfOf].additionalData = index.toUint128(); - - _mint(onBehalfOf, amountScaled.toUint128()); - - uint256 amountToMint = amount + balanceIncrease; - emit Transfer(address(0), onBehalfOf, amountToMint); - emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); - - return (scaledBalance == 0); - } - - /** - * @notice Implements the basic logic to burn a scaled balance token. - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param user The user which debt is burnt - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - **/ - function _burnScaled( - address user, - address target, - uint256 amount, - uint256 index - ) internal { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); - - uint256 scaledBalance = super.balanceOf(user); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[user].additionalData); - - _userState[user].additionalData = index.toUint128(); - - _burn(user, amountScaled.toUint128()); - - if (balanceIncrease > amount) { - uint256 amountToMint = balanceIncrease - amount; - emit Transfer(address(0), user, amountToMint); - emit Mint(user, user, amountToMint, balanceIncrease, index); - } else { - uint256 amountToBurn = amount - balanceIncrease; - emit Transfer(user, address(0), amountToBurn); - emit Burn(user, target, amountToBurn, balanceIncrease, index); - } - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapAdapter.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapAdapter.sol deleted file mode 100644 index f8dda0dc..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapAdapter.sol +++ /dev/null @@ -1,139 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {DataTypes} from '@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol'; -import {FlashLoanReceiverBase} from '@aave/core-v3/contracts/flashloan/base/FlashLoanReceiverBase.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {IERC20WithPermit} from '@aave/core-v3/contracts/interfaces/IERC20WithPermit.sol'; -import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; -import {IPriceOracleGetter} from '@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol'; -import {SafeMath} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol'; -import {Ownable} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol'; - -/** - * @title BaseParaSwapAdapter - * @notice Utility functions for adapters using ParaSwap - * @author Jason Raymond Bell - */ -abstract contract BaseParaSwapAdapter is FlashLoanReceiverBase, Ownable { - using SafeMath for uint256; - using GPv2SafeERC20 for IERC20; - using GPv2SafeERC20 for IERC20Detailed; - using GPv2SafeERC20 for IERC20WithPermit; - - struct PermitSignature { - uint256 amount; - uint256 deadline; - uint8 v; - bytes32 r; - bytes32 s; - } - - // Max slippage percent allowed - uint256 public constant MAX_SLIPPAGE_PERCENT = 3000; // 30% - - IPriceOracleGetter public immutable ORACLE; - - event Swapped( - address indexed fromAsset, - address indexed toAsset, - uint256 fromAmount, - uint256 receivedAmount - ); - event Bought( - address indexed fromAsset, - address indexed toAsset, - uint256 amountSold, - uint256 receivedAmount - ); - - constructor(IPoolAddressesProvider addressesProvider) FlashLoanReceiverBase(addressesProvider) { - ORACLE = IPriceOracleGetter(addressesProvider.getPriceOracle()); - } - - /** - * @dev Get the price of the asset from the oracle denominated in eth - * @param asset address - * @return eth price for the asset - */ - function _getPrice(address asset) internal view returns (uint256) { - return ORACLE.getAssetPrice(asset); - } - - /** - * @dev Get the decimals of an asset - * @return number of decimals of the asset - */ - function _getDecimals(IERC20Detailed asset) internal view returns (uint8) { - uint8 decimals = asset.decimals(); - // Ensure 10**decimals won't overflow a uint256 - require(decimals <= 77, 'TOO_MANY_DECIMALS_ON_TOKEN'); - return decimals; - } - - /** - * @dev Get the aToken associated to the asset - * @return address of the aToken - */ - function _getReserveData(address asset) internal view returns (DataTypes.ReserveData memory) { - return POOL.getReserveData(asset); - } - - function _pullATokenAndWithdraw( - address reserve, - address user, - uint256 amount, - PermitSignature memory permitSignature - ) internal { - IERC20WithPermit reserveAToken = IERC20WithPermit( - _getReserveData(address(reserve)).aTokenAddress - ); - _pullATokenAndWithdraw(reserve, reserveAToken, user, amount, permitSignature); - } - - /** - * @dev Pull the ATokens from the user - * @param reserve address of the asset - * @param reserveAToken address of the aToken of the reserve - * @param user address - * @param amount of tokens to be transferred to the contract - * @param permitSignature struct containing the permit signature - */ - function _pullATokenAndWithdraw( - address reserve, - IERC20WithPermit reserveAToken, - address user, - uint256 amount, - PermitSignature memory permitSignature - ) internal { - // If deadline is set to zero, assume there is no signature for permit - if (permitSignature.deadline != 0) { - reserveAToken.permit( - user, - address(this), - permitSignature.amount, - permitSignature.deadline, - permitSignature.v, - permitSignature.r, - permitSignature.s - ); - } - - // transfer from user to adapter - reserveAToken.safeTransferFrom(user, address(this), amount); - - // withdraw reserve - require(POOL.withdraw(reserve, amount, address(this)) == amount, 'UNEXPECTED_AMOUNT_WITHDRAWN'); - } - - /** - * @dev Emergency rescue for token stucked on this contract, as failsafe mechanism - * - Funds should never remain in this contract more time than during transactions - * - Only callable by the owner - */ - function rescueTokens(IERC20 token) external onlyOwner { - token.safeTransfer(owner(), token.balanceOf(address(this))); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapBuyAdapter.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapBuyAdapter.sol deleted file mode 100644 index c55f7099..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapBuyAdapter.sol +++ /dev/null @@ -1,109 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {SafeMath} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol'; -import {PercentageMath} from '@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol'; -import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; -import {IERC20Detailed} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {IParaSwapAugustus} from './interfaces/IParaSwapAugustus.sol'; -import {IParaSwapAugustusRegistry} from './interfaces/IParaSwapAugustusRegistry.sol'; -import {BaseParaSwapAdapter} from './BaseParaSwapAdapter.sol'; - -/** - * @title BaseParaSwapBuyAdapter - * @notice Implements the logic for buying tokens on ParaSwap - */ -abstract contract BaseParaSwapBuyAdapter is BaseParaSwapAdapter { - using PercentageMath for uint256; - using SafeMath for uint256; - - IParaSwapAugustusRegistry public immutable AUGUSTUS_REGISTRY; - - constructor(IPoolAddressesProvider addressesProvider, IParaSwapAugustusRegistry augustusRegistry) - BaseParaSwapAdapter(addressesProvider) - { - // Do something on Augustus registry to check the right contract was passed - require(!augustusRegistry.isValidAugustus(address(0)), 'Not a valid Augustus address'); - AUGUSTUS_REGISTRY = augustusRegistry; - } - - /** - * @dev Swaps a token for another using ParaSwap - * @param toAmountOffset Offset of toAmount in Augustus calldata if it should be overwritten, otherwise 0 - * @param paraswapData Data for Paraswap Adapter - * @param assetToSwapFrom Address of the asset to be swapped from - * @param assetToSwapTo Address of the asset to be swapped to - * @param maxAmountToSwap Max amount to be swapped - * @param amountToReceive Amount to be received from the swap - * @return amountSold The amount sold during the swap - */ - function _buyOnParaSwap( - uint256 toAmountOffset, - bytes memory paraswapData, - IERC20Detailed assetToSwapFrom, - IERC20Detailed assetToSwapTo, - uint256 maxAmountToSwap, - uint256 amountToReceive - ) internal returns (uint256 amountSold) { - (bytes memory buyCalldata, IParaSwapAugustus augustus) = abi.decode( - paraswapData, - (bytes, IParaSwapAugustus) - ); - - require(AUGUSTUS_REGISTRY.isValidAugustus(address(augustus)), 'INVALID_AUGUSTUS'); - - { - uint256 fromAssetDecimals = _getDecimals(assetToSwapFrom); - uint256 toAssetDecimals = _getDecimals(assetToSwapTo); - - uint256 fromAssetPrice = _getPrice(address(assetToSwapFrom)); - uint256 toAssetPrice = _getPrice(address(assetToSwapTo)); - - uint256 expectedMaxAmountToSwap = amountToReceive - .mul(toAssetPrice.mul(10**fromAssetDecimals)) - .div(fromAssetPrice.mul(10**toAssetDecimals)) - .percentMul(PercentageMath.PERCENTAGE_FACTOR.add(MAX_SLIPPAGE_PERCENT)); - - require(maxAmountToSwap <= expectedMaxAmountToSwap, 'maxAmountToSwap exceed max slippage'); - } - - uint256 balanceBeforeAssetFrom = assetToSwapFrom.balanceOf(address(this)); - require(balanceBeforeAssetFrom >= maxAmountToSwap, 'INSUFFICIENT_BALANCE_BEFORE_SWAP'); - uint256 balanceBeforeAssetTo = assetToSwapTo.balanceOf(address(this)); - - address tokenTransferProxy = augustus.getTokenTransferProxy(); - assetToSwapFrom.approve(tokenTransferProxy, 0); - assetToSwapFrom.approve(tokenTransferProxy, maxAmountToSwap); - - if (toAmountOffset != 0) { - // Ensure 256 bit (32 bytes) toAmountOffset value is within bounds of the - // calldata, not overlapping with the first 4 bytes (function selector). - require( - toAmountOffset >= 4 && toAmountOffset <= buyCalldata.length.sub(32), - 'TO_AMOUNT_OFFSET_OUT_OF_RANGE' - ); - // Overwrite the toAmount with the correct amount for the buy. - // In memory, buyCalldata consists of a 256 bit length field, followed by - // the actual bytes data, that is why 32 is added to the byte offset. - assembly { - mstore(add(buyCalldata, add(toAmountOffset, 32)), amountToReceive) - } - } - (bool success, ) = address(augustus).call(buyCalldata); - if (!success) { - // Copy revert reason from call - assembly { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - uint256 balanceAfterAssetFrom = assetToSwapFrom.balanceOf(address(this)); - amountSold = balanceBeforeAssetFrom - balanceAfterAssetFrom; - require(amountSold <= maxAmountToSwap, 'WRONG_BALANCE_AFTER_SWAP'); - uint256 amountReceived = assetToSwapTo.balanceOf(address(this)).sub(balanceBeforeAssetTo); - require(amountReceived >= amountToReceive, 'INSUFFICIENT_AMOUNT_RECEIVED'); - - emit Bought(address(assetToSwapFrom), address(assetToSwapTo), amountSold, amountReceived); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapSellAdapter.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapSellAdapter.sol deleted file mode 100644 index 7fd31ab2..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/BaseParaSwapSellAdapter.sol +++ /dev/null @@ -1,107 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {SafeMath} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol'; -import {PercentageMath} from '@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol'; -import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; -import {IERC20Detailed} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {IParaSwapAugustus} from './interfaces/IParaSwapAugustus.sol'; -import {IParaSwapAugustusRegistry} from './interfaces/IParaSwapAugustusRegistry.sol'; -import {BaseParaSwapAdapter} from './BaseParaSwapAdapter.sol'; - -/** - * @title BaseParaSwapSellAdapter - * @notice Implements the logic for selling tokens on ParaSwap - * @author Jason Raymond Bell - */ -abstract contract BaseParaSwapSellAdapter is BaseParaSwapAdapter { - using PercentageMath for uint256; - using SafeMath for uint256; - - IParaSwapAugustusRegistry public immutable AUGUSTUS_REGISTRY; - - constructor(IPoolAddressesProvider addressesProvider, IParaSwapAugustusRegistry augustusRegistry) - BaseParaSwapAdapter(addressesProvider) - { - // Do something on Augustus registry to check the right contract was passed - require(!augustusRegistry.isValidAugustus(address(0))); - AUGUSTUS_REGISTRY = augustusRegistry; - } - - /** - * @dev Swaps a token for another using ParaSwap - * @param fromAmountOffset Offset of fromAmount in Augustus calldata if it should be overwritten, otherwise 0 - * @param swapCalldata Calldata for ParaSwap's AugustusSwapper contract - * @param augustus Address of ParaSwap's AugustusSwapper contract - * @param assetToSwapFrom Address of the asset to be swapped from - * @param assetToSwapTo Address of the asset to be swapped to - * @param amountToSwap Amount to be swapped - * @param minAmountToReceive Minimum amount to be received from the swap - * @return amountReceived The amount received from the swap - */ - function _sellOnParaSwap( - uint256 fromAmountOffset, - bytes memory swapCalldata, - IParaSwapAugustus augustus, - IERC20Detailed assetToSwapFrom, - IERC20Detailed assetToSwapTo, - uint256 amountToSwap, - uint256 minAmountToReceive - ) internal returns (uint256 amountReceived) { - require(AUGUSTUS_REGISTRY.isValidAugustus(address(augustus)), 'INVALID_AUGUSTUS'); - - { - uint256 fromAssetDecimals = _getDecimals(assetToSwapFrom); - uint256 toAssetDecimals = _getDecimals(assetToSwapTo); - - uint256 fromAssetPrice = _getPrice(address(assetToSwapFrom)); - uint256 toAssetPrice = _getPrice(address(assetToSwapTo)); - - uint256 expectedMinAmountOut = amountToSwap - .mul(fromAssetPrice.mul(10**toAssetDecimals)) - .div(toAssetPrice.mul(10**fromAssetDecimals)) - .percentMul(PercentageMath.PERCENTAGE_FACTOR - MAX_SLIPPAGE_PERCENT); - - require(expectedMinAmountOut <= minAmountToReceive, 'MIN_AMOUNT_EXCEEDS_MAX_SLIPPAGE'); - } - - uint256 balanceBeforeAssetFrom = assetToSwapFrom.balanceOf(address(this)); - require(balanceBeforeAssetFrom >= amountToSwap, 'INSUFFICIENT_BALANCE_BEFORE_SWAP'); - uint256 balanceBeforeAssetTo = assetToSwapTo.balanceOf(address(this)); - - address tokenTransferProxy = augustus.getTokenTransferProxy(); - assetToSwapFrom.approve(tokenTransferProxy, 0); - assetToSwapFrom.approve(tokenTransferProxy, amountToSwap); - - if (fromAmountOffset != 0) { - // Ensure 256 bit (32 bytes) fromAmount value is within bounds of the - // calldata, not overlapping with the first 4 bytes (function selector). - require( - fromAmountOffset >= 4 && fromAmountOffset <= swapCalldata.length.sub(32), - 'FROM_AMOUNT_OFFSET_OUT_OF_RANGE' - ); - // Overwrite the fromAmount with the correct amount for the swap. - // In memory, swapCalldata consists of a 256 bit length field, followed by - // the actual bytes data, that is why 32 is added to the byte offset. - assembly { - mstore(add(swapCalldata, add(fromAmountOffset, 32)), amountToSwap) - } - } - (bool success, ) = address(augustus).call(swapCalldata); - if (!success) { - // Copy revert reason from call - assembly { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - require( - assetToSwapFrom.balanceOf(address(this)) == balanceBeforeAssetFrom - amountToSwap, - 'WRONG_BALANCE_AFTER_SWAP' - ); - amountReceived = assetToSwapTo.balanceOf(address(this)).sub(balanceBeforeAssetTo); - require(amountReceived >= minAmountToReceive, 'INSUFFICIENT_AMOUNT_RECEIVED'); - - emit Swapped(address(assetToSwapFrom), address(assetToSwapTo), amountToSwap, amountReceived); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol deleted file mode 100644 index b4aad577..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol +++ /dev/null @@ -1,211 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {IERC20Detailed} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {IERC20WithPermit} from '@aave/core-v3/contracts/interfaces/IERC20WithPermit.sol'; -import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; -import {SafeMath} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol'; -import {BaseParaSwapSellAdapter} from './BaseParaSwapSellAdapter.sol'; -import {IParaSwapAugustusRegistry} from './interfaces/IParaSwapAugustusRegistry.sol'; -import {IParaSwapAugustus} from './interfaces/IParaSwapAugustus.sol'; -import {ReentrancyGuard} from '../../dependencies/openzeppelin/ReentrancyGuard.sol'; - -/** - * @title ParaSwapLiquiditySwapAdapter - * @notice Adapter to swap liquidity using ParaSwap. - * @author Jason Raymond Bell - */ -contract ParaSwapLiquiditySwapAdapter is BaseParaSwapSellAdapter, ReentrancyGuard { - using SafeMath for uint256; - - constructor( - IPoolAddressesProvider addressesProvider, - IParaSwapAugustusRegistry augustusRegistry, - address owner - ) BaseParaSwapSellAdapter(addressesProvider, augustusRegistry) { - transferOwnership(owner); - } - - /** - * @dev Swaps the received reserve amount from the flash loan into the asset specified in the params. - * The received funds from the swap are then deposited into the protocol on behalf of the user. - * The user should give this contract allowance to pull the ATokens in order to withdraw the underlying asset and repay the flash loan. - * @param assets Address of the underlying asset to be swapped from - * @param amounts Amount of the flash loan i.e. maximum amount to swap - * @param premiums Fee of the flash loan - * @param initiator Account that initiated the flash loan - * @param params Additional variadic field to include extra params. Expected parameters: - * address assetToSwapTo Address of the underlying asset to be swapped to and deposited - * uint256 minAmountToReceive Min amount to be received from the swap - * uint256 swapAllBalanceOffset Set to offset of fromAmount in Augustus calldata if wanting to swap all balance, otherwise 0 - * bytes swapCalldata Calldata for ParaSwap's AugustusSwapper contract - * address augustus Address of ParaSwap's AugustusSwapper contract - * PermitSignature permitParams Struct containing the permit signatures, set to all zeroes if not used - */ - function executeOperation( - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata premiums, - address initiator, - bytes calldata params - ) external override nonReentrant returns (bool) { - require(msg.sender == address(POOL), 'CALLER_MUST_BE_POOL'); - require( - assets.length == 1 && amounts.length == 1 && premiums.length == 1, - 'FLASHLOAN_MULTIPLE_ASSETS_NOT_SUPPORTED' - ); - - uint256 flashLoanAmount = amounts[0]; - uint256 premium = premiums[0]; - address initiatorLocal = initiator; - IERC20Detailed assetToSwapFrom = IERC20Detailed(assets[0]); - ( - IERC20Detailed assetToSwapTo, - uint256 minAmountToReceive, - uint256 swapAllBalanceOffset, - bytes memory swapCalldata, - IParaSwapAugustus augustus, - PermitSignature memory permitParams - ) = abi.decode( - params, - (IERC20Detailed, uint256, uint256, bytes, IParaSwapAugustus, PermitSignature) - ); - - _swapLiquidity( - swapAllBalanceOffset, - swapCalldata, - augustus, - permitParams, - flashLoanAmount, - premium, - initiatorLocal, - assetToSwapFrom, - assetToSwapTo, - minAmountToReceive - ); - - return true; - } - - /** - * @dev Swaps an amount of an asset to another and deposits the new asset amount on behalf of the user without using a flash loan. - * This method can be used when the temporary transfer of the collateral asset to this contract does not affect the user position. - * The user should give this contract allowance to pull the ATokens in order to withdraw the underlying asset and perform the swap. - * @param assetToSwapFrom Address of the underlying asset to be swapped from - * @param assetToSwapTo Address of the underlying asset to be swapped to and deposited - * @param amountToSwap Amount to be swapped, or maximum amount when swapping all balance - * @param minAmountToReceive Minimum amount to be received from the swap - * @param swapAllBalanceOffset Set to offset of fromAmount in Augustus calldata if wanting to swap all balance, otherwise 0 - * @param swapCalldata Calldata for ParaSwap's AugustusSwapper contract - * @param augustus Address of ParaSwap's AugustusSwapper contract - * @param permitParams Struct containing the permit signatures, set to all zeroes if not used - */ - function swapAndDeposit( - IERC20Detailed assetToSwapFrom, - IERC20Detailed assetToSwapTo, - uint256 amountToSwap, - uint256 minAmountToReceive, - uint256 swapAllBalanceOffset, - bytes calldata swapCalldata, - IParaSwapAugustus augustus, - PermitSignature calldata permitParams - ) external nonReentrant { - IERC20WithPermit aToken = IERC20WithPermit( - _getReserveData(address(assetToSwapFrom)).aTokenAddress - ); - - if (swapAllBalanceOffset != 0) { - uint256 balance = aToken.balanceOf(msg.sender); - require(balance <= amountToSwap, 'INSUFFICIENT_AMOUNT_TO_SWAP'); - amountToSwap = balance; - } - - _pullATokenAndWithdraw( - address(assetToSwapFrom), - aToken, - msg.sender, - amountToSwap, - permitParams - ); - - uint256 amountReceived = _sellOnParaSwap( - swapAllBalanceOffset, - swapCalldata, - augustus, - assetToSwapFrom, - assetToSwapTo, - amountToSwap, - minAmountToReceive - ); - - assetToSwapTo.approve(address(POOL), 0); - assetToSwapTo.approve(address(POOL), amountReceived); - POOL.deposit(address(assetToSwapTo), amountReceived, msg.sender, 0); - } - - /** - * @dev Swaps an amount of an asset to another and deposits the funds on behalf of the initiator. - * @param swapAllBalanceOffset Set to offset of fromAmount in Augustus calldata if wanting to swap all balance, otherwise 0 - * @param swapCalldata Calldata for ParaSwap's AugustusSwapper contract - * @param augustus Address of ParaSwap's AugustusSwapper contract - * @param permitParams Struct containing the permit signatures, set to all zeroes if not used - * @param flashLoanAmount Amount of the flash loan i.e. maximum amount to swap - * @param premium Fee of the flash loan - * @param initiator Account that initiated the flash loan - * @param assetToSwapFrom Address of the underyling asset to be swapped from - * @param assetToSwapTo Address of the underlying asset to be swapped to and deposited - * @param minAmountToReceive Min amount to be received from the swap - */ - function _swapLiquidity( - uint256 swapAllBalanceOffset, - bytes memory swapCalldata, - IParaSwapAugustus augustus, - PermitSignature memory permitParams, - uint256 flashLoanAmount, - uint256 premium, - address initiator, - IERC20Detailed assetToSwapFrom, - IERC20Detailed assetToSwapTo, - uint256 minAmountToReceive - ) internal { - IERC20WithPermit aToken = IERC20WithPermit( - _getReserveData(address(assetToSwapFrom)).aTokenAddress - ); - uint256 amountToSwap = flashLoanAmount; - - uint256 balance = aToken.balanceOf(initiator); - if (swapAllBalanceOffset != 0) { - uint256 balanceToSwap = balance.sub(premium); - require(balanceToSwap <= amountToSwap, 'INSUFFICIENT_AMOUNT_TO_SWAP'); - amountToSwap = balanceToSwap; - } else { - require(balance >= amountToSwap.add(premium), 'INSUFFICIENT_ATOKEN_BALANCE'); - } - - uint256 amountReceived = _sellOnParaSwap( - swapAllBalanceOffset, - swapCalldata, - augustus, - assetToSwapFrom, - assetToSwapTo, - amountToSwap, - minAmountToReceive - ); - - assetToSwapTo.approve(address(POOL), 0); - assetToSwapTo.approve(address(POOL), amountReceived); - POOL.deposit(address(assetToSwapTo), amountReceived, initiator, 0); - - _pullATokenAndWithdraw( - address(assetToSwapFrom), - aToken, - initiator, - amountToSwap.add(premium), - permitParams - ); - - // Repay flash loan - assetToSwapFrom.approve(address(POOL), 0); - assetToSwapFrom.approve(address(POOL), flashLoanAmount.add(premium)); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol deleted file mode 100644 index e12c6f7b..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol +++ /dev/null @@ -1,229 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {DataTypes} from '@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol'; -import {IERC20Detailed} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20WithPermit} from '@aave/core-v3/contracts/interfaces/IERC20WithPermit.sol'; -import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; -import {SafeMath} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeMath.sol'; -import {BaseParaSwapBuyAdapter} from './BaseParaSwapBuyAdapter.sol'; -import {IParaSwapAugustusRegistry} from './interfaces/IParaSwapAugustusRegistry.sol'; -import {IParaSwapAugustus} from './interfaces/IParaSwapAugustus.sol'; -import {ReentrancyGuard} from '../../dependencies/openzeppelin/ReentrancyGuard.sol'; - -/** - * @title ParaSwapRepayAdapter - * @notice ParaSwap Adapter to perform a repay of a debt with collateral. - * @author Aave - **/ -contract ParaSwapRepayAdapter is BaseParaSwapBuyAdapter, ReentrancyGuard { - using SafeMath for uint256; - - struct RepayParams { - address collateralAsset; - uint256 collateralAmount; - uint256 rateMode; - PermitSignature permitSignature; - bool useEthPath; - } - - constructor( - IPoolAddressesProvider addressesProvider, - IParaSwapAugustusRegistry augustusRegistry, - address owner - ) BaseParaSwapBuyAdapter(addressesProvider, augustusRegistry) { - transferOwnership(owner); - } - - /** - * @dev Uses the received funds from the flash loan to repay a debt on the protocol on behalf of the user. Then pulls - * the collateral from the user and swaps it to the debt asset to repay the flash loan. - * The user should give this contract allowance to pull the ATokens in order to withdraw the underlying asset, swap it - * and repay the flash loan. - * Supports only one asset on the flash loan. - * @param assets Address of collateral asset(Flash loan asset) - * @param amounts Amount of flash loan taken - * @param premiums Fee of the flash loan - * @param initiator Address of the user - * @param params Additional variadic field to include extra params. Expected parameters: - * IERC20Detailed debtAsset Address of the debt asset - * uint256 debtAmount Amount of debt to be repaid - * uint256 rateMode Rate modes of the debt to be repaid - * uint256 deadline Deadline for the permit signature - * uint256 debtRateMode Rate mode of the debt to be repaid - * bytes paraswapData Paraswap Data - * * bytes buyCallData Call data for augustus - * * IParaSwapAugustus augustus Address of Augustus Swapper - * PermitSignature permitParams Struct containing the permit signatures, set to all zeroes if not used - */ - function executeOperation( - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata premiums, - address initiator, - bytes calldata params - ) external override nonReentrant returns (bool) { - require(msg.sender == address(POOL), 'CALLER_MUST_BE_POOL'); - - require( - assets.length == 1 && amounts.length == 1 && premiums.length == 1, - 'FLASHLOAN_MULTIPLE_ASSETS_NOT_SUPPORTED' - ); - - uint256 collateralAmount = amounts[0]; - uint256 premium = premiums[0]; - address initiatorLocal = initiator; - - IERC20Detailed collateralAsset = IERC20Detailed(assets[0]); - - _swapAndRepay(params, premium, initiatorLocal, collateralAsset, collateralAmount); - - return true; - } - - /** - * @dev Swaps the user collateral for the debt asset and then repay the debt on the protocol on behalf of the user - * without using flash loans. This method can be used when the temporary transfer of the collateral asset to this - * contract does not affect the user position. - * The user should give this contract allowance to pull the ATokens in order to withdraw the underlying asset - * @param collateralAsset Address of asset to be swapped - * @param debtAsset Address of debt asset - * @param collateralAmount max Amount of the collateral to be swapped - * @param debtRepayAmount Amount of the debt to be repaid, or maximum amount when repaying entire debt - * @param debtRateMode Rate mode of the debt to be repaid - * @param buyAllBalanceOffset Set to offset of toAmount in Augustus calldata if wanting to pay entire debt, otherwise 0 - * @param paraswapData Data for Paraswap Adapter - * @param permitSignature struct containing the permit signature - */ - function swapAndRepay( - IERC20Detailed collateralAsset, - IERC20Detailed debtAsset, - uint256 collateralAmount, - uint256 debtRepayAmount, - uint256 debtRateMode, - uint256 buyAllBalanceOffset, - bytes calldata paraswapData, - PermitSignature calldata permitSignature - ) external nonReentrant { - debtRepayAmount = getDebtRepayAmount( - debtAsset, - debtRateMode, - buyAllBalanceOffset, - debtRepayAmount, - msg.sender - ); - - // Pull aTokens from user - _pullATokenAndWithdraw(address(collateralAsset), msg.sender, collateralAmount, permitSignature); - //buy debt asset using collateral asset - uint256 amountSold = _buyOnParaSwap( - buyAllBalanceOffset, - paraswapData, - collateralAsset, - debtAsset, - collateralAmount, - debtRepayAmount - ); - - uint256 collateralBalanceLeft = collateralAmount - amountSold; - - //deposit collateral back in the pool, if left after the swap(buy) - if (collateralBalanceLeft > 0) { - IERC20(collateralAsset).approve(address(POOL), 0); - IERC20(collateralAsset).approve(address(POOL), collateralBalanceLeft); - POOL.deposit(address(collateralAsset), collateralBalanceLeft, msg.sender, 0); - } - - // Repay debt. Approves 0 first to comply with tokens that implement the anti frontrunning approval fix - IERC20(debtAsset).approve(address(POOL), 0); - IERC20(debtAsset).approve(address(POOL), debtRepayAmount); - POOL.repay(address(debtAsset), debtRepayAmount, debtRateMode, msg.sender); - } - - /** - * @dev Perform the repay of the debt, pulls the initiator collateral and swaps to repay the flash loan - * @param premium Fee of the flash loan - * @param initiator Address of the user - * @param collateralAsset Address of token to be swapped - * @param collateralAmount Amount of the reserve to be swapped(flash loan amount) - */ - - function _swapAndRepay( - bytes calldata params, - uint256 premium, - address initiator, - IERC20Detailed collateralAsset, - uint256 collateralAmount - ) private { - ( - IERC20Detailed debtAsset, - uint256 debtRepayAmount, - uint256 buyAllBalanceOffset, - uint256 rateMode, - bytes memory paraswapData, - PermitSignature memory permitSignature - ) = abi.decode(params, (IERC20Detailed, uint256, uint256, uint256, bytes, PermitSignature)); - - debtRepayAmount = getDebtRepayAmount( - debtAsset, - rateMode, - buyAllBalanceOffset, - debtRepayAmount, - initiator - ); - - uint256 amountSold = _buyOnParaSwap( - buyAllBalanceOffset, - paraswapData, - collateralAsset, - debtAsset, - collateralAmount, - debtRepayAmount - ); - - // Repay debt. Approves for 0 first to comply with tokens that implement the anti frontrunning approval fix. - IERC20(debtAsset).approve(address(POOL), 0); - IERC20(debtAsset).approve(address(POOL), debtRepayAmount); - POOL.repay(address(debtAsset), debtRepayAmount, rateMode, initiator); - - uint256 neededForFlashLoanRepay = amountSold.add(premium); - - // Pull aTokens from user - _pullATokenAndWithdraw( - address(collateralAsset), - initiator, - neededForFlashLoanRepay, - permitSignature - ); - - // Repay flashloan. Approves for 0 first to comply with tokens that implement the anti frontrunning approval fix. - IERC20(collateralAsset).approve(address(POOL), 0); - IERC20(collateralAsset).approve(address(POOL), collateralAmount.add(premium)); - } - - function getDebtRepayAmount( - IERC20Detailed debtAsset, - uint256 rateMode, - uint256 buyAllBalanceOffset, - uint256 debtRepayAmount, - address initiator - ) private view returns (uint256) { - DataTypes.ReserveData memory debtReserveData = _getReserveData(address(debtAsset)); - - address debtToken = DataTypes.InterestRateMode(rateMode) == DataTypes.InterestRateMode.STABLE - ? debtReserveData.stableDebtTokenAddress - : debtReserveData.variableDebtTokenAddress; - - uint256 currentDebt = IERC20(debtToken).balanceOf(initiator); - - if (buyAllBalanceOffset != 0) { - require(currentDebt <= debtRepayAmount, 'INSUFFICIENT_AMOUNT_TO_REPAY'); - debtRepayAmount = currentDebt; - } else { - require(debtRepayAmount <= currentDebt, 'INVALID_DEBT_REPAY_AMOUNT'); - } - - return debtRepayAmount; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/interfaces/IParaSwapAugustus.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/interfaces/IParaSwapAugustus.sol deleted file mode 100644 index 629f1f6e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/interfaces/IParaSwapAugustus.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -interface IParaSwapAugustus { - function getTokenTransferProxy() external view returns (address); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/interfaces/IParaSwapAugustusRegistry.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/interfaces/IParaSwapAugustusRegistry.sol deleted file mode 100644 index 144e06d4..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/adapters/paraswap/interfaces/IParaSwapAugustusRegistry.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -interface IParaSwapAugustusRegistry { - function isValidAugustus(address augustus) external view returns (bool); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/dependencies/openzeppelin/ReentrancyGuard.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/dependencies/openzeppelin/ReentrancyGuard.sol deleted file mode 100644 index 3891a8a9..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/dependencies/openzeppelin/ReentrancyGuard.sol +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.10; - -/** - * @dev Contract module that helps prevent reentrant calls to a function. - * - * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier - * available, which can be applied to functions to make sure there are no nested - * (reentrant) calls to them. - * - * Note that because there is a single `nonReentrant` guard, functions marked as - * `nonReentrant` may not call one another. This can be worked around by making - * those functions `private`, and then adding `external` `nonReentrant` entry - * points to them. - * - * TIP: If you would like to learn more about reentrancy and alternative ways - * to protect against it, check out our blog post - * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. - */ -abstract contract ReentrancyGuard { - // Booleans are more expensive than uint256 or any type that takes up a full - // word because each write operation emits an extra SLOAD to first read the - // slot's contents, replace the bits taken up by the boolean, and then write - // back. This is the compiler's defense against contract upgrades and - // pointer aliasing, and it cannot be disabled. - - // The values being non-zero value makes deployment a bit more expensive, - // but in exchange the refund on every call to nonReentrant will be lower in - // amount. Since refunds are capped to a percentage of the total - // transaction's gas, it is best to keep them low in cases like this one, to - // increase the likelihood of the full refund coming into effect. - uint256 private constant _NOT_ENTERED = 1; - uint256 private constant _ENTERED = 2; - - uint256 private _status; - - constructor() { - _status = _NOT_ENTERED; - } - - /** - * @dev Prevents a contract from calling itself, directly or indirectly. - * Calling a `nonReentrant` function from another `nonReentrant` - * function is not supported. It is possible to prevent this from happening - * by making the `nonReentrant` function external, and make it call a - * `private` function that does the actual work. - */ - modifier nonReentrant() { - // On the first call to nonReentrant, _notEntered will be true - require(_status != _ENTERED, 'ReentrancyGuard: reentrant call'); - - // Any calls to nonReentrant after this point will fail - _status = _ENTERED; - - _; - - // By storing the original value once again, a refund is triggered (see - // https://eips.ethereum.org/EIPS/eip-2200) - _status = _NOT_ENTERED; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/libraries/DataTypesHelper.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/libraries/DataTypesHelper.sol deleted file mode 100644 index 6b613b66..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/libraries/DataTypesHelper.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {DataTypes} from '@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol'; - -/** - * @title DataTypesHelper - * @author Aave - * @dev Helper library to track user current debt balance, used by WETHGateway - */ -library DataTypesHelper { - /** - * @notice Fetches the user current stable and variable debt balances - * @param user The user address - * @param reserve The reserve data object - * @return The stable debt balance - * @return The variable debt balance - **/ - function getUserCurrentDebt(address user, DataTypes.ReserveData memory reserve) - internal - view - returns (uint256, uint256) - { - return ( - IERC20(reserve.stableDebtTokenAddress).balanceOf(user), - IERC20(reserve.variableDebtTokenAddress).balanceOf(user) - ); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol deleted file mode 100644 index 4867e66e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol +++ /dev/null @@ -1,411 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; -import {IRewardsController} from '../rewards/interfaces/IRewardsController.sol'; -import {IUiIncentiveDataProviderV3} from './interfaces/IUiIncentiveDataProviderV3.sol'; -import {IPool} from '@aave/core-v3/contracts/interfaces/IPool.sol'; -import {IncentivizedERC20} from '@aave/core-v3/contracts/protocol/tokenization/base/IncentivizedERC20.sol'; -import {UserConfiguration} from '@aave/core-v3/contracts/protocol/libraries/configuration/UserConfiguration.sol'; -import {DataTypes} from '@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol'; -import {IERC20Detailed} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {IEACAggregatorProxy} from './interfaces/IEACAggregatorProxy.sol'; - -contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { - using UserConfiguration for DataTypes.UserConfigurationMap; - - constructor() {} - - function getFullReservesIncentiveData(IPoolAddressesProvider provider, address user) - external - view - override - returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory) - { - return (_getReservesIncentivesData(provider), _getUserReservesIncentivesData(provider, user)); - } - - function getReservesIncentivesData(IPoolAddressesProvider provider) - external - view - override - returns (AggregatedReserveIncentiveData[] memory) - { - return _getReservesIncentivesData(provider); - } - - function _getReservesIncentivesData(IPoolAddressesProvider provider) - private - view - returns (AggregatedReserveIncentiveData[] memory) - { - IPool pool = IPool(provider.getPool()); - address[] memory reserves = pool.getReservesList(); - AggregatedReserveIncentiveData[] - memory reservesIncentiveData = new AggregatedReserveIncentiveData[](reserves.length); - // Iterate through the reserves to get all the information from the (a/s/v) Tokens - for (uint256 i = 0; i < reserves.length; i++) { - AggregatedReserveIncentiveData memory reserveIncentiveData = reservesIncentiveData[i]; - reserveIncentiveData.underlyingAsset = reserves[i]; - - DataTypes.ReserveData memory baseData = pool.getReserveData(reserves[i]); - - // Get aTokens rewards information - // TODO: check that this is deployed correctly on contract and remove casting - IRewardsController aTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) - ); - RewardInfo[] memory aRewardsInformation; - if (address(aTokenIncentiveController) != address(0)) { - address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( - baseData.aTokenAddress - ); - - aRewardsInformation = new RewardInfo[](aTokenRewardAddresses.length); - for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { - RewardInfo memory rewardInformation; - rewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; - - ( - rewardInformation.tokenIncentivesIndex, - rewardInformation.emissionPerSecond, - rewardInformation.incentivesLastUpdateTimestamp, - rewardInformation.emissionEndTimestamp - ) = aTokenIncentiveController.getRewardsData( - baseData.aTokenAddress, - rewardInformation.rewardTokenAddress - ); - - rewardInformation.precision = aTokenIncentiveController.getAssetDecimals( - baseData.aTokenAddress - ); - rewardInformation.rewardTokenDecimals = IERC20Detailed( - rewardInformation.rewardTokenAddress - ).decimals(); - rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) - .symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - rewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( - rewardInformation.rewardTokenAddress - ); - rewardInformation.priceFeedDecimals = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).decimals(); - rewardInformation.rewardPriceFeed = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).latestAnswer(); - - aRewardsInformation[j] = rewardInformation; - } - } - - reserveIncentiveData.aIncentiveData = IncentiveData( - baseData.aTokenAddress, - address(aTokenIncentiveController), - aRewardsInformation - ); - - // Get vTokens rewards information - IRewardsController vTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) - ); - address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( - baseData.variableDebtTokenAddress - ); - RewardInfo[] memory vRewardsInformation; - - if (address(vTokenIncentiveController) != address(0)) { - vRewardsInformation = new RewardInfo[](vTokenRewardAddresses.length); - for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { - RewardInfo memory rewardInformation; - rewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; - - ( - rewardInformation.tokenIncentivesIndex, - rewardInformation.emissionPerSecond, - rewardInformation.incentivesLastUpdateTimestamp, - rewardInformation.emissionEndTimestamp - ) = vTokenIncentiveController.getRewardsData( - baseData.variableDebtTokenAddress, - rewardInformation.rewardTokenAddress - ); - - rewardInformation.precision = vTokenIncentiveController.getAssetDecimals( - baseData.variableDebtTokenAddress - ); - rewardInformation.rewardTokenDecimals = IERC20Detailed( - rewardInformation.rewardTokenAddress - ).decimals(); - rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) - .symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - rewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( - rewardInformation.rewardTokenAddress - ); - rewardInformation.priceFeedDecimals = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).decimals(); - rewardInformation.rewardPriceFeed = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).latestAnswer(); - - vRewardsInformation[j] = rewardInformation; - } - } - - reserveIncentiveData.vIncentiveData = IncentiveData( - baseData.variableDebtTokenAddress, - address(vTokenIncentiveController), - vRewardsInformation - ); - - // Get sTokens rewards information - IRewardsController sTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.stableDebtTokenAddress).getIncentivesController()) - ); - address[] memory sTokenRewardAddresses = sTokenIncentiveController.getRewardsByAsset( - baseData.stableDebtTokenAddress - ); - RewardInfo[] memory sRewardsInformation; - - if (address(sTokenIncentiveController) != address(0)) { - sRewardsInformation = new RewardInfo[](sTokenRewardAddresses.length); - for (uint256 j = 0; j < sTokenRewardAddresses.length; ++j) { - RewardInfo memory rewardInformation; - rewardInformation.rewardTokenAddress = sTokenRewardAddresses[j]; - - ( - rewardInformation.tokenIncentivesIndex, - rewardInformation.emissionPerSecond, - rewardInformation.incentivesLastUpdateTimestamp, - rewardInformation.emissionEndTimestamp - ) = sTokenIncentiveController.getRewardsData( - baseData.stableDebtTokenAddress, - rewardInformation.rewardTokenAddress - ); - - rewardInformation.precision = sTokenIncentiveController.getAssetDecimals( - baseData.stableDebtTokenAddress - ); - rewardInformation.rewardTokenDecimals = IERC20Detailed( - rewardInformation.rewardTokenAddress - ).decimals(); - rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) - .symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - rewardInformation.rewardOracleAddress = sTokenIncentiveController.getRewardOracle( - rewardInformation.rewardTokenAddress - ); - rewardInformation.priceFeedDecimals = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).decimals(); - rewardInformation.rewardPriceFeed = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).latestAnswer(); - - sRewardsInformation[j] = rewardInformation; - } - } - - reserveIncentiveData.sIncentiveData = IncentiveData( - baseData.stableDebtTokenAddress, - address(sTokenIncentiveController), - sRewardsInformation - ); - } - - return (reservesIncentiveData); - } - - function getUserReservesIncentivesData(IPoolAddressesProvider provider, address user) - external - view - override - returns (UserReserveIncentiveData[] memory) - { - return _getUserReservesIncentivesData(provider, user); - } - - function _getUserReservesIncentivesData(IPoolAddressesProvider provider, address user) - private - view - returns (UserReserveIncentiveData[] memory) - { - IPool pool = IPool(provider.getPool()); - address[] memory reserves = pool.getReservesList(); - - UserReserveIncentiveData[] memory userReservesIncentivesData = new UserReserveIncentiveData[]( - user != address(0) ? reserves.length : 0 - ); - - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveData memory baseData = pool.getReserveData(reserves[i]); - - // user reserve data - userReservesIncentivesData[i].underlyingAsset = reserves[i]; - - IRewardsController aTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) - ); - if (address(aTokenIncentiveController) != address(0)) { - // get all rewards information from the asset - address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( - baseData.aTokenAddress - ); - UserRewardInfo[] memory aUserRewardsInformation = new UserRewardInfo[]( - aTokenRewardAddresses.length - ); - for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { - UserRewardInfo memory userRewardInformation; - userRewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; - - userRewardInformation.tokenIncentivesUserIndex = aTokenIncentiveController - .getUserAssetIndex( - user, - baseData.aTokenAddress, - userRewardInformation.rewardTokenAddress - ); - - userRewardInformation.userUnclaimedRewards = aTokenIncentiveController - .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); - userRewardInformation.rewardTokenDecimals = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).decimals(); - userRewardInformation.rewardTokenSymbol = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - userRewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( - userRewardInformation.rewardTokenAddress - ); - userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).decimals(); - userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).latestAnswer(); - - aUserRewardsInformation[j] = userRewardInformation; - } - - userReservesIncentivesData[i].aTokenIncentivesUserData = UserIncentiveData( - baseData.aTokenAddress, - address(aTokenIncentiveController), - aUserRewardsInformation - ); - } - - // variable debt token - IRewardsController vTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) - ); - if (address(vTokenIncentiveController) != address(0)) { - // get all rewards information from the asset - address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( - baseData.variableDebtTokenAddress - ); - UserRewardInfo[] memory vUserRewardsInformation = new UserRewardInfo[]( - vTokenRewardAddresses.length - ); - for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { - UserRewardInfo memory userRewardInformation; - userRewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; - - userRewardInformation.tokenIncentivesUserIndex = vTokenIncentiveController - .getUserAssetIndex( - user, - baseData.variableDebtTokenAddress, - userRewardInformation.rewardTokenAddress - ); - - userRewardInformation.userUnclaimedRewards = vTokenIncentiveController - .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); - userRewardInformation.rewardTokenDecimals = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).decimals(); - userRewardInformation.rewardTokenSymbol = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - userRewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( - userRewardInformation.rewardTokenAddress - ); - userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).decimals(); - userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).latestAnswer(); - - vUserRewardsInformation[j] = userRewardInformation; - } - - userReservesIncentivesData[i].vTokenIncentivesUserData = UserIncentiveData( - baseData.variableDebtTokenAddress, - address(aTokenIncentiveController), - vUserRewardsInformation - ); - } - - // stable debt toekn - IRewardsController sTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.stableDebtTokenAddress).getIncentivesController()) - ); - if (address(sTokenIncentiveController) != address(0)) { - // get all rewards information from the asset - address[] memory sTokenRewardAddresses = sTokenIncentiveController.getRewardsByAsset( - baseData.stableDebtTokenAddress - ); - UserRewardInfo[] memory sUserRewardsInformation = new UserRewardInfo[]( - sTokenRewardAddresses.length - ); - for (uint256 j = 0; j < sTokenRewardAddresses.length; ++j) { - UserRewardInfo memory userRewardInformation; - userRewardInformation.rewardTokenAddress = sTokenRewardAddresses[j]; - - userRewardInformation.tokenIncentivesUserIndex = sTokenIncentiveController - .getUserAssetIndex( - user, - baseData.stableDebtTokenAddress, - userRewardInformation.rewardTokenAddress - ); - - userRewardInformation.userUnclaimedRewards = sTokenIncentiveController - .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); - userRewardInformation.rewardTokenDecimals = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).decimals(); - userRewardInformation.rewardTokenSymbol = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - userRewardInformation.rewardOracleAddress = sTokenIncentiveController.getRewardOracle( - userRewardInformation.rewardTokenAddress - ); - userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).decimals(); - userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).latestAnswer(); - - sUserRewardsInformation[j] = userRewardInformation; - } - - userReservesIncentivesData[i].sTokenIncentivesUserData = UserIncentiveData( - baseData.stableDebtTokenAddress, - address(aTokenIncentiveController), - sUserRewardsInformation - ); - } - } - - return (userReservesIncentivesData); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol deleted file mode 100644 index 857e1874..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol +++ /dev/null @@ -1,262 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {IERC20Detailed} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; -import {IUiPoolDataProviderV3} from './interfaces/IUiPoolDataProviderV3.sol'; -import {IPool} from '@aave/core-v3/contracts/interfaces/IPool.sol'; -import {IAaveOracle} from '@aave/core-v3/contracts/interfaces/IAaveOracle.sol'; -import {IAToken} from '@aave/core-v3/contracts/interfaces/IAToken.sol'; -import {IVariableDebtToken} from '@aave/core-v3/contracts/interfaces/IVariableDebtToken.sol'; -import {IStableDebtToken} from '@aave/core-v3/contracts/interfaces/IStableDebtToken.sol'; -import {WadRayMath} from '@aave/core-v3/contracts/protocol/libraries/math/WadRayMath.sol'; -import {ReserveConfiguration} from '@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '@aave/core-v3/contracts/protocol/libraries/configuration/UserConfiguration.sol'; -import {DataTypes} from '@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol'; -import { - DefaultReserveInterestRateStrategy -} from '@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol'; -import {IEACAggregatorProxy} from './interfaces/IEACAggregatorProxy.sol'; -import {IERC20DetailedBytes} from './interfaces/IERC20DetailedBytes.sol'; -import {AaveProtocolDataProvider} from '@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol'; - -contract UiPoolDataProviderV3 is IUiPoolDataProviderV3 { - using WadRayMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - IEACAggregatorProxy public immutable networkBaseTokenPriceInUsdProxyAggregator; - IEACAggregatorProxy public immutable marketReferenceCurrencyPriceInUsdProxyAggregator; - uint256 public constant ETH_CURRENCY_UNIT = 1 ether; - address public constant MKR_ADDRESS = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; - - - constructor( - IEACAggregatorProxy _networkBaseTokenPriceInUsdProxyAggregator, - IEACAggregatorProxy _marketReferenceCurrencyPriceInUsdProxyAggregator - ) { - networkBaseTokenPriceInUsdProxyAggregator = _networkBaseTokenPriceInUsdProxyAggregator; - marketReferenceCurrencyPriceInUsdProxyAggregator = _marketReferenceCurrencyPriceInUsdProxyAggregator; - } - - function getInterestRateStrategySlopes(DefaultReserveInterestRateStrategy interestRateStrategy) - internal - view - returns ( - InterestRates memory - ) - { - InterestRates memory interestRates; - interestRates.variableRateSlope1 = interestRateStrategy.getVariableRateSlope1(); - interestRates.variableRateSlope2 = interestRateStrategy.getVariableRateSlope2(); - interestRates.stableRateSlope1 = interestRateStrategy.getStableRateSlope1(); - interestRates.stableRateSlope2 = interestRateStrategy.getStableRateSlope2(); - interestRates.baseStableBorrowRate = interestRateStrategy.getBaseStableBorrowRate(); - interestRates.baseVariableBorrowRate = interestRateStrategy.getBaseVariableBorrowRate(); - interestRates.optimalUsageRatio = interestRateStrategy.OPTIMAL_USAGE_RATIO(); - - return interestRates; - } - - function getReservesList(IPoolAddressesProvider provider) - public - view - override - returns (address[] memory) - { - IPool pool = IPool(provider.getPool()); - return pool.getReservesList(); - } - - function getReservesData(IPoolAddressesProvider provider) - public - view - override - returns ( - AggregatedReserveData[] memory, - BaseCurrencyInfo memory - ) - { - IAaveOracle oracle = IAaveOracle(provider.getPriceOracle()); - IPool pool = IPool(provider.getPool()); - AaveProtocolDataProvider poolDataProvider = AaveProtocolDataProvider(provider.getPoolDataProvider()); - - address[] memory reserves = pool.getReservesList(); - AggregatedReserveData[] memory reservesData = new AggregatedReserveData[](reserves.length); - - for (uint256 i = 0; i < reserves.length; i++) { - AggregatedReserveData memory reserveData = reservesData[i]; - reserveData.underlyingAsset = reserves[i]; - - // reserve current state - DataTypes.ReserveData memory baseData = - pool.getReserveData(reserveData.underlyingAsset); - //the liquidity index. Expressed in ray - reserveData.liquidityIndex = baseData.liquidityIndex; - //variable borrow index. Expressed in ray - reserveData.variableBorrowIndex = baseData.variableBorrowIndex; - //the current supply rate. Expressed in ray - reserveData.liquidityRate = baseData.currentLiquidityRate; - //the current variable borrow rate. Expressed in ray - reserveData.variableBorrowRate = baseData.currentVariableBorrowRate; - //the current stable borrow rate. Expressed in ray - reserveData.stableBorrowRate = baseData.currentStableBorrowRate; - reserveData.lastUpdateTimestamp = baseData.lastUpdateTimestamp; - reserveData.aTokenAddress = baseData.aTokenAddress; - reserveData.stableDebtTokenAddress = baseData.stableDebtTokenAddress; - reserveData.variableDebtTokenAddress = baseData.variableDebtTokenAddress; - //address of the interest rate strategy - reserveData.interestRateStrategyAddress = baseData.interestRateStrategyAddress; - reserveData.priceInMarketReferenceCurrency = oracle.getAssetPrice(reserveData.underlyingAsset); - reserveData.priceOracle = oracle.getSourceOfAsset(reserveData.underlyingAsset); - reserveData.availableLiquidity = IERC20Detailed(reserveData.underlyingAsset).balanceOf( - reserveData.aTokenAddress - ); - ( - reserveData.totalPrincipalStableDebt, - , - reserveData.averageStableRate, - reserveData.stableDebtLastUpdateTimestamp - ) = IStableDebtToken(reserveData.stableDebtTokenAddress).getSupplyData(); - reserveData.totalScaledVariableDebt = IVariableDebtToken(reserveData.variableDebtTokenAddress) - .scaledTotalSupply(); - - // Due we take the symbol from underlying token we need a special case for $MKR as symbol() returns bytes32 - if (address(reserveData.underlyingAsset) == address(MKR_ADDRESS)) { - bytes32 symbol = IERC20DetailedBytes(reserveData.underlyingAsset).symbol(); - reserveData.symbol = bytes32ToString(symbol); - } else { - reserveData.symbol = IERC20Detailed(reserveData.underlyingAsset).symbol(); - } - - //stores the reserve configuration - DataTypes.ReserveConfigurationMap memory reserveConfigurationMap = baseData.configuration; - uint256 eModeCategoryId; - ( - reserveData.baseLTVasCollateral, - reserveData.reserveLiquidationThreshold, - reserveData.reserveLiquidationBonus, - reserveData.decimals, - reserveData.reserveFactor, - eModeCategoryId - ) = reserveConfigurationMap.getParams(); - reserveData.usageAsCollateralEnabled = reserveData.baseLTVasCollateral != 0; - - bool isPaused; - ( - reserveData.isActive, - reserveData.isFrozen, - reserveData.borrowingEnabled, - reserveData.stableBorrowRateEnabled, - isPaused - ) = reserveConfigurationMap.getFlags(); - - InterestRates memory interestRates = getInterestRateStrategySlopes( - DefaultReserveInterestRateStrategy(reserveData.interestRateStrategyAddress) - ); - - reserveData.variableRateSlope1 = interestRates.variableRateSlope1; - reserveData.variableRateSlope2 = interestRates.variableRateSlope2; - reserveData.stableRateSlope1 = interestRates.stableRateSlope1; - reserveData.stableRateSlope2 = interestRates.stableRateSlope2; - reserveData.baseStableBorrowRate = interestRates.baseStableBorrowRate; - reserveData.baseVariableBorrowRate = interestRates.baseVariableBorrowRate; - reserveData.optimalUsageRatio = interestRates.optimalUsageRatio; - - // v3 only - reserveData.eModeCategoryId = uint8(eModeCategoryId); - reserveData.debtCeiling = reserveConfigurationMap.getDebtCeiling(); - reserveData.debtCeilingDecimals = poolDataProvider.getDebtCeilingDecimals(); - (reserveData.borrowCap, reserveData.supplyCap) = reserveConfigurationMap.getCaps(); - - reserveData.isPaused = isPaused; - reserveData.unbacked = baseData.unbacked; - reserveData.isolationModeTotalDebt = baseData.isolationModeTotalDebt; - reserveData.accruedToTreasury = baseData.accruedToTreasury; - - DataTypes.EModeCategory memory categoryData = pool.getEModeCategoryData(reserveData.eModeCategoryId); - reserveData.eModeLtv = categoryData.ltv; - reserveData.eModeLiquidationThreshold = categoryData.liquidationThreshold; - reserveData.eModeLiquidationBonus = categoryData.liquidationBonus; - // each eMode category may or may not have a custom oracle to override the individual assets price oracles - reserveData.eModePriceSource = categoryData.priceSource; - reserveData.eModeLabel = categoryData.label; - - reserveData.borrowableInIsolation = reserveConfigurationMap.getBorrowableInIsolation(); - } - - BaseCurrencyInfo memory baseCurrencyInfo; - baseCurrencyInfo.networkBaseTokenPriceInUsd = networkBaseTokenPriceInUsdProxyAggregator.latestAnswer(); - baseCurrencyInfo.networkBaseTokenPriceDecimals = networkBaseTokenPriceInUsdProxyAggregator.decimals(); - - try oracle.BASE_CURRENCY_UNIT() returns (uint256 baseCurrencyUnit) { - baseCurrencyInfo.marketReferenceCurrencyUnit = baseCurrencyUnit; - baseCurrencyInfo.marketReferenceCurrencyPriceInUsd = int256(baseCurrencyUnit); - } catch (bytes memory /*lowLevelData*/) { - baseCurrencyInfo.marketReferenceCurrencyUnit = ETH_CURRENCY_UNIT; - baseCurrencyInfo.marketReferenceCurrencyPriceInUsd = marketReferenceCurrencyPriceInUsdProxyAggregator.latestAnswer(); - } - - return (reservesData, baseCurrencyInfo); - } - - function getUserReservesData(IPoolAddressesProvider provider, address user) - external - view - override - returns (UserReserveData[] memory, uint8) - { - IPool pool = IPool(provider.getPool()); - address[] memory reserves = pool.getReservesList(); - DataTypes.UserConfigurationMap memory userConfig = pool.getUserConfiguration(user); - - uint8 userEmodeCategoryId = uint8(pool.getUserEMode(user)); - - UserReserveData[] memory userReservesData = - new UserReserveData[](user != address(0) ? reserves.length : 0); - - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveData memory baseData = pool.getReserveData(reserves[i]); - - // user reserve data - userReservesData[i].underlyingAsset = reserves[i]; - userReservesData[i].scaledATokenBalance = IAToken(baseData.aTokenAddress).scaledBalanceOf( - user - ); - userReservesData[i].usageAsCollateralEnabledOnUser = userConfig.isUsingAsCollateral(i); - - if (userConfig.isBorrowing(i)) { - userReservesData[i].scaledVariableDebt = IVariableDebtToken( - baseData - .variableDebtTokenAddress - ) - .scaledBalanceOf(user); - userReservesData[i].principalStableDebt = IStableDebtToken(baseData.stableDebtTokenAddress) - .principalBalanceOf(user); - if (userReservesData[i].principalStableDebt != 0) { - userReservesData[i].stableBorrowRate = IStableDebtToken(baseData.stableDebtTokenAddress) - .getUserStableRate(user); - userReservesData[i].stableBorrowLastUpdateTimestamp = IStableDebtToken( - baseData - .stableDebtTokenAddress - ) - .getUserLastUpdated(user); - } - } - } - - return (userReservesData, userEmodeCategoryId); - } - - function bytes32ToString(bytes32 _bytes32) public pure returns (string memory) { - uint8 i = 0; - while (i < 32 && _bytes32[i] != 0) { - i++; - } - bytes memory bytesArray = new bytes(i); - for (i = 0; i < 32 && _bytes32[i] != 0; i++) { - bytesArray[i] = _bytes32[i]; - } - return string(bytesArray); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/WETHGateway.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/WETHGateway.sol deleted file mode 100644 index f56a994a..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/WETHGateway.sol +++ /dev/null @@ -1,218 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {Ownable} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {IWETH} from './interfaces/IWETH.sol'; -import {IWETHGateway} from './interfaces/IWETHGateway.sol'; -import {IPool} from '@aave/core-v3/contracts/interfaces/IPool.sol'; -import {IAToken} from '@aave/core-v3/contracts/interfaces/IAToken.sol'; -import {ReserveConfiguration} from '@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '@aave/core-v3/contracts/protocol/libraries/configuration/UserConfiguration.sol'; -import {DataTypes} from '@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol'; -import {DataTypesHelper} from '../libraries/DataTypesHelper.sol'; - -contract WETHGateway is IWETHGateway, Ownable { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - IWETH internal immutable WETH; - - /** - * @dev Sets the WETH address and the PoolAddressesProvider address. Infinite approves pool. - * @param weth Address of the Wrapped Ether contract - * @param owner Address of the owner of this contract - **/ - constructor(address weth, address owner) { - WETH = IWETH(weth); - transferOwnership(owner); - } - - function authorizePool(address pool) external onlyOwner { - WETH.approve(pool, type(uint256).max); - } - - /** - * @dev deposits WETH into the reserve, using native ETH. A corresponding amount of the overlying asset (aTokens) - * is minted. - * @param pool address of the targeted underlying pool - * @param onBehalfOf address of the user who will receive the aTokens representing the deposit - * @param referralCode integrators are assigned a referral code and can potentially receive rewards. - **/ - function depositETH( - address pool, - address onBehalfOf, - uint16 referralCode - ) external payable override { - WETH.deposit{value: msg.value}(); - IPool(pool).deposit(address(WETH), msg.value, onBehalfOf, referralCode); - } - - /** - * @dev withdraws the WETH _reserves of msg.sender. - * @param pool address of the targeted underlying pool - * @param amount amount of aWETH to withdraw and receive native ETH - * @param to address of the user who will receive native ETH - */ - function withdrawETH( - address pool, - uint256 amount, - address to - ) external override { - IAToken aWETH = IAToken(IPool(pool).getReserveData(address(WETH)).aTokenAddress); - uint256 userBalance = aWETH.balanceOf(msg.sender); - uint256 amountToWithdraw = amount; - - // if amount is equal to uint(-1), the user wants to redeem everything - if (amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); - IPool(pool).withdraw(address(WETH), amountToWithdraw, address(this)); - WETH.withdraw(amountToWithdraw); - _safeTransferETH(to, amountToWithdraw); - } - - /** - * @dev repays a borrow on the WETH reserve, for the specified amount (or for the whole amount, if uint256(-1) is specified). - * @param pool address of the targeted underlying pool - * @param amount the amount to repay, or uint256(-1) if the user wants to repay everything - * @param rateMode the rate mode to repay - * @param onBehalfOf the address for which msg.sender is repaying - */ - function repayETH( - address pool, - uint256 amount, - uint256 rateMode, - address onBehalfOf - ) external payable override { - (uint256 stableDebt, uint256 variableDebt) = DataTypesHelper.getUserCurrentDebt( - onBehalfOf, - IPool(pool).getReserveData(address(WETH)) - ); - - uint256 paybackAmount = DataTypes.InterestRateMode(rateMode) == - DataTypes.InterestRateMode.STABLE - ? stableDebt - : variableDebt; - - if (amount < paybackAmount) { - paybackAmount = amount; - } - require(msg.value >= paybackAmount, 'msg.value is less than repayment amount'); - WETH.deposit{value: paybackAmount}(); - IPool(pool).repay(address(WETH), msg.value, rateMode, onBehalfOf); - - // refund remaining dust eth - if (msg.value > paybackAmount) _safeTransferETH(msg.sender, msg.value - paybackAmount); - } - - /** - * @dev borrow WETH, unwraps to ETH and send both the ETH and DebtTokens to msg.sender, via `approveDelegation` and onBehalf argument in `Pool.borrow`. - * @param pool address of the targeted underlying pool - * @param amount the amount of ETH to borrow - * @param interesRateMode the interest rate mode - * @param referralCode integrators are assigned a referral code and can potentially receive rewards - */ - function borrowETH( - address pool, - uint256 amount, - uint256 interesRateMode, - uint16 referralCode - ) external override { - IPool(pool).borrow(address(WETH), amount, interesRateMode, referralCode, msg.sender); - WETH.withdraw(amount); - _safeTransferETH(msg.sender, amount); - } - - /** - * @dev withdraws the WETH _reserves of msg.sender. - * @param pool address of the targeted underlying pool - * @param amount amount of aWETH to withdraw and receive native ETH - * @param to address of the user who will receive native ETH - * @param deadline validity deadline of permit and so depositWithPermit signature - * @param permitV V parameter of ERC712 permit sig - * @param permitR R parameter of ERC712 permit sig - * @param permitS S parameter of ERC712 permit sig - */ - function withdrawETHWithPermit( - address pool, - uint256 amount, - address to, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external override { - IAToken aWETH = IAToken(IPool(pool).getReserveData(address(WETH)).aTokenAddress); - uint256 userBalance = aWETH.balanceOf(msg.sender); - uint256 amountToWithdraw = amount; - - // if amount is equal to uint(-1), the user wants to redeem everything - if (amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - // chosing to permit `amount`and not `amountToWithdraw`, easier for frontends, intregrators. - aWETH.permit(msg.sender, address(this), amount, deadline, permitV, permitR, permitS); - aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); - IPool(pool).withdraw(address(WETH), amountToWithdraw, address(this)); - WETH.withdraw(amountToWithdraw); - _safeTransferETH(to, amountToWithdraw); - } - - /** - * @dev transfer ETH to an address, revert if it fails. - * @param to recipient of the transfer - * @param value the amount to send - */ - function _safeTransferETH(address to, uint256 value) internal { - (bool success, ) = to.call{value: value}(new bytes(0)); - require(success, 'ETH_TRANSFER_FAILED'); - } - - /** - * @dev transfer ERC20 from the utility contract, for ERC20 recovery in case of stuck tokens due - * direct transfers to the contract address. - * @param token token to transfer - * @param to recipient of the transfer - * @param amount amount to send - */ - function emergencyTokenTransfer( - address token, - address to, - uint256 amount - ) external onlyOwner { - IERC20(token).transfer(to, amount); - } - - /** - * @dev transfer native Ether from the utility contract, for native Ether recovery in case of stuck Ether - * due selfdestructs or transfer ether to pre-computated contract address before deployment. - * @param to recipient of the transfer - * @param amount amount to send - */ - function emergencyEtherTransfer(address to, uint256 amount) external onlyOwner { - _safeTransferETH(to, amount); - } - - /** - * @dev Get WETH address used by WETHGateway - */ - function getWETHAddress() external view returns (address) { - return address(WETH); - } - - /** - * @dev Only WETH contract is allowed to transfer ETH here. Prevent other addresses to send Ether to this contract. - */ - receive() external payable { - require(msg.sender == address(WETH), 'Receive not allowed'); - } - - /** - * @dev Revert fallback calls - */ - fallback() external payable { - revert('Fallback not allowed'); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol deleted file mode 100644 index a5e42e86..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol +++ /dev/null @@ -1,110 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {Address} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; - -import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '@aave/core-v3/contracts/interfaces/IPool.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {ReserveConfiguration} from '@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol'; -import {DataTypes} from '@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol'; - -/** - * @title WalletBalanceProvider contract - * @author Aave, influenced by https://github.com/wbobeirne/eth-balance-checker/blob/master/contracts/BalanceChecker.sol - * @notice Implements a logic of getting multiple tokens balance for one user address - * @dev NOTE: THIS CONTRACT IS NOT USED WITHIN THE AAVE PROTOCOL. It's an accessory contract used to reduce the number of calls - * towards the blockchain from the Aave backend. - **/ -contract WalletBalanceProvider { - using Address for address payable; - using Address for address; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - address constant MOCK_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /** - @dev Fallback function, don't accept any ETH - **/ - receive() external payable { - //only contracts can send ETH to the core - require(msg.sender.isContract(), '22'); - } - - /** - @dev Check the token balance of a wallet in a token contract - - Returns the balance of the token for user. Avoids possible errors: - - return 0 on non-contract address - **/ - function balanceOf(address user, address token) public view returns (uint256) { - if (token == MOCK_ETH_ADDRESS) { - return user.balance; // ETH balance - // check if token is actually a contract - } else if (token.isContract()) { - return IERC20(token).balanceOf(user); - } - revert('INVALID_TOKEN'); - } - - /** - * @notice Fetches, for a list of _users and _tokens (ETH included with mock address), the balances - * @param users The list of users - * @param tokens The list of tokens - * @return And array with the concatenation of, for each user, his/her balances - **/ - function batchBalanceOf(address[] calldata users, address[] calldata tokens) - external - view - returns (uint256[] memory) - { - uint256[] memory balances = new uint256[](users.length * tokens.length); - - for (uint256 i = 0; i < users.length; i++) { - for (uint256 j = 0; j < tokens.length; j++) { - balances[i * tokens.length + j] = balanceOf(users[i], tokens[j]); - } - } - - return balances; - } - - /** - @dev provides balances of user wallet for all reserves available on the pool - */ - function getUserWalletBalances(address provider, address user) - external - view - returns (address[] memory, uint256[] memory) - { - IPool pool = IPool(IPoolAddressesProvider(provider).getPool()); - - address[] memory reserves = pool.getReservesList(); - address[] memory reservesWithEth = new address[](reserves.length + 1); - for (uint256 i = 0; i < reserves.length; i++) { - reservesWithEth[i] = reserves[i]; - } - reservesWithEth[reserves.length] = MOCK_ETH_ADDRESS; - - uint256[] memory balances = new uint256[](reservesWithEth.length); - - for (uint256 j = 0; j < reserves.length; j++) { - DataTypes.ReserveConfigurationMap memory configuration = pool.getConfiguration( - reservesWithEth[j] - ); - - (bool isActive, , , , ) = configuration.getFlags(); - - if (!isActive) { - balances[j] = 0; - continue; - } - balances[j] = balanceOf(user, reservesWithEth[j]); - } - balances[reserves.length] = balanceOf(user, MOCK_ETH_ADDRESS); - - return (reservesWithEth, balances); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol deleted file mode 100644 index ddb6f137..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IEACAggregatorProxy.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IERC20DetailedBytes.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IERC20DetailedBytes.sol deleted file mode 100644 index 15aa07dc..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IERC20DetailedBytes.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; - -interface IERC20DetailedBytes is IERC20 { - function name() external view returns (bytes32); - - function symbol() external view returns (bytes32); - - function decimals() external view returns (uint8); -} \ No newline at end of file diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IUiIncentiveDataProviderV3.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IUiIncentiveDataProviderV3.sol deleted file mode 100644 index ec3832f3..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IUiIncentiveDataProviderV3.sol +++ /dev/null @@ -1,74 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; - -interface IUiIncentiveDataProviderV3 { - struct AggregatedReserveIncentiveData { - address underlyingAsset; - IncentiveData aIncentiveData; - IncentiveData vIncentiveData; - IncentiveData sIncentiveData; - } - - struct IncentiveData { - address tokenAddress; - address incentiveControllerAddress; - RewardInfo[] rewardsTokenInformation; - } - - struct RewardInfo { - string rewardTokenSymbol; - address rewardTokenAddress; - address rewardOracleAddress; - uint256 emissionPerSecond; - uint256 incentivesLastUpdateTimestamp; - uint256 tokenIncentivesIndex; - uint256 emissionEndTimestamp; - int256 rewardPriceFeed; - uint8 rewardTokenDecimals; - uint8 precision; - uint8 priceFeedDecimals; - } - - struct UserReserveIncentiveData { - address underlyingAsset; - UserIncentiveData aTokenIncentivesUserData; - UserIncentiveData vTokenIncentivesUserData; - UserIncentiveData sTokenIncentivesUserData; - } - - struct UserIncentiveData { - address tokenAddress; - address incentiveControllerAddress; - UserRewardInfo[] userRewardsInformation; - } - - struct UserRewardInfo { - string rewardTokenSymbol; - address rewardOracleAddress; - address rewardTokenAddress; - uint256 userUnclaimedRewards; - uint256 tokenIncentivesUserIndex; - int256 rewardPriceFeed; - uint8 priceFeedDecimals; - uint8 rewardTokenDecimals; - - } - - function getReservesIncentivesData(IPoolAddressesProvider provider) - external - view - returns (AggregatedReserveIncentiveData[] memory); - - function getUserReservesIncentivesData(IPoolAddressesProvider provider, address user) - external - view - returns (UserReserveIncentiveData[] memory); - - // generic method with full data - function getFullReservesIncentiveData(IPoolAddressesProvider provider, address user) - external - view - returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory); -} \ No newline at end of file diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IUiPoolDataProviderV3.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IUiPoolDataProviderV3.sol deleted file mode 100644 index 2918ed71..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IUiPoolDataProviderV3.sol +++ /dev/null @@ -1,114 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; -import {DataTypes} from '@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol'; - -interface IUiPoolDataProviderV3 { - struct InterestRates { - uint256 variableRateSlope1; - uint256 variableRateSlope2; - uint256 stableRateSlope1; - uint256 stableRateSlope2; - uint256 baseStableBorrowRate; - uint256 baseVariableBorrowRate; - uint256 optimalUsageRatio; - } - - struct AggregatedReserveData { - address underlyingAsset; - string name; - string symbol; - uint256 decimals; - uint256 baseLTVasCollateral; - uint256 reserveLiquidationThreshold; - uint256 reserveLiquidationBonus; - uint256 reserveFactor; - bool usageAsCollateralEnabled; - bool borrowingEnabled; - bool stableBorrowRateEnabled; - bool isActive; - bool isFrozen; - // base data - uint128 liquidityIndex; - uint128 variableBorrowIndex; - uint128 liquidityRate; - uint128 variableBorrowRate; - uint128 stableBorrowRate; - uint40 lastUpdateTimestamp; - address aTokenAddress; - address stableDebtTokenAddress; - address variableDebtTokenAddress; - address interestRateStrategyAddress; - // - uint256 availableLiquidity; - uint256 totalPrincipalStableDebt; - uint256 averageStableRate; - uint256 stableDebtLastUpdateTimestamp; - uint256 totalScaledVariableDebt; - uint256 priceInMarketReferenceCurrency; - address priceOracle; - uint256 variableRateSlope1; - uint256 variableRateSlope2; - uint256 stableRateSlope1; - uint256 stableRateSlope2; - uint256 baseStableBorrowRate; - uint256 baseVariableBorrowRate; - uint256 optimalUsageRatio; - // v3 only - bool isPaused; - uint128 accruedToTreasury; - uint128 unbacked; - uint128 isolationModeTotalDebt; - // - uint256 debtCeiling; - uint256 debtCeilingDecimals; - uint8 eModeCategoryId; - uint256 borrowCap; - uint256 supplyCap; - // eMode - uint16 eModeLtv; - uint16 eModeLiquidationThreshold; - uint16 eModeLiquidationBonus; - address eModePriceSource; - string eModeLabel; - bool borrowableInIsolation; - } - - struct UserReserveData { - address underlyingAsset; - uint256 scaledATokenBalance; - bool usageAsCollateralEnabledOnUser; - uint256 stableBorrowRate; - uint256 scaledVariableDebt; - uint256 principalStableDebt; - uint256 stableBorrowLastUpdateTimestamp; - } - - struct BaseCurrencyInfo { - uint256 marketReferenceCurrencyUnit; - int256 marketReferenceCurrencyPriceInUsd; - int256 networkBaseTokenPriceInUsd; - uint8 networkBaseTokenPriceDecimals; - } - - function getReservesList(IPoolAddressesProvider provider) - external - view - returns (address[] memory); - - function getReservesData(IPoolAddressesProvider provider) - external - view - returns ( - AggregatedReserveData[] memory, - BaseCurrencyInfo memory - ); - - function getUserReservesData(IPoolAddressesProvider provider, address user) - external - view - returns ( - UserReserveData[] memory, uint8 - ); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IWETH.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IWETH.sol deleted file mode 100644 index 071b5d69..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IWETH.sol +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -interface IWETH { - function deposit() external payable; - - function withdraw(uint256) external; - - function approve(address guy, uint256 wad) external returns (bool); - - function transferFrom( - address src, - address dst, - uint256 wad - ) external returns (bool); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IWETHGateway.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IWETHGateway.sol deleted file mode 100644 index 56bafdf5..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/misc/interfaces/IWETHGateway.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -interface IWETHGateway { - function depositETH( - address pool, - address onBehalfOf, - uint16 referralCode - ) external payable; - - function withdrawETH( - address pool, - uint256 amount, - address onBehalfOf - ) external; - - function repayETH( - address pool, - uint256 amount, - uint256 rateMode, - address onBehalfOf - ) external payable; - - function borrowETH( - address pool, - uint256 amount, - uint256 interesRateMode, - uint16 referralCode - ) external; - - function withdrawETHWithPermit( - address pool, - uint256 amount, - address to, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/RewardsController.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/RewardsController.sol deleted file mode 100644 index 062dce7e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/RewardsController.sol +++ /dev/null @@ -1,367 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {SafeCast} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IScaledBalanceToken} from '@aave/core-v3/contracts/interfaces/IScaledBalanceToken.sol'; -import {RewardsDistributor} from './RewardsDistributor.sol'; -import {IRewardsController} from './interfaces/IRewardsController.sol'; -import {ITransferStrategyBase} from './interfaces/ITransferStrategyBase.sol'; -import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol'; -import {IEACAggregatorProxy} from '../misc/interfaces/IEACAggregatorProxy.sol'; - -/** - * @title RewardsController - * @notice Abstract contract template to build Distributors contracts for ERC20 rewards to protocol participants - * @author Aave - **/ -contract RewardsController is RewardsDistributor, VersionedInitializable, IRewardsController { - using SafeCast for uint256; - - uint256 public constant REVISION = 1; - - // This mapping allows whitelisted addresses to claim on behalf of others - // useful for contracts that hold tokens to be rewarded but don't have any native logic to claim Liquidity Mining rewards - mapping(address => address) internal _authorizedClaimers; - - // reward => transfer strategy implementation contract - // The TransferStrategy contract abstracts the logic regarding - // the source of the reward and how to transfer it to the user. - mapping(address => ITransferStrategyBase) internal _transferStrategy; - - // This mapping contains the price oracle per reward. - // A price oracle is enforced for integrators to be able to show incentives at - // the current Aave UI without the need to setup an external price registry - // At the moment of reward configuration, the Incentives Controller performs - // a check to see if the provided reward oracle contains `latestAnswer`. - mapping(address => IEACAggregatorProxy) internal _rewardOracle; - - modifier onlyAuthorizedClaimers(address claimer, address user) { - require(_authorizedClaimers[user] == claimer, 'CLAIMER_UNAUTHORIZED'); - _; - } - - constructor(address emissionManager) RewardsDistributor(emissionManager) {} - - /** - * @dev Empty initialize for RewardsController - **/ - function initialize() external initializer {} - - /// @inheritdoc IRewardsController - function getClaimer(address user) external view override returns (address) { - return _authorizedClaimers[user]; - } - - /** - * @dev Returns the revision of the implementation contract - * @return uint256, current revision version - */ - function getRevision() internal pure override returns (uint256) { - return REVISION; - } - - /// @inheritdoc IRewardsController - function getRewardOracle(address reward) external view override returns (address) { - return address(_rewardOracle[reward]); - } - - /// @inheritdoc IRewardsController - function getTransferStrategy(address reward) external view override returns (address) { - return address(_transferStrategy[reward]); - } - - /// @inheritdoc IRewardsController - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) - external - override - onlyEmissionManager - { - for (uint256 i = 0; i < config.length; i++) { - // Get the current Scaled Total Supply of AToken or Debt token - config[i].totalSupply = IScaledBalanceToken(config[i].asset).scaledTotalSupply(); - - // Install TransferStrategy logic at IncentivesController - _installTransferStrategy(config[i].reward, config[i].transferStrategy); - - // Set reward oracle, enforces input oracle to have latestPrice function - _setRewardOracle(config[i].reward, config[i].rewardOracle); - } - _configureAssets(config); - } - - /// @inheritdoc IRewardsController - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) - external - onlyEmissionManager - { - _installTransferStrategy(reward, transferStrategy); - } - - /// @inheritdoc IRewardsController - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) - external - onlyEmissionManager - { - _setRewardOracle(reward, rewardOracle); - } - - /// @inheritdoc IRewardsController - function handleAction( - address user, - uint256 totalSupply, - uint256 userBalance - ) external override { - _updateData(msg.sender, user, userBalance, totalSupply); - } - - /// @inheritdoc IRewardsController - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external override returns (uint256) { - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimRewards(assets, amount, msg.sender, msg.sender, to, reward); - } - - /// @inheritdoc IRewardsController - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external override onlyAuthorizedClaimers(msg.sender, user) returns (uint256) { - require(user != address(0), 'INVALID_USER_ADDRESS'); - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimRewards(assets, amount, msg.sender, user, to, reward); - } - - /// @inheritdoc IRewardsController - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external override returns (uint256) { - return _claimRewards(assets, amount, msg.sender, msg.sender, msg.sender, reward); - } - - /// @inheritdoc IRewardsController - function claimAllRewards(address[] calldata assets, address to) - external - override - returns (address[] memory rewardsList, uint256[] memory claimedAmounts) - { - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimAllRewards(assets, msg.sender, msg.sender, to); - } - - /// @inheritdoc IRewardsController - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) - external - override - onlyAuthorizedClaimers(msg.sender, user) - returns (address[] memory rewardsList, uint256[] memory claimedAmounts) - { - require(user != address(0), 'INVALID_USER_ADDRESS'); - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimAllRewards(assets, msg.sender, user, to); - } - - /// @inheritdoc IRewardsController - function claimAllRewardsToSelf(address[] calldata assets) - external - override - returns (address[] memory rewardsList, uint256[] memory claimedAmounts) - { - return _claimAllRewards(assets, msg.sender, msg.sender, msg.sender); - } - - /// @inheritdoc IRewardsController - function setClaimer(address user, address caller) external override onlyEmissionManager { - _authorizedClaimers[user] = caller; - emit ClaimerSet(user, caller); - } - - /** - * @dev Get user balances and total supply of all the assets specified by the assets parameter - * @param assets List of assets to retrieve user balance and total supply - * @param user Address of the user - * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets - */ - function _getUserAssetBalances(address[] calldata assets, address user) - internal - view - override - returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances) - { - userAssetBalances = new RewardsDataTypes.UserAssetBalance[](assets.length); - for (uint256 i = 0; i < assets.length; i++) { - userAssetBalances[i].asset = assets[i]; - (userAssetBalances[i].userBalance, userAssetBalances[i].totalSupply) = IScaledBalanceToken(assets[i]) - .getScaledUserBalanceAndSupply(user); - } - return userAssetBalances; - } - - /** - * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount Amount of rewards to claim - * @param claimer Address of the claimer who claims rewards on behalf of user - * @param user Address to check and claim rewards - * @param to Address that will be receiving the rewards - * @param reward Address of the reward token - * @return Rewards claimed - **/ - function _claimRewards( - address[] calldata assets, - uint256 amount, - address claimer, - address user, - address to, - address reward - ) internal returns (uint256) { - if (amount == 0) { - return 0; - } - uint256 totalRewards; - - _updateDataMultiple(user, _getUserAssetBalances(assets, user)); - for (uint256 i = 0; i < assets.length; i++) { - address asset = assets[i]; - totalRewards += _assets[asset].rewards[reward].usersData[user].accrued; - - if (totalRewards <= amount) { - _assets[asset].rewards[reward].usersData[user].accrued = 0; - } else { - uint256 difference = totalRewards - amount; - totalRewards -= difference; - _assets[asset].rewards[reward].usersData[user].accrued = difference.toUint128(); - break; - } - } - - if (totalRewards == 0) { - return 0; - } - - _transferRewards(to, reward, totalRewards); - emit RewardsClaimed(user, reward, to, claimer, totalRewards); - - return totalRewards; - } - - /** - * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. - * @param assets List of assets to check eligible distributions before claiming rewards - * @param claimer Address of the claimer on behalf of user - * @param user Address to check and claim rewards - * @param to Address that will be receiving the rewards - * @return - * rewardsList List of reward addresses - * claimedAmount List of claimed amounts, follows "rewardsList" items order - **/ - function _claimAllRewards( - address[] calldata assets, - address claimer, - address user, - address to - ) internal returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { - uint256 rewardsListLength = _rewardsList.length; - rewardsList = new address[](rewardsListLength); - claimedAmounts = new uint256[](rewardsListLength); - - _updateDataMultiple(user, _getUserAssetBalances(assets, user)); - - for (uint256 i = 0; i < assets.length; i++) { - address asset = assets[i]; - for (uint256 j = 0; j < rewardsListLength; j++) { - if (rewardsList[j] == address(0)) { - rewardsList[j] = _rewardsList[j]; - } - uint256 rewardAmount = _assets[asset].rewards[rewardsList[j]].usersData[user].accrued; - if (rewardAmount != 0) { - claimedAmounts[j] += rewardAmount; - _assets[asset].rewards[rewardsList[j]].usersData[user].accrued = 0; - } - } - } - for (uint256 i = 0; i < rewardsListLength; i++) { - _transferRewards(to, rewardsList[i], claimedAmounts[i]); - emit RewardsClaimed(user, rewardsList[i], to, claimer, claimedAmounts[i]); - } - return (rewardsList, claimedAmounts); - } - - /** - * @dev Function to transfer rewards to the desired account using delegatecall and - * @param to Account address to send the rewards - * @param reward Address of the reward token - * @param amount Amount of rewards to transfer - */ - function _transferRewards( - address to, - address reward, - uint256 amount - ) internal { - ITransferStrategyBase transferStrategy = _transferStrategy[reward]; - - bool success = transferStrategy.performTransfer(to, reward, amount); - - require(success == true, 'TRANSFER_ERROR'); - } - - /** - * @dev Returns true if `account` is a contract. - * @param account The address of the account - * @return bool, true if contract, false otherwise - */ - function _isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - // solhint-disable-next-line no-inline-assembly - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Internal function to call the optional install hook at the TransferStrategy - * @param reward The address of the reward token - * @param transferStrategy The address of the reward TransferStrategy - */ - function _installTransferStrategy(address reward, ITransferStrategyBase transferStrategy) - internal - { - require(address(transferStrategy) != address(0), 'STRATEGY_CAN_NOT_BE_ZERO'); - require(_isContract(address(transferStrategy)) == true, 'STRATEGY_MUST_BE_CONTRACT'); - - _transferStrategy[reward] = transferStrategy; - - emit TransferStrategyInstalled(reward, address(transferStrategy)); - } - - /** - * @dev Update the Price Oracle of a reward token. The Price Oracle must follow Chainlink IEACAggregatorProxy interface. - * @notice The Price Oracle of a reward is used for displaying correct data about the incentives at the UI frontend. - * @param reward The address of the reward token - * @param rewardOracle The address of the price oracle - */ - - function _setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) internal { - require(rewardOracle.latestAnswer() > 0, 'ORACLE_MUST_RETURN_PRICE'); - _rewardOracle[reward] = rewardOracle; - emit RewardOracleUpdated(reward, address(rewardOracle)); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/RewardsDistributor.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/RewardsDistributor.sol deleted file mode 100644 index b64d2a65..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/RewardsDistributor.sol +++ /dev/null @@ -1,516 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {IERC20Detailed} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IRewardsDistributor} from './interfaces/IRewardsDistributor.sol'; -import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol'; - -/** - * @title RewardsDistributor - * @notice Accounting contract to manage multiple staking distributions with multiple rewards - * @author Aave - **/ -abstract contract RewardsDistributor is IRewardsDistributor { - using SafeCast for uint256; - // manager of incentives - address public immutable EMISSION_MANAGER; - - // asset => AssetData - mapping(address => RewardsDataTypes.AssetData) internal _assets; - - // reward => enabled - mapping(address => bool) internal _isRewardEnabled; - - // global rewards list - address[] internal _rewardsList; - - //global assets list - address[] internal _assetsList; - - modifier onlyEmissionManager() { - require(msg.sender == EMISSION_MANAGER, 'ONLY_EMISSION_MANAGER'); - _; - } - - constructor(address emissionManager) { - EMISSION_MANAGER = emissionManager; - } - - /// @inheritdoc IRewardsDistributor - function getRewardsData(address asset, address reward) - public - view - override - returns ( - uint256, - uint256, - uint256, - uint256 - ) - { - return ( - _assets[asset].rewards[reward].index, - _assets[asset].rewards[reward].emissionPerSecond, - _assets[asset].rewards[reward].lastUpdateTimestamp, - _assets[asset].rewards[reward].distributionEnd - ); - } - - /// @inheritdoc IRewardsDistributor - function getDistributionEnd(address asset, address reward) - external - view - override - returns (uint256) - { - return _assets[asset].rewards[reward].distributionEnd; - } - - /// @inheritdoc IRewardsDistributor - function getRewardsByAsset(address asset) external view override returns (address[] memory) { - uint128 rewardsCount = _assets[asset].availableRewardsCount; - address[] memory availableRewards = new address[](rewardsCount); - - for (uint128 i = 0; i < rewardsCount; i++) { - availableRewards[i] = _assets[asset].availableRewards[i]; - } - return availableRewards; - } - - /// @inheritdoc IRewardsDistributor - function getRewardsList() external view override returns (address[] memory) { - return _rewardsList; - } - - /// @inheritdoc IRewardsDistributor - function getUserAssetIndex( - address user, - address asset, - address reward - ) public view override returns (uint256) { - return _assets[asset].rewards[reward].usersData[user].index; - } - - /// @inheritdoc IRewardsDistributor - function getUserAccruedRewards(address user, address reward) - external - view - override - returns (uint256) - { - uint256 totalAccrued; - for (uint256 i = 0; i < _assetsList.length; i++) { - totalAccrued += _assets[_assetsList[i]].rewards[reward].usersData[user].accrued; - } - - return totalAccrued; - } - - /// @inheritdoc IRewardsDistributor - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view override returns (uint256) { - return _getUserReward(user, reward, _getUserAssetBalances(assets, user)); - } - - /// @inheritdoc IRewardsDistributor - function getAllUserRewards(address[] calldata assets, address user) - external - view - override - returns (address[] memory rewardsList, uint256[] memory unclaimedAmounts) - { - RewardsDataTypes.UserAssetBalance[] memory userAssetBalances = _getUserAssetBalances(assets, user); - rewardsList = new address[](_rewardsList.length); - unclaimedAmounts = new uint256[](rewardsList.length); - - // Add unrealized rewards from user to unclaimedRewards - for (uint256 i = 0; i < userAssetBalances.length; i++) { - for (uint256 r = 0; r < rewardsList.length; r++) { - rewardsList[r] = _rewardsList[r]; - unclaimedAmounts[r] += _assets[userAssetBalances[i].asset] - .rewards[rewardsList[r]] - .usersData[user] - .accrued; - - if (userAssetBalances[i].userBalance == 0) { - continue; - } - unclaimedAmounts[r] += _getPendingRewards( - user, - rewardsList[r], - userAssetBalances[i] - ); - } - } - return (rewardsList, unclaimedAmounts); - } - - /// @inheritdoc IRewardsDistributor - function setDistributionEnd( - address asset, - address reward, - uint32 newDistributionEnd - ) external override onlyEmissionManager { - uint256 oldDistributionEnd = _assets[asset].rewards[reward].distributionEnd; - _assets[asset].rewards[reward].distributionEnd = newDistributionEnd; - - emit AssetConfigUpdated( - asset, - reward, - _assets[asset].rewards[reward].emissionPerSecond, - _assets[asset].rewards[reward].emissionPerSecond, - oldDistributionEnd, - newDistributionEnd, - _assets[asset].rewards[reward].index - ); - } - - /// @inheritdoc IRewardsDistributor - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external override onlyEmissionManager { - require(rewards.length == newEmissionsPerSecond.length, 'INVALID_INPUT'); - for (uint256 i = 0; i < rewards.length; i++) { - RewardsDataTypes.AssetData storage assetConfig = _assets[asset]; - RewardsDataTypes.RewardData storage rewardConfig = _assets[asset].rewards[rewards[i]]; - uint256 decimals = assetConfig.decimals; - require(decimals != 0 && rewardConfig.lastUpdateTimestamp != 0, 'DISTRIBUTION_DOES_NOT_EXIST'); - - (uint256 newIndex, ) = _updateRewardData( - rewardConfig, - IERC20Detailed(asset).totalSupply(), - 10**decimals - ); - - uint256 oldEmissionPerSecond = rewardConfig.emissionPerSecond; - rewardConfig.emissionPerSecond = newEmissionsPerSecond[i]; - - emit AssetConfigUpdated( - asset, - rewards[i], - oldEmissionPerSecond, - newEmissionsPerSecond[i], - rewardConfig.distributionEnd, - rewardConfig.distributionEnd, - newIndex - ); - } - } - - /** - * @dev Configure the _assets for a specific emission - * @param rewardsInput The array of each asset configuration - **/ - function _configureAssets(RewardsDataTypes.RewardsConfigInput[] memory rewardsInput) internal { - for (uint256 i = 0; i < rewardsInput.length; i++) { - if (_assets[rewardsInput[i].asset].decimals == 0) { - //never initialized before, adding to the list of assets - _assetsList.push(rewardsInput[i].asset); - } - - uint256 decimals = _assets[rewardsInput[i].asset].decimals = IERC20Detailed( - rewardsInput[i].asset - ).decimals(); - - RewardsDataTypes.RewardData storage rewardConfig = _assets[rewardsInput[i].asset].rewards[ - rewardsInput[i].reward - ]; - - // Add reward address to asset available rewards if latestUpdateTimestamp is zero - if (rewardConfig.lastUpdateTimestamp == 0) { - _assets[rewardsInput[i].asset].availableRewards[ - _assets[rewardsInput[i].asset].availableRewardsCount - ] = rewardsInput[i].reward; - _assets[rewardsInput[i].asset].availableRewardsCount++; - } - - // Add reward address to global rewards list if still not enabled - if (_isRewardEnabled[rewardsInput[i].reward] == false) { - _isRewardEnabled[rewardsInput[i].reward] = true; - _rewardsList.push(rewardsInput[i].reward); - } - - // Due emissions is still zero, updates only latestUpdateTimestamp - (uint256 newIndex, ) = _updateRewardData( - rewardConfig, - rewardsInput[i].totalSupply, - 10**decimals - ); - - // Configure emission and distribution end of the reward per asset - uint88 oldEmissionsPerSecond = rewardConfig.emissionPerSecond; - uint32 oldDistributionEnd = rewardConfig.distributionEnd; - rewardConfig.emissionPerSecond = rewardsInput[i].emissionPerSecond; - rewardConfig.distributionEnd = rewardsInput[i].distributionEnd; - - emit AssetConfigUpdated( - rewardsInput[i].asset, - rewardsInput[i].reward, - oldEmissionsPerSecond, - rewardsInput[i].emissionPerSecond, - oldDistributionEnd, - rewardsInput[i].distributionEnd, - newIndex - ); - } - } - - /** - * @dev Updates the state of the distribution for the specified reward - * @param rewardData Storage pointer to the distribution reward config - * @param totalSupply Current total of underlying assets for this distribution - * @param assetUnit One unit of asset (10**decimals) - * @return The new distribution index - * @return True if the index was updated, false otherwise - **/ - function _updateRewardData( - RewardsDataTypes.RewardData storage rewardData, - uint256 totalSupply, - uint256 assetUnit - ) internal returns (uint256, bool) { - (uint256 oldIndex, uint256 newIndex) = _getAssetIndex(rewardData, totalSupply, assetUnit); - bool indexUpdated; - if (newIndex != oldIndex) { - require(newIndex <= type(uint104).max, 'INDEX_OVERFLOW'); - indexUpdated = true; - - //optimization: storing one after another saves one SSTORE - rewardData.index = uint104(newIndex); - rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); - } else { - rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); - } - - return (newIndex, indexUpdated); - } - - /** - * @dev Updates the state of the distribution for the specific user - * @param rewardData Storage pointer to the distribution reward config - * @param user The address of the user - * @param userBalance The user balance of the asset - * @param newAssetIndex The new index of the asset distribution - * @param assetUnit One unit of asset (10**decimals) - * @return The rewards accrued since the last update - **/ - function _updateUserData( - RewardsDataTypes.RewardData storage rewardData, - address user, - uint256 userBalance, - uint256 newAssetIndex, - uint256 assetUnit - ) internal returns (uint256, bool) { - uint256 userIndex = rewardData.usersData[user].index; - uint256 rewardsAccrued; - bool dataUpdated; - if ((dataUpdated = userIndex != newAssetIndex)) { - // already checked for overflow in _updateRewardData - rewardData.usersData[user].index = uint104(newAssetIndex); - if (userBalance != 0) { - rewardsAccrued = _getRewards(userBalance, newAssetIndex, userIndex, assetUnit); - - rewardData.usersData[user].accrued += rewardsAccrued.toUint128(); - } - } - return (rewardsAccrued, dataUpdated); - } - - /** - * @dev Iterates and accrues all the rewards for asset of the specific user - * @param asset The address of the reference asset of the distribution - * @param user The user address - * @param userBalance The current user asset balance - * @param totalSupply Total supply of the asset - **/ - function _updateData( - address asset, - address user, - uint256 userBalance, - uint256 totalSupply - ) internal { - uint256 assetUnit; - uint256 numAvailableRewards = _assets[asset].availableRewardsCount; - unchecked { - assetUnit = 10**_assets[asset].decimals; - } - - if (numAvailableRewards == 0) { - return; - } - unchecked { - for (uint128 r = 0; r < numAvailableRewards; r++) { - address reward = _assets[asset].availableRewards[r]; - RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; - - (uint256 newAssetIndex, bool rewardDataUpdated) = _updateRewardData( - rewardData, - totalSupply, - assetUnit - ); - - (uint256 rewardsAccrued, bool userDataUpdated) = _updateUserData( - rewardData, - user, - userBalance, - newAssetIndex, - assetUnit - ); - - if (rewardDataUpdated || userDataUpdated) { - emit Accrued(asset, reward, user, newAssetIndex, newAssetIndex, rewardsAccrued); - } - } - } - } - - /** - * @dev Accrues all the rewards of the assets specified in the userAssetBalances list - * @param user The address of the user - * @param userAssetBalances List of structs with the user balance and total supply of a set of assets - **/ - function _updateDataMultiple( - address user, - RewardsDataTypes.UserAssetBalance[] memory userAssetBalances - ) internal { - for (uint256 i = 0; i < userAssetBalances.length; i++) { - _updateData( - userAssetBalances[i].asset, - user, - userAssetBalances[i].userBalance, - userAssetBalances[i].totalSupply - ); - } - } - - /** - * @dev Return the accrued unclaimed amount of a reward from a user over a list of distribution - * @param user The address of the user - * @param reward The address of the reward token - * @param userAssetBalances List of structs with the user balance and total supply of a set of assets - * @return unclaimedRewards The accrued rewards for the user until the moment - **/ - function _getUserReward( - address user, - address reward, - RewardsDataTypes.UserAssetBalance[] memory userAssetBalances - ) internal view returns (uint256 unclaimedRewards) { - // Add unrealized rewards - for (uint256 i = 0; i < userAssetBalances.length; i++) { - if (userAssetBalances[i].userBalance == 0) { - continue; - } - unclaimedRewards += - _getPendingRewards(user, reward, userAssetBalances[i]) + - _assets[userAssetBalances[i].asset].rewards[reward].usersData[user].accrued; - } - - return unclaimedRewards; - } - - /** - * @dev Calculates the pending (not yet accrued) rewards since the last user action - * @param user The address of the user - * @param reward The address of the reward token - * @param userAssetBalance struct with the user balance and total supply of the incentivized asset - * @return The pending rewards for the user since the last user action - **/ - function _getPendingRewards( - address user, - address reward, - RewardsDataTypes.UserAssetBalance memory userAssetBalance - ) internal view returns (uint256) { - RewardsDataTypes.RewardData storage rewardData = _assets[userAssetBalance.asset].rewards[ - reward - ]; - uint256 assetUnit = 10**_assets[userAssetBalance.asset].decimals; - (, uint256 nextIndex) = _getAssetIndex(rewardData, userAssetBalance.totalSupply, assetUnit); - - return - _getRewards( - userAssetBalance.userBalance, - nextIndex, - rewardData.usersData[user].index, - assetUnit - ); - } - - /** - * @dev Internal function for the calculation of user's rewards on a distribution - * @param userBalance Balance of the user asset on a distribution - * @param reserveIndex Current index of the distribution - * @param userIndex Index stored for the user, representation his staking moment - * @param assetUnit One unit of asset (10**decimals) - * @return The rewards - **/ - function _getRewards( - uint256 userBalance, - uint256 reserveIndex, - uint256 userIndex, - uint256 assetUnit - ) internal pure returns (uint256) { - uint256 result = userBalance * (reserveIndex - userIndex); - assembly { - result := div(result, assetUnit) - } - return result; - } - - /** - * @dev Calculates the next value of an specific distribution index, with validations - * @param totalSupply of the asset being rewarded - * @param assetUnit One unit of asset (10**decimals) - * @return The new index. - **/ - function _getAssetIndex( - RewardsDataTypes.RewardData storage rewardData, - uint256 totalSupply, - uint256 assetUnit - ) internal view returns (uint256, uint256) { - uint256 oldIndex = rewardData.index; - uint256 distributionEnd = rewardData.distributionEnd; - uint256 emissionPerSecond = rewardData.emissionPerSecond; - uint256 lastUpdateTimestamp = rewardData.lastUpdateTimestamp; - - if ( - emissionPerSecond == 0 || - totalSupply == 0 || - lastUpdateTimestamp == block.timestamp || - lastUpdateTimestamp >= distributionEnd - ) { - return (oldIndex, oldIndex); - } - - uint256 currentTimestamp = block.timestamp > distributionEnd - ? distributionEnd - : block.timestamp; - uint256 timeDelta = currentTimestamp - lastUpdateTimestamp; - uint256 firstTerm = emissionPerSecond * timeDelta * assetUnit; - assembly { - firstTerm := div(firstTerm, totalSupply) - } - return (oldIndex, (firstTerm + oldIndex)); - } - - /** - * @dev Get user balances and total supply of all the assets specified by the assets parameter - * @param assets List of assets to retrieve user balance and total supply - * @param user Address of the user - * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets - */ - function _getUserAssetBalances(address[] calldata assets, address user) - internal - view - virtual - returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances); - - /// @inheritdoc IRewardsDistributor - function getAssetDecimals(address asset) external view returns (uint8) { - return _assets[asset].decimals; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IPullRewardsTransferStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IPullRewardsTransferStrategy.sol deleted file mode 100644 index 8b16e8db..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IPullRewardsTransferStrategy.sol +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; - -/** - * @title IPullRewardsTransferStrategy - * @author Aave - **/ -interface IPullRewardsTransferStrategy is ITransferStrategyBase { - /** - * @return Address of the rewards vault - */ - function getRewardsVault() external view returns (address); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol deleted file mode 100644 index 706e3cd6..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsController.sol +++ /dev/null @@ -1,205 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {IRewardsDistributor} from './IRewardsDistributor.sol'; -import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol'; -import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; - -/** - * @title IRewardsController - * @author Aave - * @notice Defines the basic interface for a Rewards Controller. - */ -interface IRewardsController is IRewardsDistributor { - /** - * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user - * @param user The address of the user - * @param claimer The address of the claimer - */ - event ClaimerSet(address indexed user, address indexed claimer); - - /** - * @dev Emitted when rewards are claimed - * @param user The address of the user rewards has been claimed on behalf of - * @param reward The address of the token reward is claimed - * @param to The address of the receiver of the rewards - * @param claimer The address of the claimer - * @param amount The amount of rewards claimed - */ - event RewardsClaimed( - address indexed user, - address indexed reward, - address indexed to, - address claimer, - uint256 amount - ); - - /** - * @dev Emitted when a transfer strategy is installed for the reward distribution - * @param reward The address of the token reward - * @param transferStrategy The address of TransferStrategy contract - */ - event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); - - /** - * @dev Emitted when the reward oracle is updated - * @param reward The address of the token reward - * @param rewardOracle The address of oracle - */ - event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Get the price aggregator oracle address - * @param reward The address of the reward - * @return The price oracle of the reward - */ - function getRewardOracle(address reward) external view returns (address); - - /** - * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) - * @param user The address of the user - * @return The claimer address - */ - function getClaimer(address user) external view returns (address); - - /** - * @dev Returns the Transfer Strategy implementation contract address being used for a reward address - * @param reward The address of the reward - * @return The address of the TransferStrategy contract - */ - function getTransferStrategy(address reward) external view returns (address); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Called by the corresponding asset on any update that affects the rewards distribution - * @param user The address of the user - * @param userBalance The user balance of the asset - * @param totalSupply The total supply of the asset - **/ - function handleAction( - address user, - uint256 userBalance, - uint256 totalSupply - ) external; - - /** - * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The - * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external returns (uint256); - - /** - * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" - **/ - function claimAllRewards(address[] calldata assets, address to) - external - returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must - * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsToSelf(address[] calldata assets) - external - returns (address[] memory rewardsList, uint256[] memory claimedAmounts); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol deleted file mode 100644 index fa65351f..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IRewardsDistributor.sol +++ /dev/null @@ -1,164 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -/** - * @title IRewardsDistributor - * @author Aave - * @notice Defines the basic interface for a Rewards Distributor. - */ -interface IRewardsDistributor { - /** - * @dev Emitted when the configuration of the rewards of an asset is updated. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param oldEmission The old emissions per second value of the reward distribution - * @param newEmission The new emissions per second value of the reward distribution - * @param oldDistributionEnd The old end timestamp of the reward distribution - * @param newDistributionEnd The new end timestamp of the reward distribution - * @param assetIndex The index of the asset distribution - */ - event AssetConfigUpdated( - address indexed asset, - address indexed reward, - uint256 oldEmission, - uint256 newEmission, - uint256 oldDistributionEnd, - uint256 newDistributionEnd, - uint256 assetIndex - ); - - /** - * @dev Emitted when rewards of an asset are accrued on behalf of a user. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param user The address of the user that rewards are accrued on behalf of - * @param assetIndex The index of the asset distribution - * @param userIndex The index of the asset distribution on behalf of the user - * @param rewardsAccrued The amount of rewards accrued - */ - event Accrued( - address indexed asset, - address indexed reward, - address indexed user, - uint256 assetIndex, - uint256 userIndex, - uint256 rewardsAccrued - ); - - /** - * @dev Sets the end date for the distribution - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd( - address asset, - address reward, - uint32 newDistributionEnd - ) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Gets the end date for the distribution - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The timestamp with the end of the distribution, in unix time format - **/ - function getDistributionEnd(address asset, address reward) external view returns (uint256); - - /** - * @dev Returns the index of a user on a reward distribution - * @param user Address of the user - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The current user asset index, not including new distributions - **/ - function getUserAssetIndex( - address user, - address asset, - address reward - ) external view returns (uint256); - - /** - * @dev Returns the configuration of the distribution reward for a certain asset - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The index of the asset distribution - * @return The emission per second of the reward distribution - * @return The timestamp of the last update of the index - * @return The timestamp of the distribution end - **/ - function getRewardsData(address asset, address reward) - external - view - returns ( - uint256, - uint256, - uint256, - uint256 - ); - - /** - * @dev Returns the list of available reward token addresses of an incentivized asset - * @param asset The incentivized asset - * @return List of rewards addresses of the input asset - **/ - function getRewardsByAsset(address asset) external view returns (address[] memory); - - /** - * @dev Returns the list of available reward addresses - * @return List of rewards supported in this contract - **/ - function getRewardsList() external view returns (address[] memory); - - /** - * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. - * @param user The address of the user - * @param reward The address of the reward token - * @return Unclaimed rewards, not including new distributions - **/ - function getUserAccruedRewards(address user, address reward) external view returns (uint256); - - /** - * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @param reward The address of the reward token - * @return The rewards amount - **/ - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view returns (uint256); - - /** - * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @return The list of reward addresses - * @return The list of unclaimed amount of rewards - **/ - function getAllUserRewards(address[] calldata assets, address user) - external - view - returns (address[] memory, uint256[] memory); - - /** - * @dev Returns the decimals of an asset to calculate the distribution delta - * @param asset The address to retrieve decimals - * @return The decimals of an underlying asset - */ - function getAssetDecimals(address asset) external view returns (uint8); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IStakedToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IStakedToken.sol deleted file mode 100644 index dd0f206d..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IStakedToken.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -interface IStakedToken { - function STAKED_TOKEN() external view returns (address); - - function stake(address to, uint256 amount) external; - - function redeem(address to, uint256 amount) external; - - function cooldown() external; - - function claimRewards(address to, uint256 amount) external; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IStakedTokenTransferStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IStakedTokenTransferStrategy.sol deleted file mode 100644 index 9fe64a5d..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/IStakedTokenTransferStrategy.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {IStakedToken} from '../interfaces/IStakedToken.sol'; -import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; - -/** - * @title IStakedTokenTransferStrategy - * @author Aave - **/ -interface IStakedTokenTransferStrategy is ITransferStrategyBase { - /** - * @dev Perform a MAX_UINT approval of AAVE to the Staked Aave contract. - */ - function renewApproval() external; - - /** - * @dev Drop approval of AAVE to the Staked Aave contract in case of emergency. - */ - function dropApproval() external; - - /** - * @return Staked Token contract address - */ - function getStakeContract() external view returns (address); - - /** - * @return Underlying token address from the stake contract - */ - function getUnderlyingToken() external view returns (address); -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol deleted file mode 100644 index 46d67b08..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/interfaces/ITransferStrategyBase.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -interface ITransferStrategyBase { - event EmergencyWithdrawal( - address indexed caller, - address indexed token, - address indexed to, - uint256 amount - ); - - /** - * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation - * @param to Account to transfer rewards - * @param reward Address of the reward token - * @param amount Amount to transfer to the "to" address parameter - * @return Returns true bool if transfer logic succeeds - */ - function performTransfer( - address to, - address reward, - uint256 amount - ) external returns (bool); - - /** - * @return Returns the address of the Incentives Controller - */ - function getIncentivesController() external view returns (address); - - /** - * @return Returns the address of the Rewards admin - */ - function getRewardsAdmin() external view returns (address); - - /** - * @dev Perform an emergency token withdrawal only callable by the Rewards admin - * @param token Address of the token to withdraw funds from this contract - * @param to Address of the recipient of the withdrawal - * @param amount Amount of the withdrawal - */ - function emergencyWithdrawal( - address token, - address to, - uint256 amount - ) external; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol deleted file mode 100644 index e8e631c1..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/libraries/RewardsDataTypes.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol'; - -library RewardsDataTypes { - struct RewardsConfigInput { - uint88 emissionPerSecond; - uint256 totalSupply; - uint32 distributionEnd; - address asset; - address reward; - ITransferStrategyBase transferStrategy; - IEACAggregatorProxy rewardOracle; - } - - struct UserAssetBalance { - address asset; - uint256 userBalance; - uint256 totalSupply; - } - - struct UserData { - uint104 index; // matches reward index - uint128 accrued; - } - - struct RewardData { - uint104 index; - uint88 emissionPerSecond; - uint32 lastUpdateTimestamp; - uint32 distributionEnd; - mapping(address => UserData) usersData; - } - - struct AssetData { - mapping(address => RewardData) rewards; - mapping(uint128 => address) availableRewards; - uint128 availableRewardsCount; - uint8 decimals; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol deleted file mode 100644 index 450eb5c9..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IPullRewardsTransferStrategy} from '../interfaces/IPullRewardsTransferStrategy.sol'; -import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; -import {TransferStrategyBase} from './TransferStrategyBase.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; - -/** - * @title PullRewardsTransferStrategy - * @notice Transfer strategy that pulls ERC20 rewards from an external account to the user address. - * The external account could be a smart contract or EOA that must approve to the PullRewardsTransferStrategy contract address. - * @author Aave - **/ -contract PullRewardsTransferStrategy is TransferStrategyBase, IPullRewardsTransferStrategy { - using GPv2SafeERC20 for IERC20; - - address internal immutable REWARDS_VAULT; - - constructor( - address incentivesController, - address rewardsAdmin, - address rewardsVault - ) TransferStrategyBase(incentivesController, rewardsAdmin) { - REWARDS_VAULT = rewardsVault; - } - - /// @inheritdoc TransferStrategyBase - function performTransfer( - address to, - address reward, - uint256 amount - ) - external - override(TransferStrategyBase, ITransferStrategyBase) - onlyIncentivesController - returns (bool) - { - IERC20(reward).safeTransferFrom(REWARDS_VAULT, to, amount); - - return true; - } - - /// @inheritdoc IPullRewardsTransferStrategy - function getRewardsVault() external view returns (address) { - return REWARDS_VAULT; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol deleted file mode 100644 index ba88c9d6..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IStakedToken} from '../interfaces/IStakedToken.sol'; -import {IStakedTokenTransferStrategy} from '../interfaces/IStakedTokenTransferStrategy.sol'; -import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; -import {TransferStrategyBase} from './TransferStrategyBase.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; - -/** - * @title StakedTokenTransferStrategy - * @notice Transfer strategy that stakes the rewards into a staking contract and transfers the staking contract token. - * The underlying token must be transferred to this contract to be able to stake it on demand. - * @author Aave - **/ -contract StakedTokenTransferStrategy is TransferStrategyBase, IStakedTokenTransferStrategy { - using GPv2SafeERC20 for IERC20; - - IStakedToken internal immutable STAKE_CONTRACT; - address internal immutable UNDERLYING_TOKEN; - - constructor( - address incentivesController, - address rewardsAdmin, - IStakedToken stakeToken - ) TransferStrategyBase(incentivesController, rewardsAdmin) { - STAKE_CONTRACT = stakeToken; - UNDERLYING_TOKEN = STAKE_CONTRACT.STAKED_TOKEN(); - - IERC20(UNDERLYING_TOKEN).approve(address(STAKE_CONTRACT), 0); - IERC20(UNDERLYING_TOKEN).approve(address(STAKE_CONTRACT), type(uint256).max); - } - - /// @inheritdoc TransferStrategyBase - function performTransfer( - address to, - address reward, - uint256 amount - ) - external - override(TransferStrategyBase, ITransferStrategyBase) - onlyIncentivesController - returns (bool) - { - require(reward == address(STAKE_CONTRACT), 'REWARD_TOKEN_NOT_STAKE_CONTRACT'); - - STAKE_CONTRACT.stake(to, amount); - - return true; - } - - /// @inheritdoc IStakedTokenTransferStrategy - function renewApproval() external onlyRewardsAdmin { - IERC20(UNDERLYING_TOKEN).approve(address(STAKE_CONTRACT), 0); - IERC20(UNDERLYING_TOKEN).approve(address(STAKE_CONTRACT), type(uint256).max); - } - - /// @inheritdoc IStakedTokenTransferStrategy - function dropApproval() external onlyRewardsAdmin { - IERC20(UNDERLYING_TOKEN).approve(address(STAKE_CONTRACT), 0); - } - - /// @inheritdoc IStakedTokenTransferStrategy - function getStakeContract() external view returns (address) { - return address(STAKE_CONTRACT); - } - - /// @inheritdoc IStakedTokenTransferStrategy - function getUnderlyingToken() external view returns (address) { - return UNDERLYING_TOKEN; - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/TransferStrategyBase.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/TransferStrategyBase.sol deleted file mode 100644 index 582ead1b..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/rewards/transfer-strategies/TransferStrategyBase.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; - -/** - * @title TransferStrategyStorage - * @author Aave - **/ -abstract contract TransferStrategyBase is ITransferStrategyBase { - using GPv2SafeERC20 for IERC20; - - address internal immutable INCENTIVES_CONTROLLER; - address internal immutable REWARDS_ADMIN; - - constructor(address incentivesController, address rewardsAdmin) { - INCENTIVES_CONTROLLER = incentivesController; - REWARDS_ADMIN = rewardsAdmin; - } - - /** - * @dev Modifier for incentives controller only functions - */ - modifier onlyIncentivesController() { - require(INCENTIVES_CONTROLLER == msg.sender, 'CALLER_NOT_INCENTIVES_CONTROLLER'); - _; - } - - /** - * @dev Modifier for reward admin only functions - */ - modifier onlyRewardsAdmin() { - require(msg.sender == REWARDS_ADMIN, 'ONLY_REWARDS_ADMIN'); - _; - } - - /// @inheritdoc ITransferStrategyBase - function getIncentivesController() external view override returns (address) { - return INCENTIVES_CONTROLLER; - } - - /// @inheritdoc ITransferStrategyBase - function getRewardsAdmin() external view override returns (address) { - return REWARDS_ADMIN; - } - - /// @inheritdoc ITransferStrategyBase - function performTransfer( - address to, - address reward, - uint256 amount - ) external virtual returns (bool); - - /// @inheritdoc ITransferStrategyBase - function emergencyWithdrawal( - address token, - address to, - uint256 amount - ) external onlyRewardsAdmin { - IERC20(token).safeTransfer(to, amount); - - emit EmergencyWithdrawal(msg.sender, token, to, amount); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/Collector.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/Collector.sol deleted file mode 100644 index 59f3c466..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/Collector.sol +++ /dev/null @@ -1,79 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {ICollector} from './interfaces/ICollector.sol'; - -/** - * @title Collector - * @notice Stores the fees collected by the protocol and allows the fund administrator - * to approve or transfer the collected ERC20 tokens. - * @dev Implementation contract that must be initialized using transparent proxy pattern. - * @author Aave - **/ -contract Collector is VersionedInitializable, ICollector { - // Store the current funds administrator address - address internal _fundsAdmin; - - // Revision version of this implementation contract - uint256 public constant REVISION = 1; - - /** - * @dev Allow only the funds administrator address to call functions marked by this modifier - */ - modifier onlyFundsAdmin() { - require(msg.sender == _fundsAdmin, 'ONLY_BY_FUNDS_ADMIN'); - _; - } - - /** - * @dev Initialize the transparent proxy with the admin of the Collector - * @param reserveController The address of the admin that controls Collector - */ - function initialize(address reserveController) external initializer { - _setFundsAdmin(reserveController); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure override returns (uint256) { - return REVISION; - } - - /// @inheritdoc ICollector - function getFundsAdmin() external view returns (address) { - return _fundsAdmin; - } - - /// @inheritdoc ICollector - function approve( - IERC20 token, - address recipient, - uint256 amount - ) external onlyFundsAdmin { - token.approve(recipient, amount); - } - - /// @inheritdoc ICollector - function transfer( - IERC20 token, - address recipient, - uint256 amount - ) external onlyFundsAdmin { - token.transfer(recipient, amount); - } - - /// @inheritdoc ICollector - function setFundsAdmin(address admin) external onlyFundsAdmin { - _setFundsAdmin(admin); - } - - /** - * @dev Transfer the ownership of the funds administrator role. - * @param admin The address of the new funds administrator - */ - function _setFundsAdmin(address admin) internal { - _fundsAdmin = admin; - emit NewFundsAdmin(admin); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/CollectorController.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/CollectorController.sol deleted file mode 100644 index db51e65f..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/CollectorController.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {Ownable} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {ICollector} from './interfaces/ICollector.sol'; - -/** - * @title CollectorController - * @notice The CollectorController contracts allows the owner of the contract - to approve or transfer tokens from the collector proxy contract. - The admin of the Collector proxy can't be the same as the fundsAdmin address. - This is needed due the usage of transparent proxy pattern. - * @author Aave - **/ -contract CollectorController is Ownable { - ICollector public immutable COLLECTOR; - - /** - * @dev Constructor setups the ownership of the contract and the collector proxy - * @param owner The address of the owner of the CollectorController - * @param collectorProxy The address of the Collector transparent proxy - */ - constructor(address owner, address collectorProxy) { - transferOwnership(owner); - COLLECTOR = ICollector(collectorProxy); - } - - /** - * @dev Transfer an amount of tokens to the recipient. - * @param token The address of the asset - * @param recipient The address of the entity to transfer the tokens. - * @param amount The amount to be transferred. - */ - function approve( - IERC20 token, - address recipient, - uint256 amount - ) external onlyOwner { - COLLECTOR.approve(token, recipient, amount); - } - - /** - * @dev Transfer an amount of tokens to the recipient. - * @param token The address of the asset - * @param recipient The address of the entity to transfer the tokens. - * @param amount The amount to be transferred. - */ - function transfer( - IERC20 token, - address recipient, - uint256 amount - ) external onlyOwner { - COLLECTOR.transfer(token, recipient, amount); - } -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/interfaces/ICollector.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/interfaces/ICollector.sol deleted file mode 100644 index 707d0a53..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/@aave/periphery-v3/contracts/treasury/interfaces/ICollector.sol +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; - -/** - * @title ICollector - * @notice Defines the interface of the Collector contract - * @author Aave - **/ -interface ICollector { - /** - * @dev Emitted during the transfer of ownership of the funds administrator address - * @param fundsAdmin The new funds administrator address - **/ - event NewFundsAdmin(address indexed fundsAdmin); - - /** - * @dev Retrieve the current implementation Revision of the proxy - * @return The revision version - */ - function REVISION() external view returns (uint256); - - /** - * @dev Retrieve the current funds administrator - * @return The address of the funds administrator - */ - function getFundsAdmin() external view returns (address); - - /** - * @dev Approve an amount of tokens to be pulled by the recipient. - * @param token The address of the asset - * @param recipient The address of the entity allowed to pull tokens - * @param amount The amount allowed to be pulled. If zero it will revoke the approval. - */ - function approve( - IERC20 token, - address recipient, - uint256 amount - ) external; - - /** - * @dev Transfer an amount of tokens to the recipient. - * @param token The address of the asset - * @param recipient The address of the entity to transfer the tokens. - * @param amount The amount to be transferred. - */ - function transfer( - IERC20 token, - address recipient, - uint256 amount - ) external; - - /** - * @dev Transfer the ownership of the funds administrator role. - This function should only be callable by the current funds administrator. - * @param admin The address of the new funds administrator - */ - function setFundsAdmin(address admin) external; -} diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index 66bdc69a..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol deleted file mode 100644 index 5f8c6582..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableAdminUpgradeabilityProxy.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol deleted file mode 100644 index ddd9f83e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/deployments/ReservesSetupHelper.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/AaveOracle.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/AaveOracle.sol deleted file mode 100644 index 177cd126..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/AaveOracle.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/misc/AaveOracle.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol deleted file mode 100644 index a1f72ef6..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/misc/AaveProtocolDataProvider.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/L2Encoder.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/L2Encoder.sol deleted file mode 100644 index bc4fe15a..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/misc/L2Encoder.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/misc/L2Encoder.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol deleted file mode 100644 index ba513e32..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/mocks/flashloan/MockFlashLoanReceiver.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol deleted file mode 100644 index 058ab081..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/mocks/helpers/MockIncentivesController.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol deleted file mode 100644 index 9750167e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/mocks/helpers/MockL2Pool.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockPool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockPool.sol deleted file mode 100644 index 437917f6..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockPool.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/mocks/helpers/MockPool.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol deleted file mode 100644 index 2fb0553b..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/mocks/helpers/MockReserveConfiguration.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol deleted file mode 100644 index aaffee5b..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/mocks/tokens/MintableDelegationERC20.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol deleted file mode 100644 index 152e59c1..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/mocks/tokens/MintableERC20.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol deleted file mode 100644 index e4718003..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/mocks/upgradeability/MockAToken.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol deleted file mode 100644 index 8be624c0..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/mocks/upgradeability/MockInitializableImplementation.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol deleted file mode 100644 index 3588eaf1..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/mocks/upgradeability/MockStableDebtToken.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol deleted file mode 100644 index c15884fa..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/mocks/upgradeability/MockVariableDebtToken.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol deleted file mode 100644 index f6b64f8e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/ACLManager.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/configuration/ACLManager.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol deleted file mode 100644 index 50225ae8..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol deleted file mode 100644 index acb07482..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol deleted file mode 100644 index a0a997a0..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol deleted file mode 100644 index f77f2392..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/libraries/logic/BorrowLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol deleted file mode 100644 index ab8d93e2..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/libraries/logic/BridgeLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol deleted file mode 100644 index 2dfa2af3..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/libraries/logic/CalldataLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index cbcac836..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/libraries/logic/EModeLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol deleted file mode 100644 index 83a73129..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/libraries/logic/FlashLoanLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index 76464c8a..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/libraries/logic/GenericLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index e608396b..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/libraries/logic/ReserveLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol deleted file mode 100644 index a8b5e592..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/libraries/logic/SupplyLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index 6c8c2f47..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/libraries/logic/ValidationLogic.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol deleted file mode 100644 index 51ab4286..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/pool/DefaultReserveInterestRateStrategy.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/L2Pool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/L2Pool.sol deleted file mode 100644 index bc2abade..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/L2Pool.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/pool/L2Pool.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/Pool.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/Pool.sol deleted file mode 100644 index 67c31934..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/Pool.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/pool/Pool.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol deleted file mode 100644 index 6cd01268..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/pool/PoolConfigurator.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/AToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/AToken.sol deleted file mode 100644 index 1760f9da..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/AToken.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/tokenization/AToken.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol deleted file mode 100644 index 4728596f..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/tokenization/DelegationAwareAToken.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol deleted file mode 100644 index 16b55c63..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/tokenization/StableDebtToken.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol deleted file mode 100644 index 9e05a81e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/core-v3/contracts/protocol/tokenization/VariableDebtToken.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol deleted file mode 100644 index 085b9efc..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapLiquiditySwapAdapter.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol deleted file mode 100644 index 5c49fe03..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/periphery-v3/contracts/adapters/paraswap/ParaSwapRepayAdapter.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol deleted file mode 100644 index aeaadf94..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/periphery-v3/contracts/misc/UiIncentiveDataProviderV3.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol deleted file mode 100644 index 444eab8f..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/periphery-v3/contracts/misc/UiPoolDataProviderV3.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/WETHGateway.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/WETHGateway.sol deleted file mode 100644 index 889998f0..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/WETHGateway.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/periphery-v3/contracts/misc/WETHGateway.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol deleted file mode 100644 index 03772875..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/RewardsController.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/RewardsController.sol deleted file mode 100644 index 8f995c64..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/RewardsController.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/periphery-v3/contracts/rewards/RewardsController.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol deleted file mode 100644 index 0cdea44b..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/periphery-v3/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol deleted file mode 100644 index fe00c11d..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/periphery-v3/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/treasury/Collector.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/treasury/Collector.sol deleted file mode 100644 index 6bd85f12..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/treasury/Collector.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/periphery-v3/contracts/treasury/Collector.sol'; diff --git a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/treasury/CollectorController.sol b/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/treasury/CollectorController.sol deleted file mode 100644 index 0c24fa5e..00000000 --- a/downloads/ARBITRUM/L2_ENCODER/L2Encoder/contracts/hardhat-dependency-compiler/@aave/periphery-v3/contracts/treasury/CollectorController.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import '@aave/periphery-v3/contracts/treasury/CollectorController.sol'; diff --git a/downloads/ARBITRUM/L2_POOL_IMPL.sol b/downloads/ARBITRUM/L2_POOL_IMPL.sol deleted file mode 100644 index 50a2a4d3..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL.sol +++ /dev/null @@ -1,8682 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IL2Pool.sol - -/** - * @title IL2Pool - * @author Aave - * @notice Defines the basic extension interface for an L2 Aave Pool. - */ -interface IL2Pool { - /** - * @notice Calldata efficient wrapper of the supply function on behalf of the caller - * @param args Arguments for the supply function packed in one bytes32 - * 96 bits 16 bits 128 bits 16 bits - * | 0-padding | referralCode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - */ - function supply(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the supplyWithPermit function on behalf of the caller - * @param args Arguments for the supply function packed in one bytes32 - * 56 bits 8 bits 32 bits 16 bits 128 bits 16 bits - * | 0-padding | permitV | shortenedDeadline | referralCode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @param r The R parameter of ERC712 permit sig - * @param s The S parameter of ERC712 permit sig - */ - function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s) external; - - /** - * @notice Calldata efficient wrapper of the withdraw function, withdrawing to the caller - * @param args Arguments for the withdraw function packed in one bytes32 - * 112 bits 128 bits 16 bits - * | 0-padding | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @return The final amount withdrawn - */ - function withdraw(bytes32 args) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the borrow function, borrowing on behalf of the caller - * @param args Arguments for the borrow function packed in one bytes32 - * 88 bits 16 bits 8 bits 128 bits 16 bits - * | 0-padding | referralCode | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - */ - function borrow(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the repay function, repaying on behalf of the caller - * @param args Arguments for the repay function packed in one bytes32 - * 104 bits 8 bits 128 bits 16 bits - * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @return The final amount repaid - */ - function repay(bytes32 args) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the repayWithPermit function, repaying on behalf of the caller - * @param args Arguments for the repayWithPermit function packed in one bytes32 - * 64 bits 8 bits 32 bits 8 bits 128 bits 16 bits - * | 0-padding | permitV | shortenedDeadline | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @param r The R parameter of ERC712 permit sig - * @param s The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the repayWithATokens function - * @param args Arguments for the repayWithATokens function packed in one bytes32 - * 104 bits 8 bits 128 bits 16 bits - * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @return The final amount repaid - */ - function repayWithATokens(bytes32 args) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the setUserUseReserveAsCollateral function - * @param args Arguments for the setUserUseReserveAsCollateral function packed in one bytes32 - * 239 bits 1 bit 16 bits - * | 0-padding | useAsCollateral | assetId | - * @dev assetId is the index of the asset in the reservesList. - */ - function setUserUseReserveAsCollateral(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the liquidationCall function - * @param args1 part of the arguments for the liquidationCall function packed in one bytes32 - * 64 bits 160 bits 16 bits 16 bits - * | 0-padding | user address | debtAssetId | collateralAssetId | - * @param args2 part of the arguments for the liquidationCall function packed in one bytes32 - * 127 bits 1 bit 128 bits - * | 0-padding | receiveAToken | shortenedDebtToCover | - * @dev the shortenedDebtToCover is cast to 256 bits at decode time, - * if type(uint128).max the value will be expanded to type(uint256).max - */ - function liquidationCall(bytes32 args1, bytes32 args2) external; -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/CalldataLogic.sol - -/** - * @title CalldataLogic library - * @author Aave - * @notice Library to decode calldata, used to optimize calldata size in L2Pool for transaction cost reduction - */ -library CalldataLogic { - /** - * @notice Decodes compressed supply params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed supply params - * @return The address of the underlying reserve - * @return The amount to supply - * @return The referralCode - */ - function decodeSupplyParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint16) { - uint16 assetId; - uint256 amount; - uint16 referralCode; - - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - referralCode := and(shr(144, args), 0xFFFF) - } - return (reservesList[assetId], amount, referralCode); - } - - /** - * @notice Decodes compressed supply params to standard params along with permit params - * @param reservesList The addresses of all the active reserves - * @param args The packed supply with permit params - * @return The address of the underlying reserve - * @return The amount to supply - * @return The referralCode - * @return The deadline of the permit - * @return The V value of the permit signature - */ - function decodeSupplyWithPermitParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint16, uint256, uint8) { - uint256 deadline; - uint8 permitV; - - assembly { - deadline := and(shr(160, args), 0xFFFFFFFF) - permitV := and(shr(192, args), 0xFF) - } - (address asset, uint256 amount, uint16 referralCode) = decodeSupplyParams(reservesList, args); - - return (asset, amount, referralCode, deadline, permitV); - } - - /** - * @notice Decodes compressed withdraw params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed withdraw params - * @return The address of the underlying reserve - * @return The amount to withdraw - */ - function decodeWithdrawParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256) { - uint16 assetId; - uint256 amount; - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - } - if (amount == type(uint128).max) { - amount = type(uint256).max; - } - return (reservesList[assetId], amount); - } - - /** - * @notice Decodes compressed borrow params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed borrow params - * @return The address of the underlying reserve - * @return The amount to borrow - * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) - * @return The referralCode - */ - function decodeBorrowParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint256, uint16) { - uint16 assetId; - uint256 amount; - uint256 interestRateMode; - uint16 referralCode; - - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - interestRateMode := and(shr(144, args), 0xFF) - referralCode := and(shr(152, args), 0xFFFF) - } - - return (reservesList[assetId], amount, interestRateMode, referralCode); - } - - /** - * @notice Decodes compressed repay params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed repay params - * @return The address of the underlying reserve - * @return The amount to repay - * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) - */ - function decodeRepayParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint256) { - uint16 assetId; - uint256 amount; - uint256 interestRateMode; - - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - interestRateMode := and(shr(144, args), 0xFF) - } - - if (amount == type(uint128).max) { - amount = type(uint256).max; - } - - return (reservesList[assetId], amount, interestRateMode); - } - - /** - * @notice Decodes compressed repay params to standard params along with permit params - * @param reservesList The addresses of all the active reserves - * @param args The packed repay with permit params - * @return The address of the underlying reserve - * @return The amount to repay - * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) - * @return The deadline of the permit - * @return The V value of the permit signature - */ - function decodeRepayWithPermitParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint256, uint256, uint8) { - uint256 deadline; - uint8 permitV; - - (address asset, uint256 amount, uint256 interestRateMode) = decodeRepayParams( - reservesList, - args - ); - - assembly { - deadline := and(shr(152, args), 0xFFFFFFFF) - permitV := and(shr(184, args), 0xFF) - } - - return (asset, amount, interestRateMode, deadline, permitV); - } - - /** - * @notice Decodes compressed set user use reserve as collateral params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed set user use reserve as collateral params - * @return The address of the underlying reserve - * @return True if to set using as collateral, false otherwise - */ - function decodeSetUserUseReserveAsCollateralParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, bool) { - uint16 assetId; - bool useAsCollateral; - assembly { - assetId := and(args, 0xFFFF) - useAsCollateral := and(shr(16, args), 0x1) - } - return (reservesList[assetId], useAsCollateral); - } - - /** - * @notice Decodes compressed liquidation call params to standard params - * @param reservesList The addresses of all the active reserves - * @param args1 The first half of packed liquidation call params - * @param args2 The second half of the packed liquidation call params - * @return The address of the underlying collateral asset - * @return The address of the underlying debt asset - * @return The address of the user to liquidate - * @return The amount of debt to cover - * @return True if receiving aTokens, false otherwise - */ - function decodeLiquidationCallParams( - mapping(uint256 => address) storage reservesList, - bytes32 args1, - bytes32 args2 - ) internal view returns (address, address, address, uint256, bool) { - uint16 collateralAssetId; - uint16 debtAssetId; - address user; - uint256 debtToCover; - bool receiveAToken; - - assembly { - collateralAssetId := and(args1, 0xFFFF) - debtAssetId := and(shr(16, args1), 0xFFFF) - user := and(shr(32, args1), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - - debtToCover := and(args2, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - receiveAToken := and(shr(128, args2), 0x1) - } - - if (debtToCover == type(uint128).max) { - debtToCover = type(uint256).max; - } - - return ( - reservesList[collateralAssetId], - reservesList[debtAssetId], - user, - debtToCover, - receiveAToken - ); - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IERC20WithPermit.sol - -/** - * @title IERC20WithPermit - * @author Aave - * @notice Interface for the permit function (EIP-2612) - */ -interface IERC20WithPermit is IERC20 { - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleSentinel.sol - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/MathUtils.sol - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol - -/** - * @title IFlashLoanReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - */ -interface IFlashLoanReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed assets - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param assets The addresses of the flash-borrowed assets - * @param amounts The amounts of the flash-borrowed assets - * @param premiums The fee of each flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata premiums, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol - -/** - * @title IFlashLoanSimpleReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - */ -interface IFlashLoanSimpleReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed asset - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param asset The address of the flash-borrowed asset - * @param amount The amount of the flash-borrowed asset - * @param premium The fee of the flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address asset, - uint256 amount, - uint256 premium, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ReserveLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/PoolStorage.sol - -/** - * @title PoolStorage - * @author Aave - * @notice Contract used as storage of the Pool contract. - * @dev It defines the storage layout of the Pool contract. - */ -contract PoolStorage { - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - // Map of reserves and their data (underlyingAssetOfReserve => reserveData) - mapping(address => DataTypes.ReserveData) internal _reserves; - - // Map of users address and their configuration data (userAddress => userConfiguration) - mapping(address => DataTypes.UserConfigurationMap) internal _usersConfig; - - // List of reserves as a map (reserveId => reserve). - // It is structured as a mapping for gas savings reasons, using the reserve id as index - mapping(uint256 => address) internal _reservesList; - - // List of eMode categories as a map (eModeCategoryId => eModeCategory). - // It is structured as a mapping for gas savings reasons, using the eModeCategoryId as index - mapping(uint8 => DataTypes.EModeCategory) internal _eModeCategories; - - // Map of users address and their eMode category (userAddress => eModeCategoryId) - mapping(address => uint8) internal _usersEModeCategory; - - // Fee of the protocol bridge, expressed in bps - uint256 internal _bridgeProtocolFee; - - // Total FlashLoan Premium, expressed in bps - uint128 internal _flashLoanPremiumTotal; - - // FlashLoan premium paid to protocol treasury, expressed in bps - uint128 internal _flashLoanPremiumToProtocol; - - // DEPRECATED on v3.2.0 - uint64 internal __DEPRECATED_maxStableRateBorrowSizePercent; - - // Maximum number of active reserves there have been in the protocol. It is the upper bound of the reserves list - uint16 internal _reservesCount; -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/EModeLogic.sol - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/GenericLogic.sol - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ValidationLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BridgeLogic.sol - -library BridgeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. - * @dev Essentially a supply without transferring the underlying. - * @dev Emits the `MintUnbacked` event - * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param asset The address of the underlying asset to mint aTokens of - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function executeMintUnbacked( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, reserve, amount, onBehalfOf); - - uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); - uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); - - uint256 unbacked = reserve.unbacked += amount.toUint128(); - - require( - unbacked <= unbackedMintCap * (10 ** reserveDecimals), - Errors.UNBACKED_MINT_CAP_EXCEEDED - ); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, 0, 0); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - onBehalfOf, - amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration, - reserveCache.aTokenAddress - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); - } - } - - emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); - } - - /** - * @notice Back the current unbacked with `amount` and pay `fee`. - * @dev It is not possible to back more than the existing unbacked amount of the reserve - * @dev Emits the `BackUnbacked` event - * @param reserve The reserve to back unbacked for - * @param asset The address of the underlying asset to repay - * @param amount The amount to back - * @param fee The amount paid in fees - * @param protocolFeeBps The fraction of fees in basis points paid to the protocol - * @return The backed amount - */ - function executeBackUnbacked( - DataTypes.ReserveData storage reserve, - address asset, - uint256 amount, - uint256 fee, - uint256 protocolFeeBps - ) external returns (uint256) { - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; - - uint256 feeToProtocol = fee.percentMul(protocolFeeBps); - uint256 feeToLP = fee - feeToProtocol; - uint256 added = backingAmount + fee; - - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply() + - uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), - feeToLP - ); - - reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - - reserve.unbacked -= backingAmount.toUint128(); - reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, added, 0); - - IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); - - emit BackUnbacked(asset, msg.sender, backingAmount, fee); - - return backingAmount; - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/PoolLogic.sol - -/** - * @title PoolLogic library - * @author Aave - * @notice Implements the logic for Pool specific functions - */ -library PoolLogic { - using GPv2SafeERC20 for IERC20; - using WadRayMath for uint256; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice Initialize an asset reserve and add the reserve to the list of reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param params Additional parameters needed for initiation - * @return true if appended, false if inserted at existing empty spot - */ - function executeInitReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.InitReserveParams memory params - ) external returns (bool) { - require(Address.isContract(params.asset), Errors.NOT_CONTRACT); - reservesData[params.asset].init( - params.aTokenAddress, - params.variableDebtAddress, - params.interestRateStrategyAddress - ); - - bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || - reservesList[0] == params.asset; - require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); - - for (uint16 i = 0; i < params.reservesCount; i++) { - if (reservesList[i] == address(0)) { - reservesData[params.asset].id = i; - reservesList[i] = params.asset; - return false; - } - } - - require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); - reservesData[params.asset].id = params.reservesCount; - reservesList[params.reservesCount] = params.asset; - return true; - } - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function executeRescueTokens(address token, address to, uint256 amount) external { - IERC20(token).safeTransfer(to, amount); - } - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param reservesData The state of all the reserves - * @param assets The list of reserves for which the minting needs to be executed - */ - function executeMintToTreasury( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] calldata assets - ) external { - for (uint256 i = 0; i < assets.length; i++) { - address assetAddress = assets[i]; - - DataTypes.ReserveData storage reserve = reservesData[assetAddress]; - - // this cover both inactive reserves and invalid reserves since the flag will be 0 for both - if (!reserve.configuration.getActive()) { - continue; - } - - uint256 accruedToTreasury = reserve.accruedToTreasury; - - if (accruedToTreasury != 0) { - reserve.accruedToTreasury = 0; - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); - IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); - - emit MintedToTreasury(assetAddress, amountToMint); - } - } - } - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function executeResetIsolationModeTotalDebt( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset - ) external { - require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); - reservesData[asset].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(asset, 0); - } - - /** - * @notice Sets the liquidation grace period of the asset - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - */ - function executeSetLiquidationGracePeriod( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset, - uint40 until - ) external { - reservesData[asset].liquidationGracePeriodUntil = until; - } - - /** - * @notice Drop a reserve - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param asset The address of the underlying asset of the reserve - */ - function executeDropReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - address asset - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - ValidationLogic.validateDropReserve(reservesList, reserve, asset); - reservesList[reservesData[asset].id] = address(0); - delete reservesData[asset]; - } - - /** - * @notice Returns the user account data across all the reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the calculation - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function executeGetUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ) - { - ( - totalCollateralBase, - totalDebtBase, - ltv, - currentLiquidationThreshold, - healthFactor, - - ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); - - availableBorrowsBase = GenericLogic.calculateAvailableBorrows( - totalCollateralBase, - totalDebtBase, - ltv - ); - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/SupplyLogic.sol - -/** - * @title SupplyLogic library - * @author Aave - * @notice Implements the base logic for supply/withdraw - */ -library SupplyLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. - * @dev Emits the `Supply()` event. - * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as - * collateral. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the supply function - */ - function executeSupply( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSupplyParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, reserve, params.amount, params.onBehalfOf); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, params.amount, 0); - - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - params.onBehalfOf, - params.amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration, - reserveCache.aTokenAddress - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); - } - } - - emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); - } - - /** - * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset - * previously supplied in the Aave protocol. - * @dev Emits the `Withdraw()` event. - * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the withdraw function - * @return The actual amount withdrawn - */ - function executeWithdraw( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteWithdrawParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - require(params.to != reserveCache.aTokenAddress, Errors.WITHDRAW_TO_ATOKEN); - - reserve.updateState(reserveCache); - - uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( - reserveCache.nextLiquidityIndex - ); - - uint256 amountToWithdraw = params.amount; - - if (params.amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - - ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, amountToWithdraw); - - bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); - - if (isCollateral && amountToWithdraw == userBalance) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - params.to, - amountToWithdraw, - reserveCache.nextLiquidityIndex - ); - - if (isCollateral && userConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - params.asset, - msg.sender, - params.reservesCount, - params.oracle, - params.userEModeCategory - ); - } - - emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); - - return amountToWithdraw; - } - - /** - * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid - * collateralization constraints violation. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as - * collateral. - * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param params The additional parameters needed to execute the finalizeTransfer function - */ - function executeFinalizeTransfer( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.FinalizeTransferParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - - ValidationLogic.validateTransfer(reserve); - - uint256 reserveId = reserve.id; - uint256 scaledAmount = params.amount.rayDiv(reserve.getNormalizedIncome()); - - if (params.from != params.to && scaledAmount != 0) { - DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; - - if (fromConfig.isUsingAsCollateral(reserveId)) { - if (fromConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - usersConfig[params.from], - params.asset, - params.from, - params.reservesCount, - params.oracle, - params.fromEModeCategory - ); - } - if (params.balanceFromBefore == params.amount) { - fromConfig.setUsingAsCollateral(reserveId, false); - emit ReserveUsedAsCollateralDisabled(params.asset, params.from); - } - } - - if (params.balanceToBefore == 0) { - DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - toConfig, - reserve.configuration, - reserve.aTokenAddress - ) - ) { - toConfig.setUsingAsCollateral(reserveId, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.to); - } - } - } - } - - /** - * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as - * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor - * checks to ensure collateralization. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. - * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The users configuration mapping that track the supplied/borrowed assets - * @param asset The address of the asset being configured as collateral - * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise - * @param reservesCount The number of initialized reserves - * @param priceOracle The address of the price oracle - * @param userEModeCategory The eMode category chosen by the user - */ - function executeUseReserveAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - bool useAsCollateral, - uint256 reservesCount, - address priceOracle, - uint8 userEModeCategory - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); - - ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); - - if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; - - if (useAsCollateral) { - require( - ValidationLogic.validateUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration - ), - Errors.USER_IN_ISOLATION_MODE_OR_LTV_ZERO - ); - - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, msg.sender); - } else { - userConfig.setUsingAsCollateral(reserve.id, false); - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - asset, - msg.sender, - reservesCount, - priceOracle, - userEModeCategory - ); - - emit ReserveUsedAsCollateralDisabled(asset, msg.sender); - } - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BorrowLogic.sol - -/** - * @title BorrowLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to borrowing - */ -library BorrowLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the - * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the - * isolated debt. - * @dev Emits the `Borrow()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the borrow function - */ - function executeBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteBorrowParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ( - bool isolationModeActive, - address isolationModeCollateralAddress, - uint256 isolationModeDebtCeiling - ) = userConfig.getIsolationModeState(reservesData, reservesList); - - ValidationLogic.validateBorrow( - reservesData, - reservesList, - eModeCategories, - DataTypes.ValidateBorrowParams({ - reserveCache: reserveCache, - userConfig: userConfig, - asset: params.asset, - userAddress: params.onBehalfOf, - amount: params.amount, - interestRateMode: params.interestRateMode, - reservesCount: params.reservesCount, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory, - priceOracleSentinel: params.priceOracleSentinel, - isolationModeActive: isolationModeActive, - isolationModeCollateralAddress: isolationModeCollateralAddress, - isolationModeDebtCeiling: isolationModeDebtCeiling - }) - ); - - bool isFirstBorrowing = false; - - (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); - - if (isFirstBorrowing) { - userConfig.setBorrowing(reserve.id, true); - } - - if (isolationModeActive) { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt += (params.amount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - 0, - params.releaseUnderlying ? params.amount : 0 - ); - - if (params.releaseUnderlying) { - IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); - } - - emit Borrow( - params.asset, - params.user, - params.onBehalfOf, - params.amount, - DataTypes.InterestRateMode.VARIABLE, - reserve.currentVariableBorrowRate, - params.referralCode - ); - } - - /** - * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the - * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also - * reduces the isolated debt. - * @dev Emits the `Repay()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the repay function - * @return The actual amount being repaid - */ - function executeRepay( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteRepayParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - - uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( - params.onBehalfOf - ); - - ValidationLogic.validateRepay( - reserveCache, - params.amount, - params.interestRateMode, - params.onBehalfOf, - variableDebt - ); - - uint256 paybackAmount = variableDebt; - - // Allows a user to repay with aTokens without leaving dust from interest. - if (params.useATokens && params.amount == type(uint256).max) { - params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); - } - - if (params.amount < paybackAmount) { - paybackAmount = params.amount; - } - - reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) - .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - params.useATokens ? 0 : paybackAmount, - 0 - ); - - if (variableDebt - paybackAmount == 0) { - userConfig.setBorrowing(reserve.id, false); - } - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - reserveCache, - paybackAmount - ); - - if (params.useATokens) { - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - reserveCache.aTokenAddress, - paybackAmount, - reserveCache.nextLiquidityIndex - ); - // in case of aToken repayment the msg.sender must always repay on behalf of itself - if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - } else { - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); - IAToken(reserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.onBehalfOf, - paybackAmount - ); - } - - emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); - - return paybackAmount; - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/LiquidationLogic.sol - -/** - * @title LiquidationLogic library - * @author Aave - * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations - */ -library LiquidationLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Default percentage of borrower's debt to be repaid in a liquidation. - * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 0.5e4 results in 50.00% - */ - uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; - - /** - * @dev Maximum percentage of borrower's debt to be repaid in a liquidation - * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 1e4 results in 100.00% - */ - uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; - - /** - * @dev This constant represents below which health factor value it is possible to liquidate - * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. - * A value of 0.95e18 results in 0.95 - */ - uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; - - struct LiquidationCallLocalVars { - uint256 userCollateralBalance; - uint256 userTotalDebt; - uint256 actualDebtToLiquidate; - uint256 actualCollateralToLiquidate; - uint256 liquidationBonus; - uint256 healthFactor; - uint256 liquidationProtocolFeeAmount; - IAToken collateralAToken; - DataTypes.ReserveCache debtReserveCache; - } - - /** - * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) - * covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportional amount of the `collateralAsset` plus a bonus to cover market risk - * @dev Emits the `LiquidationCall()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params The additional parameters needed to execute the liquidation function - */ - function executeLiquidationCall( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ExecuteLiquidationCallParams memory params - ) external { - LiquidationCallLocalVars memory vars; - - DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; - DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; - DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; - vars.debtReserveCache = debtReserve.cache(); - debtReserve.updateState(vars.debtReserveCache); - - (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: params.reservesCount, - user: params.user, - oracle: params.priceOracle, - userEModeCategory: params.userEModeCategory - }) - ); - - (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( - vars.debtReserveCache, - params, - vars.healthFactor - ); - - ValidationLogic.validateLiquidationCall( - userConfig, - collateralReserve, - debtReserve, - DataTypes.ValidateLiquidationCallParams({ - debtReserveCache: vars.debtReserveCache, - totalDebt: vars.userTotalDebt, - healthFactor: vars.healthFactor, - priceOracleSentinel: params.priceOracleSentinel - }) - ); - - vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); - if ( - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - collateralReserve.id - ) - ) { - vars.liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; - } else { - vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); - } - - vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); - - ( - vars.actualCollateralToLiquidate, - vars.actualDebtToLiquidate, - vars.liquidationProtocolFeeAmount - ) = _calculateAvailableCollateralToLiquidate( - collateralReserve, - vars.debtReserveCache, - params.collateralAsset, - params.debtAsset, - vars.actualDebtToLiquidate, - vars.userCollateralBalance, - vars.liquidationBonus, - IPriceOracleGetter(params.priceOracle) - ); - - if (vars.userTotalDebt == vars.actualDebtToLiquidate) { - userConfig.setBorrowing(debtReserve.id, false); - } - - // If the collateral being liquidated is equal to the user balance, - // we set the currency as not being used as collateral anymore - if ( - vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == - vars.userCollateralBalance - ) { - userConfig.setUsingAsCollateral(collateralReserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); - } - - _burnDebtTokens(params, vars); - - debtReserve.updateInterestRatesAndVirtualBalance( - vars.debtReserveCache, - params.debtAsset, - vars.actualDebtToLiquidate, - 0 - ); - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - vars.debtReserveCache, - vars.actualDebtToLiquidate - ); - - if (params.receiveAToken) { - _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); - } else { - _burnCollateralATokens(collateralReserve, params, vars); - } - - // Transfer fee to treasury if it is non-zero - if (vars.liquidationProtocolFeeAmount != 0) { - uint256 liquidityIndex = collateralReserve.getNormalizedIncome(); - uint256 scaledDownLiquidationProtocolFee = vars.liquidationProtocolFeeAmount.rayDiv( - liquidityIndex - ); - uint256 scaledDownUserBalance = vars.collateralAToken.scaledBalanceOf(params.user); - // To avoid trying to send more aTokens than available on balance, due to 1 wei imprecision - if (scaledDownLiquidationProtocolFee > scaledDownUserBalance) { - vars.liquidationProtocolFeeAmount = scaledDownUserBalance.rayMul(liquidityIndex); - } - vars.collateralAToken.transferOnLiquidation( - params.user, - vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), - vars.liquidationProtocolFeeAmount - ); - } - - // Transfers the debt asset being repaid to the aToken, where the liquidity is kept - IERC20(params.debtAsset).safeTransferFrom( - msg.sender, - vars.debtReserveCache.aTokenAddress, - vars.actualDebtToLiquidate - ); - - IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.user, - vars.actualDebtToLiquidate - ); - - emit LiquidationCall( - params.collateralAsset, - params.debtAsset, - params.user, - vars.actualDebtToLiquidate, - vars.actualCollateralToLiquidate, - msg.sender, - params.receiveAToken - ); - } - - /** - * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. - * @dev The function also updates the state and the interest rate of the collateral reserve. - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _burnCollateralATokens( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); - collateralReserve.updateState(collateralReserveCache); - collateralReserve.updateInterestRatesAndVirtualBalance( - collateralReserveCache, - params.collateralAsset, - 0, - vars.actualCollateralToLiquidate - ); - - // Burn the equivalent amount of aToken, sending the underlying to the liquidator - vars.collateralAToken.burn( - params.user, - msg.sender, - vars.actualCollateralToLiquidate, - collateralReserveCache.nextLiquidityIndex - ); - } - - /** - * @notice Liquidates the user aTokens by transferring them to the liquidator. - * @dev The function also checks the state of the liquidator and activates the aToken as collateral - * as in standard transfers if the isolation mode constraints are respected. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _liquidateATokens( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); - vars.collateralAToken.transferOnLiquidation( - params.user, - msg.sender, - vars.actualCollateralToLiquidate - ); - - if (liquidatorPreviousATokenBalance == 0) { - DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - liquidatorConfig, - collateralReserve.configuration, - collateralReserve.aTokenAddress - ) - ) { - liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); - } - } - } - - /** - * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. - * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. - * @param params The additional parameters needed to execute the liquidation function - * @param vars the executeLiquidationCall() function local vars - */ - function _burnDebtTokens( - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( - vars.debtReserveCache.variableDebtTokenAddress - ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); - } - - /** - * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor - * and corresponding close factor. - * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR - * @param debtReserveCache The reserve cache data object of the debt reserve - * @param params The additional parameters needed to execute the liquidation function - * @param healthFactor The health factor of the position - * @return The total debt of the user - * @return The actual debt to liquidate as a function of the closeFactor - */ - function _calculateDebt( - DataTypes.ReserveCache memory debtReserveCache, - DataTypes.ExecuteLiquidationCallParams memory params, - uint256 healthFactor - ) internal view returns (uint256, uint256) { - uint256 userVariableDebt = IERC20(debtReserveCache.variableDebtTokenAddress).balanceOf( - params.user - ); - - uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD - ? DEFAULT_LIQUIDATION_CLOSE_FACTOR - : MAX_LIQUIDATION_CLOSE_FACTOR; - - uint256 maxLiquidatableDebt = userVariableDebt.percentMul(closeFactor); - - uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt - ? maxLiquidatableDebt - : params.debtToCover; - - return (userVariableDebt, actualDebtToLiquidate); - } - - struct AvailableCollateralToLiquidateLocalVars { - uint256 collateralPrice; - uint256 debtAssetPrice; - uint256 maxCollateralToLiquidate; - uint256 baseCollateral; - uint256 bonusCollateral; - uint256 debtAssetDecimals; - uint256 collateralDecimals; - uint256 collateralAssetUnit; - uint256 debtAssetUnit; - uint256 collateralAmount; - uint256 debtAmountNeeded; - uint256 liquidationProtocolFeePercentage; - uint256 liquidationProtocolFee; - } - - /** - * @notice Calculates how much of a specific collateral can be liquidated, given - * a certain amount of debt asset. - * @dev This function needs to be called after all the checks to validate the liquidation have been performed, - * otherwise it might fail. - * @param collateralReserve The data of the collateral reserve - * @param debtReserveCache The cached data of the debt reserve - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated - * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation - * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) - * @return The amount to repay with the liquidation - * @return The fee taken from the liquidation bonus amount to be paid to the protocol - */ - function _calculateAvailableCollateralToLiquidate( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveCache memory debtReserveCache, - address collateralAsset, - address debtAsset, - uint256 debtToCover, - uint256 userCollateralBalance, - uint256 liquidationBonus, - IPriceOracleGetter oracle - ) internal view returns (uint256, uint256, uint256) { - AvailableCollateralToLiquidateLocalVars memory vars; - - vars.collateralPrice = oracle.getAssetPrice(collateralAsset); - vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); - - vars.collateralDecimals = collateralReserve.configuration.getDecimals(); - vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); - - unchecked { - vars.collateralAssetUnit = 10 ** vars.collateralDecimals; - vars.debtAssetUnit = 10 ** vars.debtAssetDecimals; - } - - vars.liquidationProtocolFeePercentage = collateralReserve - .configuration - .getLiquidationProtocolFee(); - - // This is the base collateral to liquidate based on the given debt to cover - vars.baseCollateral = - ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / - (vars.collateralPrice * vars.debtAssetUnit); - - vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); - - if (vars.maxCollateralToLiquidate > userCollateralBalance) { - vars.collateralAmount = userCollateralBalance; - vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / - (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); - } else { - vars.collateralAmount = vars.maxCollateralToLiquidate; - vars.debtAmountNeeded = debtToCover; - } - - if (vars.liquidationProtocolFeePercentage != 0) { - vars.bonusCollateral = - vars.collateralAmount - - vars.collateralAmount.percentDiv(liquidationBonus); - - vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( - vars.liquidationProtocolFeePercentage - ); - - return ( - vars.collateralAmount - vars.liquidationProtocolFee, - vars.debtAmountNeeded, - vars.liquidationProtocolFee - ); - } else { - return (vars.collateralAmount, vars.debtAmountNeeded, 0); - } - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol - -/** - * @title FlashLoanLogic library - * @author Aave - * @notice Implements the logic for the flash loans - */ -library FlashLoanLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - - // See `IPool` for descriptions - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - // Helper struct for internal variables used in the `executeFlashLoan` function - struct FlashLoanLocalVars { - IFlashLoanReceiver receiver; - address currentAsset; - uint256 currentAmount; - uint256[] totalPremiums; - uint256 flashloanPremiumTotal; - uint256 flashloanPremiumToProtocol; - } - - /** - * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction - * as long as the amount taken plus fee is returned or debt is opened. - * @dev For authorized flashborrowers the fee is waived - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the flashloan function - */ - function executeFlashLoan( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.FlashloanParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); - - FlashLoanLocalVars memory vars; - - vars.totalPremiums = new uint256[](params.assets.length); - - vars.receiver = IFlashLoanReceiver(params.receiverAddress); - (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower - ? (0, 0) - : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); - - for (uint256 i = 0; i < params.assets.length; i++) { - vars.currentAmount = params.amounts[i]; - vars.totalPremiums[i] = DataTypes.InterestRateMode(params.interestRateModes[i]) == - DataTypes.InterestRateMode.NONE - ? vars.currentAmount.percentMul(vars.flashloanPremiumTotal) - : 0; - - if (reservesData[params.assets[i]].configuration.getIsVirtualAccActive()) { - reservesData[params.assets[i]].virtualUnderlyingBalance -= vars.currentAmount.toUint128(); - } - - IAToken(reservesData[params.assets[i]].aTokenAddress).transferUnderlyingTo( - params.receiverAddress, - vars.currentAmount - ); - } - - require( - vars.receiver.executeOperation( - params.assets, - params.amounts, - vars.totalPremiums, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - for (uint256 i = 0; i < params.assets.length; i++) { - vars.currentAsset = params.assets[i]; - vars.currentAmount = params.amounts[i]; - - if ( - DataTypes.InterestRateMode(params.interestRateModes[i]) == DataTypes.InterestRateMode.NONE - ) { - _handleFlashLoanRepayment( - reservesData[vars.currentAsset], - DataTypes.FlashLoanRepaymentParams({ - asset: vars.currentAsset, - receiverAddress: params.receiverAddress, - amount: vars.currentAmount, - totalPremium: vars.totalPremiums[i], - flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } else { - // If the user chose to not return the funds, the system checks if there is enough collateral and - // eventually opens a debt position - BorrowLogic.executeBorrow( - reservesData, - reservesList, - eModeCategories, - userConfig, - DataTypes.ExecuteBorrowParams({ - asset: vars.currentAsset, - user: msg.sender, - onBehalfOf: params.onBehalfOf, - amount: vars.currentAmount, - interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[i]), - referralCode: params.referralCode, - releaseUnderlying: false, - reservesCount: IPool(params.pool).getReservesCount(), - oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), - userEModeCategory: IPool(params.pool).getUserEMode(params.onBehalfOf).toUint8(), - priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) - .getPriceOracleSentinel() - }) - ); - // no premium is paid when taking on the flashloan as debt - emit FlashLoan( - params.receiverAddress, - msg.sender, - vars.currentAsset, - vars.currentAmount, - DataTypes.InterestRateMode(params.interestRateModes[i]), - 0, - params.referralCode - ); - } - } - } - - /** - * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one - * transaction as long as the amount taken plus fee is returned. - * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the simple flashloan function - */ - function executeFlashLoanSimple( - DataTypes.ReserveData storage reserve, - DataTypes.FlashloanSimpleParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloanSimple(reserve, params.amount); - - IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); - uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); - - if (reserve.configuration.getIsVirtualAccActive()) { - reserve.virtualUnderlyingBalance -= params.amount.toUint128(); - } - - IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); - - require( - receiver.executeOperation( - params.asset, - params.amount, - totalPremium, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - _handleFlashLoanRepayment( - reserve, - DataTypes.FlashLoanRepaymentParams({ - asset: params.asset, - receiverAddress: params.receiverAddress, - amount: params.amount, - totalPremium: totalPremium, - flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } - - /** - * @notice Handles repayment of flashloaned assets + premium - * @dev Will pull the amount + premium from the receiver, so must have approved pool - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the repayment function - */ - function _handleFlashLoanRepayment( - DataTypes.ReserveData storage reserve, - DataTypes.FlashLoanRepaymentParams memory params - ) internal { - uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); - uint256 premiumToLP = params.totalPremium - premiumToProtocol; - uint256 amountPlusPremium = params.amount + params.totalPremium; - - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply() + - uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), - premiumToLP - ); - - reserve.accruedToTreasury += premiumToProtocol - .rayDiv(reserveCache.nextLiquidityIndex) - .toUint128(); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, amountPlusPremium, 0); - - IERC20(params.asset).safeTransferFrom( - params.receiverAddress, - reserveCache.aTokenAddress, - amountPlusPremium - ); - - IAToken(reserveCache.aTokenAddress).handleRepayment( - params.receiverAddress, - params.receiverAddress, - amountPlusPremium - ); - - emit FlashLoan( - params.receiverAddress, - msg.sender, - params.asset, - params.amount, - DataTypes.InterestRateMode.NONE, - params.totalPremium, - params.referralCode - ); - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/Pool.sol - -/** - * @title Pool contract - * @author Aave - * @notice Main point of interaction with an Aave protocol's market - * - Users can: - * # Supply - * # Withdraw - * # Borrow - * # Repay - * # Enable/disable their supplied assets as collateral - * # Liquidate positions - * # Execute Flash Loans - * @dev To be covered by a proxy contract, owned by the PoolAddressesProvider of the specific market - * @dev All admin functions are callable by the PoolConfigurator contract defined also in the - * PoolAddressesProvider - */ -abstract contract Pool is VersionedInitializable, PoolStorage, IPool { - using ReserveLogic for DataTypes.ReserveData; - - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @dev Only pool configurator can call functions marked by this modifier. - */ - modifier onlyPoolConfigurator() { - _onlyPoolConfigurator(); - _; - } - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - _onlyPoolAdmin(); - _; - } - - /** - * @dev Only bridge can call functions marked by this modifier. - */ - modifier onlyBridge() { - _onlyBridge(); - _; - } - - function _onlyPoolConfigurator() internal view virtual { - require( - ADDRESSES_PROVIDER.getPoolConfigurator() == msg.sender, - Errors.CALLER_NOT_POOL_CONFIGURATOR - ); - } - - function _onlyPoolAdmin() internal view virtual { - require( - IACLManager(ADDRESSES_PROVIDER.getACLManager()).isPoolAdmin(msg.sender), - Errors.CALLER_NOT_POOL_ADMIN - ); - } - - function _onlyBridge() internal view virtual { - require( - IACLManager(ADDRESSES_PROVIDER.getACLManager()).isBridge(msg.sender), - Errors.CALLER_NOT_BRIDGE - ); - } - - /** - * @dev Constructor. - * @param provider The address of the PoolAddressesProvider contract - */ - constructor(IPoolAddressesProvider provider) { - ADDRESSES_PROVIDER = provider; - } - - /** - * @notice Initializes the Pool. - * @dev Function is invoked by the proxy contract when the Pool contract is added to the - * PoolAddressesProvider of the market. - * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations - * @param provider The address of the PoolAddressesProvider - */ - function initialize(IPoolAddressesProvider provider) external virtual; - - /// @inheritdoc IPool - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external virtual override onlyBridge { - BridgeLogic.executeMintUnbacked( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - asset, - amount, - onBehalfOf, - referralCode - ); - } - - /// @inheritdoc IPool - function backUnbacked( - address asset, - uint256 amount, - uint256 fee - ) external virtual override onlyBridge returns (uint256) { - return - BridgeLogic.executeBackUnbacked(_reserves[asset], asset, amount, fee, _bridgeProtocolFee); - } - - /// @inheritdoc IPool - function supply( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) public virtual override { - SupplyLogic.executeSupply( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteSupplyParams({ - asset: asset, - amount: amount, - onBehalfOf: onBehalfOf, - referralCode: referralCode - }) - ); - } - - /// @inheritdoc IPool - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) public virtual override { - try - IERC20WithPermit(asset).permit( - msg.sender, - address(this), - amount, - deadline, - permitV, - permitR, - permitS - ) - {} catch {} - SupplyLogic.executeSupply( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteSupplyParams({ - asset: asset, - amount: amount, - onBehalfOf: onBehalfOf, - referralCode: referralCode - }) - ); - } - - /// @inheritdoc IPool - function withdraw( - address asset, - uint256 amount, - address to - ) public virtual override returns (uint256) { - return - SupplyLogic.executeWithdraw( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[msg.sender], - DataTypes.ExecuteWithdrawParams({ - asset: asset, - amount: amount, - to: to, - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[msg.sender] - }) - ); - } - - /// @inheritdoc IPool - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) public virtual override { - BorrowLogic.executeBorrow( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[onBehalfOf], - DataTypes.ExecuteBorrowParams({ - asset: asset, - user: msg.sender, - onBehalfOf: onBehalfOf, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - referralCode: referralCode, - releaseUnderlying: true, - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[onBehalfOf], - priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() - }) - ); - } - - /// @inheritdoc IPool - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) public virtual override returns (uint256) { - return - BorrowLogic.executeRepay( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteRepayParams({ - asset: asset, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - onBehalfOf: onBehalfOf, - useATokens: false - }) - ); - } - - /// @inheritdoc IPool - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) public virtual override returns (uint256) { - try - IERC20WithPermit(asset).permit( - msg.sender, - address(this), - amount, - deadline, - permitV, - permitR, - permitS - ) - {} catch {} - - { - DataTypes.ExecuteRepayParams memory params = DataTypes.ExecuteRepayParams({ - asset: asset, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - onBehalfOf: onBehalfOf, - useATokens: false - }); - return BorrowLogic.executeRepay(_reserves, _reservesList, _usersConfig[onBehalfOf], params); - } - } - - /// @inheritdoc IPool - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) public virtual override returns (uint256) { - return - BorrowLogic.executeRepay( - _reserves, - _reservesList, - _usersConfig[msg.sender], - DataTypes.ExecuteRepayParams({ - asset: asset, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - onBehalfOf: msg.sender, - useATokens: true - }) - ); - } - - /// @inheritdoc IPool - function setUserUseReserveAsCollateral( - address asset, - bool useAsCollateral - ) public virtual override { - SupplyLogic.executeUseReserveAsCollateral( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[msg.sender], - asset, - useAsCollateral, - _reservesCount, - ADDRESSES_PROVIDER.getPriceOracle(), - _usersEModeCategory[msg.sender] - ); - } - - /// @inheritdoc IPool - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) public virtual override { - LiquidationLogic.executeLiquidationCall( - _reserves, - _reservesList, - _usersConfig, - _eModeCategories, - DataTypes.ExecuteLiquidationCallParams({ - reservesCount: _reservesCount, - debtToCover: debtToCover, - collateralAsset: collateralAsset, - debtAsset: debtAsset, - user: user, - receiveAToken: receiveAToken, - priceOracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[user], - priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() - }) - ); - } - - /// @inheritdoc IPool - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) public virtual override { - DataTypes.FlashloanParams memory flashParams = DataTypes.FlashloanParams({ - receiverAddress: receiverAddress, - assets: assets, - amounts: amounts, - interestRateModes: interestRateModes, - onBehalfOf: onBehalfOf, - params: params, - referralCode: referralCode, - flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, - flashLoanPremiumTotal: _flashLoanPremiumTotal, - reservesCount: _reservesCount, - addressesProvider: address(ADDRESSES_PROVIDER), - pool: address(this), - userEModeCategory: _usersEModeCategory[onBehalfOf], - isAuthorizedFlashBorrower: IACLManager(ADDRESSES_PROVIDER.getACLManager()).isFlashBorrower( - msg.sender - ) - }); - - FlashLoanLogic.executeFlashLoan( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[onBehalfOf], - flashParams - ); - } - - /// @inheritdoc IPool - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) public virtual override { - DataTypes.FlashloanSimpleParams memory flashParams = DataTypes.FlashloanSimpleParams({ - receiverAddress: receiverAddress, - asset: asset, - amount: amount, - params: params, - referralCode: referralCode, - flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, - flashLoanPremiumTotal: _flashLoanPremiumTotal - }); - FlashLoanLogic.executeFlashLoanSimple(_reserves[asset], flashParams); - } - - /// @inheritdoc IPool - function mintToTreasury(address[] calldata assets) external virtual override { - PoolLogic.executeMintToTreasury(_reserves, assets); - } - - /// @inheritdoc IPool - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory) { - return _reserves[asset]; - } - - /// @inheritdoc IPool - function getReserveData( - address asset - ) external view virtual override returns (DataTypes.ReserveDataLegacy memory) { - DataTypes.ReserveData memory reserve = _reserves[asset]; - DataTypes.ReserveDataLegacy memory res; - - res.configuration = reserve.configuration; - res.liquidityIndex = reserve.liquidityIndex; - res.currentLiquidityRate = reserve.currentLiquidityRate; - res.variableBorrowIndex = reserve.variableBorrowIndex; - res.currentVariableBorrowRate = reserve.currentVariableBorrowRate; - res.lastUpdateTimestamp = reserve.lastUpdateTimestamp; - res.id = reserve.id; - res.aTokenAddress = reserve.aTokenAddress; - res.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - res.interestRateStrategyAddress = reserve.interestRateStrategyAddress; - res.accruedToTreasury = reserve.accruedToTreasury; - res.unbacked = reserve.unbacked; - res.isolationModeTotalDebt = reserve.isolationModeTotalDebt; - // This is a temporary workaround for integrations that are broken by Aave 3.2 - // While the new pool data provider is backward compatible, some integrations hard-code an old implementation - // To allow them to unlock the funds, the pool address provider is setting a stable debt token, so balanceOf() and totalSupply() will return zero instead of reverting - res.stableDebtTokenAddress = ADDRESSES_PROVIDER.getAddress(bytes32('MOCK_STABLE_DEBT')); - return res; - } - - /// @inheritdoc IPool - function getVirtualUnderlyingBalance( - address asset - ) external view virtual override returns (uint128) { - return _reserves[asset].virtualUnderlyingBalance; - } - - /// @inheritdoc IPool - function getUserAccountData( - address user - ) - external - view - virtual - override - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ) - { - return - PoolLogic.executeGetUserAccountData( - _reserves, - _reservesList, - _eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: _usersConfig[user], - reservesCount: _reservesCount, - user: user, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[user] - }) - ); - } - - /// @inheritdoc IPool - function getConfiguration( - address asset - ) external view virtual override returns (DataTypes.ReserveConfigurationMap memory) { - return _reserves[asset].configuration; - } - - /// @inheritdoc IPool - function getUserConfiguration( - address user - ) external view virtual override returns (DataTypes.UserConfigurationMap memory) { - return _usersConfig[user]; - } - - /// @inheritdoc IPool - function getReserveNormalizedIncome( - address asset - ) external view virtual override returns (uint256) { - return _reserves[asset].getNormalizedIncome(); - } - - /// @inheritdoc IPool - function getReserveNormalizedVariableDebt( - address asset - ) external view virtual override returns (uint256) { - return _reserves[asset].getNormalizedDebt(); - } - - /// @inheritdoc IPool - function getReservesList() external view virtual override returns (address[] memory) { - uint256 reservesListCount = _reservesCount; - uint256 droppedReservesCount = 0; - address[] memory reservesList = new address[](reservesListCount); - - for (uint256 i = 0; i < reservesListCount; i++) { - if (_reservesList[i] != address(0)) { - reservesList[i - droppedReservesCount] = _reservesList[i]; - } else { - droppedReservesCount++; - } - } - - // Reduces the length of the reserves array by `droppedReservesCount` - assembly { - mstore(reservesList, sub(reservesListCount, droppedReservesCount)) - } - return reservesList; - } - - /// @inheritdoc IPool - function getReservesCount() external view virtual override returns (uint256) { - return _reservesCount; - } - - /// @inheritdoc IPool - function getReserveAddressById(uint16 id) external view returns (address) { - return _reservesList[id]; - } - - /// @inheritdoc IPool - function BRIDGE_PROTOCOL_FEE() public view virtual override returns (uint256) { - return _bridgeProtocolFee; - } - - /// @inheritdoc IPool - function FLASHLOAN_PREMIUM_TOTAL() public view virtual override returns (uint128) { - return _flashLoanPremiumTotal; - } - - /// @inheritdoc IPool - function FLASHLOAN_PREMIUM_TO_PROTOCOL() public view virtual override returns (uint128) { - return _flashLoanPremiumToProtocol; - } - - /// @inheritdoc IPool - function MAX_NUMBER_RESERVES() public view virtual override returns (uint16) { - return ReserveConfiguration.MAX_RESERVES_COUNT; - } - - /// @inheritdoc IPool - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external virtual override { - require(msg.sender == _reserves[asset].aTokenAddress, Errors.CALLER_NOT_ATOKEN); - SupplyLogic.executeFinalizeTransfer( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig, - DataTypes.FinalizeTransferParams({ - asset: asset, - from: from, - to: to, - amount: amount, - balanceFromBefore: balanceFromBefore, - balanceToBefore: balanceToBefore, - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - fromEModeCategory: _usersEModeCategory[from] - }) - ); - } - - /// @inheritdoc IPool - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external virtual override onlyPoolConfigurator { - if ( - PoolLogic.executeInitReserve( - _reserves, - _reservesList, - DataTypes.InitReserveParams({ - asset: asset, - aTokenAddress: aTokenAddress, - variableDebtAddress: variableDebtAddress, - interestRateStrategyAddress: interestRateStrategyAddress, - reservesCount: _reservesCount, - maxNumberReserves: MAX_NUMBER_RESERVES() - }) - ) - ) { - _reservesCount++; - } - } - - /// @inheritdoc IPool - function dropReserve(address asset) external virtual override onlyPoolConfigurator { - PoolLogic.executeDropReserve(_reserves, _reservesList, asset); - } - - /// @inheritdoc IPool - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external virtual override onlyPoolConfigurator { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - - _reserves[asset].interestRateStrategyAddress = rateStrategyAddress; - } - - /// @inheritdoc IPool - function syncIndexesState(address asset) external virtual override onlyPoolConfigurator { - DataTypes.ReserveData storage reserve = _reserves[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - } - - /// @inheritdoc IPool - function syncRatesState(address asset) external virtual override onlyPoolConfigurator { - DataTypes.ReserveData storage reserve = _reserves[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - ReserveLogic.updateInterestRatesAndVirtualBalance(reserve, reserveCache, asset, 0, 0); - } - - /// @inheritdoc IPool - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external virtual override onlyPoolConfigurator { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - _reserves[asset].configuration = configuration; - } - - /// @inheritdoc IPool - function updateBridgeProtocolFee( - uint256 protocolFee - ) external virtual override onlyPoolConfigurator { - _bridgeProtocolFee = protocolFee; - } - - /// @inheritdoc IPool - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external virtual override onlyPoolConfigurator { - _flashLoanPremiumTotal = flashLoanPremiumTotal; - _flashLoanPremiumToProtocol = flashLoanPremiumToProtocol; - } - - /// @inheritdoc IPool - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory category - ) external virtual override onlyPoolConfigurator { - // category 0 is reserved for volatile heterogeneous assets and it's always disabled - require(id != 0, Errors.EMODE_CATEGORY_RESERVED); - _eModeCategories[id].ltv = category.ltv; - _eModeCategories[id].liquidationThreshold = category.liquidationThreshold; - _eModeCategories[id].liquidationBonus = category.liquidationBonus; - _eModeCategories[id].label = category.label; - } - - /// @inheritdoc IPool - function configureEModeCategoryCollateralBitmap( - uint8 id, - uint128 collateralBitmap - ) external virtual override onlyPoolConfigurator { - // category 0 is reserved for volatile heterogeneous assets and it's always disabled - require(id != 0, Errors.EMODE_CATEGORY_RESERVED); - _eModeCategories[id].collateralBitmap = collateralBitmap; - } - - /// @inheritdoc IPool - function configureEModeCategoryBorrowableBitmap( - uint8 id, - uint128 borrowableBitmap - ) external virtual override onlyPoolConfigurator { - // category 0 is reserved for volatile heterogeneous assets and it's always disabled - require(id != 0, Errors.EMODE_CATEGORY_RESERVED); - _eModeCategories[id].borrowableBitmap = borrowableBitmap; - } - - /// @inheritdoc IPool - function getEModeCategoryData( - uint8 id - ) external view virtual override returns (DataTypes.EModeCategoryLegacy memory) { - DataTypes.EModeCategory memory category = _eModeCategories[id]; - return - DataTypes.EModeCategoryLegacy({ - ltv: category.ltv, - liquidationThreshold: category.liquidationThreshold, - liquidationBonus: category.liquidationBonus, - priceSource: address(0), - label: category.label - }); - } - - /// @inheritdoc IPool - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory) { - return - DataTypes.CollateralConfig({ - ltv: _eModeCategories[id].ltv, - liquidationThreshold: _eModeCategories[id].liquidationThreshold, - liquidationBonus: _eModeCategories[id].liquidationBonus - }); - } - - /// @inheritdoc IPool - function getEModeCategoryLabel(uint8 id) external view returns (string memory) { - return _eModeCategories[id].label; - } - - /// @inheritdoc IPool - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128) { - return _eModeCategories[id].collateralBitmap; - } - - /// @inheritdoc IPool - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128) { - return _eModeCategories[id].borrowableBitmap; - } - - /// @inheritdoc IPool - function setUserEMode(uint8 categoryId) external virtual override { - EModeLogic.executeSetUserEMode( - _reserves, - _reservesList, - _eModeCategories, - _usersEModeCategory, - _usersConfig[msg.sender], - DataTypes.ExecuteSetUserEModeParams({ - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - categoryId: categoryId - }) - ); - } - - /// @inheritdoc IPool - function getUserEMode(address user) external view virtual override returns (uint256) { - return _usersEModeCategory[user]; - } - - /// @inheritdoc IPool - function resetIsolationModeTotalDebt( - address asset - ) external virtual override onlyPoolConfigurator { - PoolLogic.executeResetIsolationModeTotalDebt(_reserves, asset); - } - - /// @inheritdoc IPool - function getLiquidationGracePeriod(address asset) external virtual override returns (uint40) { - return _reserves[asset].liquidationGracePeriodUntil; - } - - /// @inheritdoc IPool - function setLiquidationGracePeriod( - address asset, - uint40 until - ) external virtual override onlyPoolConfigurator { - require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - PoolLogic.executeSetLiquidationGracePeriod(_reserves, asset, until); - } - - /// @inheritdoc IPool - function rescueTokens( - address token, - address to, - uint256 amount - ) external virtual override onlyPoolAdmin { - PoolLogic.executeRescueTokens(token, to, amount); - } - - /// @inheritdoc IPool - /// @dev Deprecated: maintained for compatibility purposes - function deposit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external virtual override { - SupplyLogic.executeSupply( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteSupplyParams({ - asset: asset, - amount: amount, - onBehalfOf: onBehalfOf, - referralCode: referralCode - }) - ); - } - - /// @inheritdoc IPool - function getFlashLoanLogic() external pure returns (address) { - return address(FlashLoanLogic); - } - - /// @inheritdoc IPool - function getBorrowLogic() external pure returns (address) { - return address(BorrowLogic); - } - - /// @inheritdoc IPool - function getBridgeLogic() external pure returns (address) { - return address(BridgeLogic); - } - - /// @inheritdoc IPool - function getEModeLogic() external pure returns (address) { - return address(EModeLogic); - } - - /// @inheritdoc IPool - function getLiquidationLogic() external pure returns (address) { - return address(LiquidationLogic); - } - - /// @inheritdoc IPool - function getPoolLogic() external pure returns (address) { - return address(PoolLogic); - } - - /// @inheritdoc IPool - function getSupplyLogic() external pure returns (address) { - return address(SupplyLogic); - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/PoolInstance.sol - -contract PoolInstance is Pool { - uint256 public constant POOL_REVISION = 6; - - constructor(IPoolAddressesProvider provider) Pool(provider) {} - - /** - * @notice Initializes the Pool. - * @dev Function is invoked by the proxy contract when the Pool contract is added to the - * PoolAddressesProvider of the market. - * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations - * @param provider The address of the PoolAddressesProvider - */ - function initialize(IPoolAddressesProvider provider) external virtual override initializer { - require(provider == ADDRESSES_PROVIDER, Errors.INVALID_ADDRESSES_PROVIDER); - } - - function getRevision() internal pure virtual override returns (uint256) { - return POOL_REVISION; - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/L2Pool.sol - -/** - * @title L2Pool - * @author Aave - * @notice Calldata optimized extension of the Pool contract allowing users to pass compact calldata representation - * to reduce transaction costs on rollups. - */ -abstract contract L2Pool is Pool, IL2Pool { - /// @inheritdoc IL2Pool - function supply(bytes32 args) external override { - (address asset, uint256 amount, uint16 referralCode) = CalldataLogic.decodeSupplyParams( - _reservesList, - args - ); - - supply(asset, amount, msg.sender, referralCode); - } - - /// @inheritdoc IL2Pool - function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s) external override { - (address asset, uint256 amount, uint16 referralCode, uint256 deadline, uint8 v) = CalldataLogic - .decodeSupplyWithPermitParams(_reservesList, args); - - supplyWithPermit(asset, amount, msg.sender, referralCode, deadline, v, r, s); - } - - /// @inheritdoc IL2Pool - function withdraw(bytes32 args) external override returns (uint256) { - (address asset, uint256 amount) = CalldataLogic.decodeWithdrawParams(_reservesList, args); - - return withdraw(asset, amount, msg.sender); - } - - /// @inheritdoc IL2Pool - function borrow(bytes32 args) external override { - (address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode) = CalldataLogic - .decodeBorrowParams(_reservesList, args); - - borrow(asset, amount, interestRateMode, referralCode, msg.sender); - } - - /// @inheritdoc IL2Pool - function repay(bytes32 args) external override returns (uint256) { - (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( - _reservesList, - args - ); - - return repay(asset, amount, interestRateMode, msg.sender); - } - - /// @inheritdoc IL2Pool - function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) external override returns (uint256) { - ( - address asset, - uint256 amount, - uint256 interestRateMode, - uint256 deadline, - uint8 v - ) = CalldataLogic.decodeRepayWithPermitParams(_reservesList, args); - - return repayWithPermit(asset, amount, interestRateMode, msg.sender, deadline, v, r, s); - } - - /// @inheritdoc IL2Pool - function repayWithATokens(bytes32 args) external override returns (uint256) { - (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( - _reservesList, - args - ); - - return repayWithATokens(asset, amount, interestRateMode); - } - - /// @inheritdoc IL2Pool - function setUserUseReserveAsCollateral(bytes32 args) external override { - (address asset, bool useAsCollateral) = CalldataLogic.decodeSetUserUseReserveAsCollateralParams( - _reservesList, - args - ); - setUserUseReserveAsCollateral(asset, useAsCollateral); - } - - /// @inheritdoc IL2Pool - function liquidationCall(bytes32 args1, bytes32 args2) external override { - ( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) = CalldataLogic.decodeLiquidationCallParams(_reservesList, args1, args2); - liquidationCall(collateralAsset, debtAsset, user, debtToCover, receiveAToken); - } -} - -// downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/L2PoolInstance.sol - -contract L2PoolInstance is L2Pool, PoolInstance { - constructor(IPoolAddressesProvider provider) PoolInstance(provider) {} -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/L2PoolInstance.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/L2PoolInstance.sol deleted file mode 100644 index f323d4bd..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/L2PoolInstance.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {L2Pool} from '../protocol/pool/L2Pool.sol'; -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {PoolInstance} from './PoolInstance.sol'; - -contract L2PoolInstance is L2Pool, PoolInstance { - constructor(IPoolAddressesProvider provider) PoolInstance(provider) {} -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/PoolInstance.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/PoolInstance.sol deleted file mode 100644 index 02eafdd1..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/instances/PoolInstance.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {Pool} from '../protocol/pool/Pool.sol'; -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {Errors} from '../protocol/libraries/helpers/Errors.sol'; - -contract PoolInstance is Pool { - uint256 public constant POOL_REVISION = 6; - - constructor(IPoolAddressesProvider provider) Pool(provider) {} - - /** - * @notice Initializes the Pool. - * @dev Function is invoked by the proxy contract when the Pool contract is added to the - * PoolAddressesProvider of the market. - * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations - * @param provider The address of the PoolAddressesProvider - */ - function initialize(IPoolAddressesProvider provider) external virtual override initializer { - require(provider == ADDRESSES_PROVIDER, Errors.INVALID_ADDRESSES_PROVIDER); - } - - function getRevision() internal pure virtual override returns (uint256) { - return POOL_REVISION; - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IERC20WithPermit.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IERC20WithPermit.sol deleted file mode 100644 index 0fceb8c5..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IERC20WithPermit.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; - -/** - * @title IERC20WithPermit - * @author Aave - * @notice Interface for the permit function (EIP-2612) - */ -interface IERC20WithPermit is IERC20 { - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IL2Pool.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IL2Pool.sol deleted file mode 100644 index 56dee912..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IL2Pool.sol +++ /dev/null @@ -1,116 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IL2Pool - * @author Aave - * @notice Defines the basic extension interface for an L2 Aave Pool. - */ -interface IL2Pool { - /** - * @notice Calldata efficient wrapper of the supply function on behalf of the caller - * @param args Arguments for the supply function packed in one bytes32 - * 96 bits 16 bits 128 bits 16 bits - * | 0-padding | referralCode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - */ - function supply(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the supplyWithPermit function on behalf of the caller - * @param args Arguments for the supply function packed in one bytes32 - * 56 bits 8 bits 32 bits 16 bits 128 bits 16 bits - * | 0-padding | permitV | shortenedDeadline | referralCode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @param r The R parameter of ERC712 permit sig - * @param s The S parameter of ERC712 permit sig - */ - function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s) external; - - /** - * @notice Calldata efficient wrapper of the withdraw function, withdrawing to the caller - * @param args Arguments for the withdraw function packed in one bytes32 - * 112 bits 128 bits 16 bits - * | 0-padding | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @return The final amount withdrawn - */ - function withdraw(bytes32 args) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the borrow function, borrowing on behalf of the caller - * @param args Arguments for the borrow function packed in one bytes32 - * 88 bits 16 bits 8 bits 128 bits 16 bits - * | 0-padding | referralCode | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - */ - function borrow(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the repay function, repaying on behalf of the caller - * @param args Arguments for the repay function packed in one bytes32 - * 104 bits 8 bits 128 bits 16 bits - * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @return The final amount repaid - */ - function repay(bytes32 args) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the repayWithPermit function, repaying on behalf of the caller - * @param args Arguments for the repayWithPermit function packed in one bytes32 - * 64 bits 8 bits 32 bits 8 bits 128 bits 16 bits - * | 0-padding | permitV | shortenedDeadline | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @param r The R parameter of ERC712 permit sig - * @param s The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the repayWithATokens function - * @param args Arguments for the repayWithATokens function packed in one bytes32 - * 104 bits 8 bits 128 bits 16 bits - * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @return The final amount repaid - */ - function repayWithATokens(bytes32 args) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the setUserUseReserveAsCollateral function - * @param args Arguments for the setUserUseReserveAsCollateral function packed in one bytes32 - * 239 bits 1 bit 16 bits - * | 0-padding | useAsCollateral | assetId | - * @dev assetId is the index of the asset in the reservesList. - */ - function setUserUseReserveAsCollateral(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the liquidationCall function - * @param args1 part of the arguments for the liquidationCall function packed in one bytes32 - * 64 bits 160 bits 16 bits 16 bits - * | 0-padding | user address | debtAssetId | collateralAssetId | - * @param args2 part of the arguments for the liquidationCall function packed in one bytes32 - * 127 bits 1 bit 128 bits - * | 0-padding | receiveAToken | shortenedDebtToCover | - * @dev the shortenedDebtToCover is cast to 256 bits at decode time, - * if type(uint128).max the value will be expanded to type(uint256).max - */ - function liquidationCall(bytes32 args1, bytes32 args2) external; -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index e7ba8f7a..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol deleted file mode 100644 index 1070227a..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol deleted file mode 100644 index a3a55684..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; - -/** - * @title IFlashLoanReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - */ -interface IFlashLoanReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed assets - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param assets The addresses of the flash-borrowed assets - * @param amounts The amounts of the flash-borrowed assets - * @param premiums The fee of each flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata premiums, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol deleted file mode 100644 index bff21ae4..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; - -/** - * @title IFlashLoanSimpleReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - */ -interface IFlashLoanSimpleReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed asset - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param asset The address of the flash-borrowed asset - * @param amount The amount of the flash-borrowed asset - * @param premium The fee of the flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address asset, - uint256 amount, - uint256 premium, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BorrowLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BorrowLogic.sol deleted file mode 100644 index c4ed26ed..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BorrowLogic.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {IsolationModeLogic} from './IsolationModeLogic.sol'; - -/** - * @title BorrowLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to borrowing - */ -library BorrowLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the - * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the - * isolated debt. - * @dev Emits the `Borrow()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the borrow function - */ - function executeBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteBorrowParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ( - bool isolationModeActive, - address isolationModeCollateralAddress, - uint256 isolationModeDebtCeiling - ) = userConfig.getIsolationModeState(reservesData, reservesList); - - ValidationLogic.validateBorrow( - reservesData, - reservesList, - eModeCategories, - DataTypes.ValidateBorrowParams({ - reserveCache: reserveCache, - userConfig: userConfig, - asset: params.asset, - userAddress: params.onBehalfOf, - amount: params.amount, - interestRateMode: params.interestRateMode, - reservesCount: params.reservesCount, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory, - priceOracleSentinel: params.priceOracleSentinel, - isolationModeActive: isolationModeActive, - isolationModeCollateralAddress: isolationModeCollateralAddress, - isolationModeDebtCeiling: isolationModeDebtCeiling - }) - ); - - bool isFirstBorrowing = false; - - (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); - - if (isFirstBorrowing) { - userConfig.setBorrowing(reserve.id, true); - } - - if (isolationModeActive) { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt += (params.amount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - 0, - params.releaseUnderlying ? params.amount : 0 - ); - - if (params.releaseUnderlying) { - IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); - } - - emit Borrow( - params.asset, - params.user, - params.onBehalfOf, - params.amount, - DataTypes.InterestRateMode.VARIABLE, - reserve.currentVariableBorrowRate, - params.referralCode - ); - } - - /** - * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the - * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also - * reduces the isolated debt. - * @dev Emits the `Repay()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the repay function - * @return The actual amount being repaid - */ - function executeRepay( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteRepayParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - - uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( - params.onBehalfOf - ); - - ValidationLogic.validateRepay( - reserveCache, - params.amount, - params.interestRateMode, - params.onBehalfOf, - variableDebt - ); - - uint256 paybackAmount = variableDebt; - - // Allows a user to repay with aTokens without leaving dust from interest. - if (params.useATokens && params.amount == type(uint256).max) { - params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); - } - - if (params.amount < paybackAmount) { - paybackAmount = params.amount; - } - - reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) - .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - params.useATokens ? 0 : paybackAmount, - 0 - ); - - if (variableDebt - paybackAmount == 0) { - userConfig.setBorrowing(reserve.id, false); - } - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - reserveCache, - paybackAmount - ); - - if (params.useATokens) { - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - reserveCache.aTokenAddress, - paybackAmount, - reserveCache.nextLiquidityIndex - ); - // in case of aToken repayment the msg.sender must always repay on behalf of itself - if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - } else { - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); - IAToken(reserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.onBehalfOf, - paybackAmount - ); - } - - emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); - - return paybackAmount; - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BridgeLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BridgeLogic.sol deleted file mode 100644 index 3b4d469b..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/BridgeLogic.sol +++ /dev/null @@ -1,150 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -library BridgeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. - * @dev Essentially a supply without transferring the underlying. - * @dev Emits the `MintUnbacked` event - * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param asset The address of the underlying asset to mint aTokens of - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function executeMintUnbacked( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, reserve, amount, onBehalfOf); - - uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); - uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); - - uint256 unbacked = reserve.unbacked += amount.toUint128(); - - require( - unbacked <= unbackedMintCap * (10 ** reserveDecimals), - Errors.UNBACKED_MINT_CAP_EXCEEDED - ); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, 0, 0); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - onBehalfOf, - amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration, - reserveCache.aTokenAddress - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); - } - } - - emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); - } - - /** - * @notice Back the current unbacked with `amount` and pay `fee`. - * @dev It is not possible to back more than the existing unbacked amount of the reserve - * @dev Emits the `BackUnbacked` event - * @param reserve The reserve to back unbacked for - * @param asset The address of the underlying asset to repay - * @param amount The amount to back - * @param fee The amount paid in fees - * @param protocolFeeBps The fraction of fees in basis points paid to the protocol - * @return The backed amount - */ - function executeBackUnbacked( - DataTypes.ReserveData storage reserve, - address asset, - uint256 amount, - uint256 fee, - uint256 protocolFeeBps - ) external returns (uint256) { - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; - - uint256 feeToProtocol = fee.percentMul(protocolFeeBps); - uint256 feeToLP = fee - feeToProtocol; - uint256 added = backingAmount + fee; - - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply() + - uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), - feeToLP - ); - - reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - - reserve.unbacked -= backingAmount.toUint128(); - reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, added, 0); - - IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); - - emit BackUnbacked(asset, msg.sender, backingAmount, fee); - - return backingAmount; - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/CalldataLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/CalldataLogic.sol deleted file mode 100644 index 742cbcbf..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/CalldataLogic.sol +++ /dev/null @@ -1,233 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title CalldataLogic library - * @author Aave - * @notice Library to decode calldata, used to optimize calldata size in L2Pool for transaction cost reduction - */ -library CalldataLogic { - /** - * @notice Decodes compressed supply params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed supply params - * @return The address of the underlying reserve - * @return The amount to supply - * @return The referralCode - */ - function decodeSupplyParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint16) { - uint16 assetId; - uint256 amount; - uint16 referralCode; - - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - referralCode := and(shr(144, args), 0xFFFF) - } - return (reservesList[assetId], amount, referralCode); - } - - /** - * @notice Decodes compressed supply params to standard params along with permit params - * @param reservesList The addresses of all the active reserves - * @param args The packed supply with permit params - * @return The address of the underlying reserve - * @return The amount to supply - * @return The referralCode - * @return The deadline of the permit - * @return The V value of the permit signature - */ - function decodeSupplyWithPermitParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint16, uint256, uint8) { - uint256 deadline; - uint8 permitV; - - assembly { - deadline := and(shr(160, args), 0xFFFFFFFF) - permitV := and(shr(192, args), 0xFF) - } - (address asset, uint256 amount, uint16 referralCode) = decodeSupplyParams(reservesList, args); - - return (asset, amount, referralCode, deadline, permitV); - } - - /** - * @notice Decodes compressed withdraw params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed withdraw params - * @return The address of the underlying reserve - * @return The amount to withdraw - */ - function decodeWithdrawParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256) { - uint16 assetId; - uint256 amount; - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - } - if (amount == type(uint128).max) { - amount = type(uint256).max; - } - return (reservesList[assetId], amount); - } - - /** - * @notice Decodes compressed borrow params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed borrow params - * @return The address of the underlying reserve - * @return The amount to borrow - * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) - * @return The referralCode - */ - function decodeBorrowParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint256, uint16) { - uint16 assetId; - uint256 amount; - uint256 interestRateMode; - uint16 referralCode; - - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - interestRateMode := and(shr(144, args), 0xFF) - referralCode := and(shr(152, args), 0xFFFF) - } - - return (reservesList[assetId], amount, interestRateMode, referralCode); - } - - /** - * @notice Decodes compressed repay params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed repay params - * @return The address of the underlying reserve - * @return The amount to repay - * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) - */ - function decodeRepayParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint256) { - uint16 assetId; - uint256 amount; - uint256 interestRateMode; - - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - interestRateMode := and(shr(144, args), 0xFF) - } - - if (amount == type(uint128).max) { - amount = type(uint256).max; - } - - return (reservesList[assetId], amount, interestRateMode); - } - - /** - * @notice Decodes compressed repay params to standard params along with permit params - * @param reservesList The addresses of all the active reserves - * @param args The packed repay with permit params - * @return The address of the underlying reserve - * @return The amount to repay - * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) - * @return The deadline of the permit - * @return The V value of the permit signature - */ - function decodeRepayWithPermitParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint256, uint256, uint8) { - uint256 deadline; - uint8 permitV; - - (address asset, uint256 amount, uint256 interestRateMode) = decodeRepayParams( - reservesList, - args - ); - - assembly { - deadline := and(shr(152, args), 0xFFFFFFFF) - permitV := and(shr(184, args), 0xFF) - } - - return (asset, amount, interestRateMode, deadline, permitV); - } - - /** - * @notice Decodes compressed set user use reserve as collateral params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed set user use reserve as collateral params - * @return The address of the underlying reserve - * @return True if to set using as collateral, false otherwise - */ - function decodeSetUserUseReserveAsCollateralParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, bool) { - uint16 assetId; - bool useAsCollateral; - assembly { - assetId := and(args, 0xFFFF) - useAsCollateral := and(shr(16, args), 0x1) - } - return (reservesList[assetId], useAsCollateral); - } - - /** - * @notice Decodes compressed liquidation call params to standard params - * @param reservesList The addresses of all the active reserves - * @param args1 The first half of packed liquidation call params - * @param args2 The second half of the packed liquidation call params - * @return The address of the underlying collateral asset - * @return The address of the underlying debt asset - * @return The address of the user to liquidate - * @return The amount of debt to cover - * @return True if receiving aTokens, false otherwise - */ - function decodeLiquidationCallParams( - mapping(uint256 => address) storage reservesList, - bytes32 args1, - bytes32 args2 - ) internal view returns (address, address, address, uint256, bool) { - uint16 collateralAssetId; - uint16 debtAssetId; - address user; - uint256 debtToCover; - bool receiveAToken; - - assembly { - collateralAssetId := and(args1, 0xFFFF) - debtAssetId := and(shr(16, args1), 0xFFFF) - user := and(shr(32, args1), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - - debtToCover := and(args2, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - receiveAToken := and(shr(128, args2), 0x1) - } - - if (debtToCover == type(uint128).max) { - debtToCover = type(uint256).max; - } - - return ( - reservesList[collateralAssetId], - reservesList[debtAssetId], - user, - debtToCover, - receiveAToken - ); - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index 647fc7e7..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol deleted file mode 100644 index 31ffb288..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol +++ /dev/null @@ -1,277 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IFlashLoanReceiver} from '../../../misc/flashloan/interfaces/IFlashLoanReceiver.sol'; -import {IFlashLoanSimpleReceiver} from '../../../misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {BorrowLogic} from './BorrowLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title FlashLoanLogic library - * @author Aave - * @notice Implements the logic for the flash loans - */ -library FlashLoanLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - - // See `IPool` for descriptions - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - // Helper struct for internal variables used in the `executeFlashLoan` function - struct FlashLoanLocalVars { - IFlashLoanReceiver receiver; - address currentAsset; - uint256 currentAmount; - uint256[] totalPremiums; - uint256 flashloanPremiumTotal; - uint256 flashloanPremiumToProtocol; - } - - /** - * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction - * as long as the amount taken plus fee is returned or debt is opened. - * @dev For authorized flashborrowers the fee is waived - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the flashloan function - */ - function executeFlashLoan( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.FlashloanParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); - - FlashLoanLocalVars memory vars; - - vars.totalPremiums = new uint256[](params.assets.length); - - vars.receiver = IFlashLoanReceiver(params.receiverAddress); - (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower - ? (0, 0) - : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); - - for (uint256 i = 0; i < params.assets.length; i++) { - vars.currentAmount = params.amounts[i]; - vars.totalPremiums[i] = DataTypes.InterestRateMode(params.interestRateModes[i]) == - DataTypes.InterestRateMode.NONE - ? vars.currentAmount.percentMul(vars.flashloanPremiumTotal) - : 0; - - if (reservesData[params.assets[i]].configuration.getIsVirtualAccActive()) { - reservesData[params.assets[i]].virtualUnderlyingBalance -= vars.currentAmount.toUint128(); - } - - IAToken(reservesData[params.assets[i]].aTokenAddress).transferUnderlyingTo( - params.receiverAddress, - vars.currentAmount - ); - } - - require( - vars.receiver.executeOperation( - params.assets, - params.amounts, - vars.totalPremiums, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - for (uint256 i = 0; i < params.assets.length; i++) { - vars.currentAsset = params.assets[i]; - vars.currentAmount = params.amounts[i]; - - if ( - DataTypes.InterestRateMode(params.interestRateModes[i]) == DataTypes.InterestRateMode.NONE - ) { - _handleFlashLoanRepayment( - reservesData[vars.currentAsset], - DataTypes.FlashLoanRepaymentParams({ - asset: vars.currentAsset, - receiverAddress: params.receiverAddress, - amount: vars.currentAmount, - totalPremium: vars.totalPremiums[i], - flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } else { - // If the user chose to not return the funds, the system checks if there is enough collateral and - // eventually opens a debt position - BorrowLogic.executeBorrow( - reservesData, - reservesList, - eModeCategories, - userConfig, - DataTypes.ExecuteBorrowParams({ - asset: vars.currentAsset, - user: msg.sender, - onBehalfOf: params.onBehalfOf, - amount: vars.currentAmount, - interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[i]), - referralCode: params.referralCode, - releaseUnderlying: false, - reservesCount: IPool(params.pool).getReservesCount(), - oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), - userEModeCategory: IPool(params.pool).getUserEMode(params.onBehalfOf).toUint8(), - priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) - .getPriceOracleSentinel() - }) - ); - // no premium is paid when taking on the flashloan as debt - emit FlashLoan( - params.receiverAddress, - msg.sender, - vars.currentAsset, - vars.currentAmount, - DataTypes.InterestRateMode(params.interestRateModes[i]), - 0, - params.referralCode - ); - } - } - } - - /** - * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one - * transaction as long as the amount taken plus fee is returned. - * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the simple flashloan function - */ - function executeFlashLoanSimple( - DataTypes.ReserveData storage reserve, - DataTypes.FlashloanSimpleParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloanSimple(reserve, params.amount); - - IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); - uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); - - if (reserve.configuration.getIsVirtualAccActive()) { - reserve.virtualUnderlyingBalance -= params.amount.toUint128(); - } - - IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); - - require( - receiver.executeOperation( - params.asset, - params.amount, - totalPremium, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - _handleFlashLoanRepayment( - reserve, - DataTypes.FlashLoanRepaymentParams({ - asset: params.asset, - receiverAddress: params.receiverAddress, - amount: params.amount, - totalPremium: totalPremium, - flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } - - /** - * @notice Handles repayment of flashloaned assets + premium - * @dev Will pull the amount + premium from the receiver, so must have approved pool - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the repayment function - */ - function _handleFlashLoanRepayment( - DataTypes.ReserveData storage reserve, - DataTypes.FlashLoanRepaymentParams memory params - ) internal { - uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); - uint256 premiumToLP = params.totalPremium - premiumToProtocol; - uint256 amountPlusPremium = params.amount + params.totalPremium; - - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply() + - uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), - premiumToLP - ); - - reserve.accruedToTreasury += premiumToProtocol - .rayDiv(reserveCache.nextLiquidityIndex) - .toUint128(); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, amountPlusPremium, 0); - - IERC20(params.asset).safeTransferFrom( - params.receiverAddress, - reserveCache.aTokenAddress, - amountPlusPremium - ); - - IAToken(reserveCache.aTokenAddress).handleRepayment( - params.receiverAddress, - params.receiverAddress, - amountPlusPremium - ); - - emit FlashLoan( - params.receiverAddress, - msg.sender, - params.asset, - params.amount, - DataTypes.InterestRateMode.NONE, - params.totalPremium, - params.referralCode - ); - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index cd5b83c6..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol deleted file mode 100644 index 473840ea..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/LiquidationLogic.sol deleted file mode 100644 index 8f4c35f6..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ /dev/null @@ -1,460 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts//IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {PercentageMath} from '../../libraries/math/PercentageMath.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {DataTypes} from '../../libraries/types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {IsolationModeLogic} from './IsolationModeLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; -import {UserConfiguration} from '../../libraries/configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../../libraries/configuration/ReserveConfiguration.sol'; -import {EModeConfiguration} from '../../libraries/configuration/EModeConfiguration.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; - -/** - * @title LiquidationLogic library - * @author Aave - * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations - */ -library LiquidationLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Default percentage of borrower's debt to be repaid in a liquidation. - * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 0.5e4 results in 50.00% - */ - uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; - - /** - * @dev Maximum percentage of borrower's debt to be repaid in a liquidation - * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 1e4 results in 100.00% - */ - uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; - - /** - * @dev This constant represents below which health factor value it is possible to liquidate - * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. - * A value of 0.95e18 results in 0.95 - */ - uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; - - struct LiquidationCallLocalVars { - uint256 userCollateralBalance; - uint256 userTotalDebt; - uint256 actualDebtToLiquidate; - uint256 actualCollateralToLiquidate; - uint256 liquidationBonus; - uint256 healthFactor; - uint256 liquidationProtocolFeeAmount; - IAToken collateralAToken; - DataTypes.ReserveCache debtReserveCache; - } - - /** - * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) - * covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportional amount of the `collateralAsset` plus a bonus to cover market risk - * @dev Emits the `LiquidationCall()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params The additional parameters needed to execute the liquidation function - */ - function executeLiquidationCall( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ExecuteLiquidationCallParams memory params - ) external { - LiquidationCallLocalVars memory vars; - - DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; - DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; - DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; - vars.debtReserveCache = debtReserve.cache(); - debtReserve.updateState(vars.debtReserveCache); - - (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: params.reservesCount, - user: params.user, - oracle: params.priceOracle, - userEModeCategory: params.userEModeCategory - }) - ); - - (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( - vars.debtReserveCache, - params, - vars.healthFactor - ); - - ValidationLogic.validateLiquidationCall( - userConfig, - collateralReserve, - debtReserve, - DataTypes.ValidateLiquidationCallParams({ - debtReserveCache: vars.debtReserveCache, - totalDebt: vars.userTotalDebt, - healthFactor: vars.healthFactor, - priceOracleSentinel: params.priceOracleSentinel - }) - ); - - vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); - if ( - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - collateralReserve.id - ) - ) { - vars.liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; - } else { - vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); - } - - vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); - - ( - vars.actualCollateralToLiquidate, - vars.actualDebtToLiquidate, - vars.liquidationProtocolFeeAmount - ) = _calculateAvailableCollateralToLiquidate( - collateralReserve, - vars.debtReserveCache, - params.collateralAsset, - params.debtAsset, - vars.actualDebtToLiquidate, - vars.userCollateralBalance, - vars.liquidationBonus, - IPriceOracleGetter(params.priceOracle) - ); - - if (vars.userTotalDebt == vars.actualDebtToLiquidate) { - userConfig.setBorrowing(debtReserve.id, false); - } - - // If the collateral being liquidated is equal to the user balance, - // we set the currency as not being used as collateral anymore - if ( - vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == - vars.userCollateralBalance - ) { - userConfig.setUsingAsCollateral(collateralReserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); - } - - _burnDebtTokens(params, vars); - - debtReserve.updateInterestRatesAndVirtualBalance( - vars.debtReserveCache, - params.debtAsset, - vars.actualDebtToLiquidate, - 0 - ); - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - vars.debtReserveCache, - vars.actualDebtToLiquidate - ); - - if (params.receiveAToken) { - _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); - } else { - _burnCollateralATokens(collateralReserve, params, vars); - } - - // Transfer fee to treasury if it is non-zero - if (vars.liquidationProtocolFeeAmount != 0) { - uint256 liquidityIndex = collateralReserve.getNormalizedIncome(); - uint256 scaledDownLiquidationProtocolFee = vars.liquidationProtocolFeeAmount.rayDiv( - liquidityIndex - ); - uint256 scaledDownUserBalance = vars.collateralAToken.scaledBalanceOf(params.user); - // To avoid trying to send more aTokens than available on balance, due to 1 wei imprecision - if (scaledDownLiquidationProtocolFee > scaledDownUserBalance) { - vars.liquidationProtocolFeeAmount = scaledDownUserBalance.rayMul(liquidityIndex); - } - vars.collateralAToken.transferOnLiquidation( - params.user, - vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), - vars.liquidationProtocolFeeAmount - ); - } - - // Transfers the debt asset being repaid to the aToken, where the liquidity is kept - IERC20(params.debtAsset).safeTransferFrom( - msg.sender, - vars.debtReserveCache.aTokenAddress, - vars.actualDebtToLiquidate - ); - - IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.user, - vars.actualDebtToLiquidate - ); - - emit LiquidationCall( - params.collateralAsset, - params.debtAsset, - params.user, - vars.actualDebtToLiquidate, - vars.actualCollateralToLiquidate, - msg.sender, - params.receiveAToken - ); - } - - /** - * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. - * @dev The function also updates the state and the interest rate of the collateral reserve. - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _burnCollateralATokens( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); - collateralReserve.updateState(collateralReserveCache); - collateralReserve.updateInterestRatesAndVirtualBalance( - collateralReserveCache, - params.collateralAsset, - 0, - vars.actualCollateralToLiquidate - ); - - // Burn the equivalent amount of aToken, sending the underlying to the liquidator - vars.collateralAToken.burn( - params.user, - msg.sender, - vars.actualCollateralToLiquidate, - collateralReserveCache.nextLiquidityIndex - ); - } - - /** - * @notice Liquidates the user aTokens by transferring them to the liquidator. - * @dev The function also checks the state of the liquidator and activates the aToken as collateral - * as in standard transfers if the isolation mode constraints are respected. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _liquidateATokens( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); - vars.collateralAToken.transferOnLiquidation( - params.user, - msg.sender, - vars.actualCollateralToLiquidate - ); - - if (liquidatorPreviousATokenBalance == 0) { - DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - liquidatorConfig, - collateralReserve.configuration, - collateralReserve.aTokenAddress - ) - ) { - liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); - } - } - } - - /** - * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. - * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. - * @param params The additional parameters needed to execute the liquidation function - * @param vars the executeLiquidationCall() function local vars - */ - function _burnDebtTokens( - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( - vars.debtReserveCache.variableDebtTokenAddress - ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); - } - - /** - * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor - * and corresponding close factor. - * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR - * @param debtReserveCache The reserve cache data object of the debt reserve - * @param params The additional parameters needed to execute the liquidation function - * @param healthFactor The health factor of the position - * @return The total debt of the user - * @return The actual debt to liquidate as a function of the closeFactor - */ - function _calculateDebt( - DataTypes.ReserveCache memory debtReserveCache, - DataTypes.ExecuteLiquidationCallParams memory params, - uint256 healthFactor - ) internal view returns (uint256, uint256) { - uint256 userVariableDebt = IERC20(debtReserveCache.variableDebtTokenAddress).balanceOf( - params.user - ); - - uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD - ? DEFAULT_LIQUIDATION_CLOSE_FACTOR - : MAX_LIQUIDATION_CLOSE_FACTOR; - - uint256 maxLiquidatableDebt = userVariableDebt.percentMul(closeFactor); - - uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt - ? maxLiquidatableDebt - : params.debtToCover; - - return (userVariableDebt, actualDebtToLiquidate); - } - - struct AvailableCollateralToLiquidateLocalVars { - uint256 collateralPrice; - uint256 debtAssetPrice; - uint256 maxCollateralToLiquidate; - uint256 baseCollateral; - uint256 bonusCollateral; - uint256 debtAssetDecimals; - uint256 collateralDecimals; - uint256 collateralAssetUnit; - uint256 debtAssetUnit; - uint256 collateralAmount; - uint256 debtAmountNeeded; - uint256 liquidationProtocolFeePercentage; - uint256 liquidationProtocolFee; - } - - /** - * @notice Calculates how much of a specific collateral can be liquidated, given - * a certain amount of debt asset. - * @dev This function needs to be called after all the checks to validate the liquidation have been performed, - * otherwise it might fail. - * @param collateralReserve The data of the collateral reserve - * @param debtReserveCache The cached data of the debt reserve - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated - * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation - * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) - * @return The amount to repay with the liquidation - * @return The fee taken from the liquidation bonus amount to be paid to the protocol - */ - function _calculateAvailableCollateralToLiquidate( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveCache memory debtReserveCache, - address collateralAsset, - address debtAsset, - uint256 debtToCover, - uint256 userCollateralBalance, - uint256 liquidationBonus, - IPriceOracleGetter oracle - ) internal view returns (uint256, uint256, uint256) { - AvailableCollateralToLiquidateLocalVars memory vars; - - vars.collateralPrice = oracle.getAssetPrice(collateralAsset); - vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); - - vars.collateralDecimals = collateralReserve.configuration.getDecimals(); - vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); - - unchecked { - vars.collateralAssetUnit = 10 ** vars.collateralDecimals; - vars.debtAssetUnit = 10 ** vars.debtAssetDecimals; - } - - vars.liquidationProtocolFeePercentage = collateralReserve - .configuration - .getLiquidationProtocolFee(); - - // This is the base collateral to liquidate based on the given debt to cover - vars.baseCollateral = - ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / - (vars.collateralPrice * vars.debtAssetUnit); - - vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); - - if (vars.maxCollateralToLiquidate > userCollateralBalance) { - vars.collateralAmount = userCollateralBalance; - vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / - (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); - } else { - vars.collateralAmount = vars.maxCollateralToLiquidate; - vars.debtAmountNeeded = debtToCover; - } - - if (vars.liquidationProtocolFeePercentage != 0) { - vars.bonusCollateral = - vars.collateralAmount - - vars.collateralAmount.percentDiv(liquidationBonus); - - vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( - vars.liquidationProtocolFeePercentage - ); - - return ( - vars.collateralAmount - vars.liquidationProtocolFee, - vars.debtAmountNeeded, - vars.liquidationProtocolFee - ); - } else { - return (vars.collateralAmount, vars.debtAmountNeeded, 0); - } - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/PoolLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/PoolLogic.sol deleted file mode 100644 index 1558fe55..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/PoolLogic.sol +++ /dev/null @@ -1,201 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; - -/** - * @title PoolLogic library - * @author Aave - * @notice Implements the logic for Pool specific functions - */ -library PoolLogic { - using GPv2SafeERC20 for IERC20; - using WadRayMath for uint256; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice Initialize an asset reserve and add the reserve to the list of reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param params Additional parameters needed for initiation - * @return true if appended, false if inserted at existing empty spot - */ - function executeInitReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.InitReserveParams memory params - ) external returns (bool) { - require(Address.isContract(params.asset), Errors.NOT_CONTRACT); - reservesData[params.asset].init( - params.aTokenAddress, - params.variableDebtAddress, - params.interestRateStrategyAddress - ); - - bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || - reservesList[0] == params.asset; - require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); - - for (uint16 i = 0; i < params.reservesCount; i++) { - if (reservesList[i] == address(0)) { - reservesData[params.asset].id = i; - reservesList[i] = params.asset; - return false; - } - } - - require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); - reservesData[params.asset].id = params.reservesCount; - reservesList[params.reservesCount] = params.asset; - return true; - } - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function executeRescueTokens(address token, address to, uint256 amount) external { - IERC20(token).safeTransfer(to, amount); - } - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param reservesData The state of all the reserves - * @param assets The list of reserves for which the minting needs to be executed - */ - function executeMintToTreasury( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] calldata assets - ) external { - for (uint256 i = 0; i < assets.length; i++) { - address assetAddress = assets[i]; - - DataTypes.ReserveData storage reserve = reservesData[assetAddress]; - - // this cover both inactive reserves and invalid reserves since the flag will be 0 for both - if (!reserve.configuration.getActive()) { - continue; - } - - uint256 accruedToTreasury = reserve.accruedToTreasury; - - if (accruedToTreasury != 0) { - reserve.accruedToTreasury = 0; - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); - IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); - - emit MintedToTreasury(assetAddress, amountToMint); - } - } - } - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function executeResetIsolationModeTotalDebt( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset - ) external { - require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); - reservesData[asset].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(asset, 0); - } - - /** - * @notice Sets the liquidation grace period of the asset - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - */ - function executeSetLiquidationGracePeriod( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset, - uint40 until - ) external { - reservesData[asset].liquidationGracePeriodUntil = until; - } - - /** - * @notice Drop a reserve - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param asset The address of the underlying asset of the reserve - */ - function executeDropReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - address asset - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - ValidationLogic.validateDropReserve(reservesList, reserve, asset); - reservesList[reservesData[asset].id] = address(0); - delete reservesData[asset]; - } - - /** - * @notice Returns the user account data across all the reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the calculation - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function executeGetUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ) - { - ( - totalCollateralBase, - totalDebtBase, - ltv, - currentLiquidationThreshold, - healthFactor, - - ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); - - availableBorrowsBase = GenericLogic.calculateAvailableBorrows( - totalCollateralBase, - totalDebtBase, - ltv - ); - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index dd5c637d..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/SupplyLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/SupplyLogic.sol deleted file mode 100644 index 727886e7..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/SupplyLogic.sol +++ /dev/null @@ -1,300 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; - -/** - * @title SupplyLogic library - * @author Aave - * @notice Implements the base logic for supply/withdraw - */ -library SupplyLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. - * @dev Emits the `Supply()` event. - * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as - * collateral. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the supply function - */ - function executeSupply( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSupplyParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, reserve, params.amount, params.onBehalfOf); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, params.amount, 0); - - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - params.onBehalfOf, - params.amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration, - reserveCache.aTokenAddress - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); - } - } - - emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); - } - - /** - * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset - * previously supplied in the Aave protocol. - * @dev Emits the `Withdraw()` event. - * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the withdraw function - * @return The actual amount withdrawn - */ - function executeWithdraw( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteWithdrawParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - require(params.to != reserveCache.aTokenAddress, Errors.WITHDRAW_TO_ATOKEN); - - reserve.updateState(reserveCache); - - uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( - reserveCache.nextLiquidityIndex - ); - - uint256 amountToWithdraw = params.amount; - - if (params.amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - - ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, amountToWithdraw); - - bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); - - if (isCollateral && amountToWithdraw == userBalance) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - params.to, - amountToWithdraw, - reserveCache.nextLiquidityIndex - ); - - if (isCollateral && userConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - params.asset, - msg.sender, - params.reservesCount, - params.oracle, - params.userEModeCategory - ); - } - - emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); - - return amountToWithdraw; - } - - /** - * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid - * collateralization constraints violation. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as - * collateral. - * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param params The additional parameters needed to execute the finalizeTransfer function - */ - function executeFinalizeTransfer( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.FinalizeTransferParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - - ValidationLogic.validateTransfer(reserve); - - uint256 reserveId = reserve.id; - uint256 scaledAmount = params.amount.rayDiv(reserve.getNormalizedIncome()); - - if (params.from != params.to && scaledAmount != 0) { - DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; - - if (fromConfig.isUsingAsCollateral(reserveId)) { - if (fromConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - usersConfig[params.from], - params.asset, - params.from, - params.reservesCount, - params.oracle, - params.fromEModeCategory - ); - } - if (params.balanceFromBefore == params.amount) { - fromConfig.setUsingAsCollateral(reserveId, false); - emit ReserveUsedAsCollateralDisabled(params.asset, params.from); - } - } - - if (params.balanceToBefore == 0) { - DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - toConfig, - reserve.configuration, - reserve.aTokenAddress - ) - ) { - toConfig.setUsingAsCollateral(reserveId, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.to); - } - } - } - } - - /** - * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as - * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor - * checks to ensure collateralization. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. - * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The users configuration mapping that track the supplied/borrowed assets - * @param asset The address of the asset being configured as collateral - * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise - * @param reservesCount The number of initialized reserves - * @param priceOracle The address of the price oracle - * @param userEModeCategory The eMode category chosen by the user - */ - function executeUseReserveAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - bool useAsCollateral, - uint256 reservesCount, - address priceOracle, - uint8 userEModeCategory - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); - - ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); - - if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; - - if (useAsCollateral) { - require( - ValidationLogic.validateUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration - ), - Errors.USER_IN_ISOLATION_MODE_OR_LTV_ZERO - ); - - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, msg.sender); - } else { - userConfig.setUsingAsCollateral(reserve.id, false); - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - asset, - msg.sender, - reservesCount, - priceOracle, - userEModeCategory - ); - - emit ReserveUsedAsCollateralDisabled(asset, msg.sender); - } - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index e08a30e8..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index 9adca939..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/L2Pool.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/L2Pool.sol deleted file mode 100644 index d8925717..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/L2Pool.sol +++ /dev/null @@ -1,102 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {Pool} from './Pool.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {IL2Pool} from '../../interfaces/IL2Pool.sol'; -import {CalldataLogic} from '../libraries/logic/CalldataLogic.sol'; - -/** - * @title L2Pool - * @author Aave - * @notice Calldata optimized extension of the Pool contract allowing users to pass compact calldata representation - * to reduce transaction costs on rollups. - */ -abstract contract L2Pool is Pool, IL2Pool { - /// @inheritdoc IL2Pool - function supply(bytes32 args) external override { - (address asset, uint256 amount, uint16 referralCode) = CalldataLogic.decodeSupplyParams( - _reservesList, - args - ); - - supply(asset, amount, msg.sender, referralCode); - } - - /// @inheritdoc IL2Pool - function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s) external override { - (address asset, uint256 amount, uint16 referralCode, uint256 deadline, uint8 v) = CalldataLogic - .decodeSupplyWithPermitParams(_reservesList, args); - - supplyWithPermit(asset, amount, msg.sender, referralCode, deadline, v, r, s); - } - - /// @inheritdoc IL2Pool - function withdraw(bytes32 args) external override returns (uint256) { - (address asset, uint256 amount) = CalldataLogic.decodeWithdrawParams(_reservesList, args); - - return withdraw(asset, amount, msg.sender); - } - - /// @inheritdoc IL2Pool - function borrow(bytes32 args) external override { - (address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode) = CalldataLogic - .decodeBorrowParams(_reservesList, args); - - borrow(asset, amount, interestRateMode, referralCode, msg.sender); - } - - /// @inheritdoc IL2Pool - function repay(bytes32 args) external override returns (uint256) { - (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( - _reservesList, - args - ); - - return repay(asset, amount, interestRateMode, msg.sender); - } - - /// @inheritdoc IL2Pool - function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) external override returns (uint256) { - ( - address asset, - uint256 amount, - uint256 interestRateMode, - uint256 deadline, - uint8 v - ) = CalldataLogic.decodeRepayWithPermitParams(_reservesList, args); - - return repayWithPermit(asset, amount, interestRateMode, msg.sender, deadline, v, r, s); - } - - /// @inheritdoc IL2Pool - function repayWithATokens(bytes32 args) external override returns (uint256) { - (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( - _reservesList, - args - ); - - return repayWithATokens(asset, amount, interestRateMode); - } - - /// @inheritdoc IL2Pool - function setUserUseReserveAsCollateral(bytes32 args) external override { - (address asset, bool useAsCollateral) = CalldataLogic.decodeSetUserUseReserveAsCollateralParams( - _reservesList, - args - ); - setUserUseReserveAsCollateral(asset, useAsCollateral); - } - - /// @inheritdoc IL2Pool - function liquidationCall(bytes32 args1, bytes32 args2) external override { - ( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) = CalldataLogic.decodeLiquidationCallParams(_reservesList, args1, args2); - liquidationCall(collateralAsset, debtAsset, user, debtToCover, receiveAToken); - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/Pool.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/Pool.sol deleted file mode 100644 index 9629c6a3..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/Pool.sol +++ /dev/null @@ -1,871 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '../../misc/aave-upgradeability/VersionedInitializable.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; -import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; -import {PoolLogic} from '../libraries/logic/PoolLogic.sol'; -import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; -import {EModeLogic} from '../libraries/logic/EModeLogic.sol'; -import {SupplyLogic} from '../libraries/logic/SupplyLogic.sol'; -import {FlashLoanLogic} from '../libraries/logic/FlashLoanLogic.sol'; -import {BorrowLogic} from '../libraries/logic/BorrowLogic.sol'; -import {LiquidationLogic} from '../libraries/logic/LiquidationLogic.sol'; -import {DataTypes} from '../libraries/types/DataTypes.sol'; -import {BridgeLogic} from '../libraries/logic/BridgeLogic.sol'; -import {IERC20WithPermit} from '../../interfaces/IERC20WithPermit.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../interfaces/IPool.sol'; -import {IACLManager} from '../../interfaces/IACLManager.sol'; -import {PoolStorage} from './PoolStorage.sol'; - -/** - * @title Pool contract - * @author Aave - * @notice Main point of interaction with an Aave protocol's market - * - Users can: - * # Supply - * # Withdraw - * # Borrow - * # Repay - * # Enable/disable their supplied assets as collateral - * # Liquidate positions - * # Execute Flash Loans - * @dev To be covered by a proxy contract, owned by the PoolAddressesProvider of the specific market - * @dev All admin functions are callable by the PoolConfigurator contract defined also in the - * PoolAddressesProvider - */ -abstract contract Pool is VersionedInitializable, PoolStorage, IPool { - using ReserveLogic for DataTypes.ReserveData; - - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @dev Only pool configurator can call functions marked by this modifier. - */ - modifier onlyPoolConfigurator() { - _onlyPoolConfigurator(); - _; - } - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - _onlyPoolAdmin(); - _; - } - - /** - * @dev Only bridge can call functions marked by this modifier. - */ - modifier onlyBridge() { - _onlyBridge(); - _; - } - - function _onlyPoolConfigurator() internal view virtual { - require( - ADDRESSES_PROVIDER.getPoolConfigurator() == msg.sender, - Errors.CALLER_NOT_POOL_CONFIGURATOR - ); - } - - function _onlyPoolAdmin() internal view virtual { - require( - IACLManager(ADDRESSES_PROVIDER.getACLManager()).isPoolAdmin(msg.sender), - Errors.CALLER_NOT_POOL_ADMIN - ); - } - - function _onlyBridge() internal view virtual { - require( - IACLManager(ADDRESSES_PROVIDER.getACLManager()).isBridge(msg.sender), - Errors.CALLER_NOT_BRIDGE - ); - } - - /** - * @dev Constructor. - * @param provider The address of the PoolAddressesProvider contract - */ - constructor(IPoolAddressesProvider provider) { - ADDRESSES_PROVIDER = provider; - } - - /** - * @notice Initializes the Pool. - * @dev Function is invoked by the proxy contract when the Pool contract is added to the - * PoolAddressesProvider of the market. - * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations - * @param provider The address of the PoolAddressesProvider - */ - function initialize(IPoolAddressesProvider provider) external virtual; - - /// @inheritdoc IPool - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external virtual override onlyBridge { - BridgeLogic.executeMintUnbacked( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - asset, - amount, - onBehalfOf, - referralCode - ); - } - - /// @inheritdoc IPool - function backUnbacked( - address asset, - uint256 amount, - uint256 fee - ) external virtual override onlyBridge returns (uint256) { - return - BridgeLogic.executeBackUnbacked(_reserves[asset], asset, amount, fee, _bridgeProtocolFee); - } - - /// @inheritdoc IPool - function supply( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) public virtual override { - SupplyLogic.executeSupply( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteSupplyParams({ - asset: asset, - amount: amount, - onBehalfOf: onBehalfOf, - referralCode: referralCode - }) - ); - } - - /// @inheritdoc IPool - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) public virtual override { - try - IERC20WithPermit(asset).permit( - msg.sender, - address(this), - amount, - deadline, - permitV, - permitR, - permitS - ) - {} catch {} - SupplyLogic.executeSupply( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteSupplyParams({ - asset: asset, - amount: amount, - onBehalfOf: onBehalfOf, - referralCode: referralCode - }) - ); - } - - /// @inheritdoc IPool - function withdraw( - address asset, - uint256 amount, - address to - ) public virtual override returns (uint256) { - return - SupplyLogic.executeWithdraw( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[msg.sender], - DataTypes.ExecuteWithdrawParams({ - asset: asset, - amount: amount, - to: to, - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[msg.sender] - }) - ); - } - - /// @inheritdoc IPool - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) public virtual override { - BorrowLogic.executeBorrow( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[onBehalfOf], - DataTypes.ExecuteBorrowParams({ - asset: asset, - user: msg.sender, - onBehalfOf: onBehalfOf, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - referralCode: referralCode, - releaseUnderlying: true, - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[onBehalfOf], - priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() - }) - ); - } - - /// @inheritdoc IPool - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) public virtual override returns (uint256) { - return - BorrowLogic.executeRepay( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteRepayParams({ - asset: asset, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - onBehalfOf: onBehalfOf, - useATokens: false - }) - ); - } - - /// @inheritdoc IPool - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) public virtual override returns (uint256) { - try - IERC20WithPermit(asset).permit( - msg.sender, - address(this), - amount, - deadline, - permitV, - permitR, - permitS - ) - {} catch {} - - { - DataTypes.ExecuteRepayParams memory params = DataTypes.ExecuteRepayParams({ - asset: asset, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - onBehalfOf: onBehalfOf, - useATokens: false - }); - return BorrowLogic.executeRepay(_reserves, _reservesList, _usersConfig[onBehalfOf], params); - } - } - - /// @inheritdoc IPool - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) public virtual override returns (uint256) { - return - BorrowLogic.executeRepay( - _reserves, - _reservesList, - _usersConfig[msg.sender], - DataTypes.ExecuteRepayParams({ - asset: asset, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - onBehalfOf: msg.sender, - useATokens: true - }) - ); - } - - /// @inheritdoc IPool - function setUserUseReserveAsCollateral( - address asset, - bool useAsCollateral - ) public virtual override { - SupplyLogic.executeUseReserveAsCollateral( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[msg.sender], - asset, - useAsCollateral, - _reservesCount, - ADDRESSES_PROVIDER.getPriceOracle(), - _usersEModeCategory[msg.sender] - ); - } - - /// @inheritdoc IPool - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) public virtual override { - LiquidationLogic.executeLiquidationCall( - _reserves, - _reservesList, - _usersConfig, - _eModeCategories, - DataTypes.ExecuteLiquidationCallParams({ - reservesCount: _reservesCount, - debtToCover: debtToCover, - collateralAsset: collateralAsset, - debtAsset: debtAsset, - user: user, - receiveAToken: receiveAToken, - priceOracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[user], - priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() - }) - ); - } - - /// @inheritdoc IPool - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) public virtual override { - DataTypes.FlashloanParams memory flashParams = DataTypes.FlashloanParams({ - receiverAddress: receiverAddress, - assets: assets, - amounts: amounts, - interestRateModes: interestRateModes, - onBehalfOf: onBehalfOf, - params: params, - referralCode: referralCode, - flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, - flashLoanPremiumTotal: _flashLoanPremiumTotal, - reservesCount: _reservesCount, - addressesProvider: address(ADDRESSES_PROVIDER), - pool: address(this), - userEModeCategory: _usersEModeCategory[onBehalfOf], - isAuthorizedFlashBorrower: IACLManager(ADDRESSES_PROVIDER.getACLManager()).isFlashBorrower( - msg.sender - ) - }); - - FlashLoanLogic.executeFlashLoan( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[onBehalfOf], - flashParams - ); - } - - /// @inheritdoc IPool - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) public virtual override { - DataTypes.FlashloanSimpleParams memory flashParams = DataTypes.FlashloanSimpleParams({ - receiverAddress: receiverAddress, - asset: asset, - amount: amount, - params: params, - referralCode: referralCode, - flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, - flashLoanPremiumTotal: _flashLoanPremiumTotal - }); - FlashLoanLogic.executeFlashLoanSimple(_reserves[asset], flashParams); - } - - /// @inheritdoc IPool - function mintToTreasury(address[] calldata assets) external virtual override { - PoolLogic.executeMintToTreasury(_reserves, assets); - } - - /// @inheritdoc IPool - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory) { - return _reserves[asset]; - } - - /// @inheritdoc IPool - function getReserveData( - address asset - ) external view virtual override returns (DataTypes.ReserveDataLegacy memory) { - DataTypes.ReserveData memory reserve = _reserves[asset]; - DataTypes.ReserveDataLegacy memory res; - - res.configuration = reserve.configuration; - res.liquidityIndex = reserve.liquidityIndex; - res.currentLiquidityRate = reserve.currentLiquidityRate; - res.variableBorrowIndex = reserve.variableBorrowIndex; - res.currentVariableBorrowRate = reserve.currentVariableBorrowRate; - res.lastUpdateTimestamp = reserve.lastUpdateTimestamp; - res.id = reserve.id; - res.aTokenAddress = reserve.aTokenAddress; - res.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - res.interestRateStrategyAddress = reserve.interestRateStrategyAddress; - res.accruedToTreasury = reserve.accruedToTreasury; - res.unbacked = reserve.unbacked; - res.isolationModeTotalDebt = reserve.isolationModeTotalDebt; - // This is a temporary workaround for integrations that are broken by Aave 3.2 - // While the new pool data provider is backward compatible, some integrations hard-code an old implementation - // To allow them to unlock the funds, the pool address provider is setting a stable debt token, so balanceOf() and totalSupply() will return zero instead of reverting - res.stableDebtTokenAddress = ADDRESSES_PROVIDER.getAddress(bytes32('MOCK_STABLE_DEBT')); - return res; - } - - /// @inheritdoc IPool - function getVirtualUnderlyingBalance( - address asset - ) external view virtual override returns (uint128) { - return _reserves[asset].virtualUnderlyingBalance; - } - - /// @inheritdoc IPool - function getUserAccountData( - address user - ) - external - view - virtual - override - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ) - { - return - PoolLogic.executeGetUserAccountData( - _reserves, - _reservesList, - _eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: _usersConfig[user], - reservesCount: _reservesCount, - user: user, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[user] - }) - ); - } - - /// @inheritdoc IPool - function getConfiguration( - address asset - ) external view virtual override returns (DataTypes.ReserveConfigurationMap memory) { - return _reserves[asset].configuration; - } - - /// @inheritdoc IPool - function getUserConfiguration( - address user - ) external view virtual override returns (DataTypes.UserConfigurationMap memory) { - return _usersConfig[user]; - } - - /// @inheritdoc IPool - function getReserveNormalizedIncome( - address asset - ) external view virtual override returns (uint256) { - return _reserves[asset].getNormalizedIncome(); - } - - /// @inheritdoc IPool - function getReserveNormalizedVariableDebt( - address asset - ) external view virtual override returns (uint256) { - return _reserves[asset].getNormalizedDebt(); - } - - /// @inheritdoc IPool - function getReservesList() external view virtual override returns (address[] memory) { - uint256 reservesListCount = _reservesCount; - uint256 droppedReservesCount = 0; - address[] memory reservesList = new address[](reservesListCount); - - for (uint256 i = 0; i < reservesListCount; i++) { - if (_reservesList[i] != address(0)) { - reservesList[i - droppedReservesCount] = _reservesList[i]; - } else { - droppedReservesCount++; - } - } - - // Reduces the length of the reserves array by `droppedReservesCount` - assembly { - mstore(reservesList, sub(reservesListCount, droppedReservesCount)) - } - return reservesList; - } - - /// @inheritdoc IPool - function getReservesCount() external view virtual override returns (uint256) { - return _reservesCount; - } - - /// @inheritdoc IPool - function getReserveAddressById(uint16 id) external view returns (address) { - return _reservesList[id]; - } - - /// @inheritdoc IPool - function BRIDGE_PROTOCOL_FEE() public view virtual override returns (uint256) { - return _bridgeProtocolFee; - } - - /// @inheritdoc IPool - function FLASHLOAN_PREMIUM_TOTAL() public view virtual override returns (uint128) { - return _flashLoanPremiumTotal; - } - - /// @inheritdoc IPool - function FLASHLOAN_PREMIUM_TO_PROTOCOL() public view virtual override returns (uint128) { - return _flashLoanPremiumToProtocol; - } - - /// @inheritdoc IPool - function MAX_NUMBER_RESERVES() public view virtual override returns (uint16) { - return ReserveConfiguration.MAX_RESERVES_COUNT; - } - - /// @inheritdoc IPool - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external virtual override { - require(msg.sender == _reserves[asset].aTokenAddress, Errors.CALLER_NOT_ATOKEN); - SupplyLogic.executeFinalizeTransfer( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig, - DataTypes.FinalizeTransferParams({ - asset: asset, - from: from, - to: to, - amount: amount, - balanceFromBefore: balanceFromBefore, - balanceToBefore: balanceToBefore, - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - fromEModeCategory: _usersEModeCategory[from] - }) - ); - } - - /// @inheritdoc IPool - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external virtual override onlyPoolConfigurator { - if ( - PoolLogic.executeInitReserve( - _reserves, - _reservesList, - DataTypes.InitReserveParams({ - asset: asset, - aTokenAddress: aTokenAddress, - variableDebtAddress: variableDebtAddress, - interestRateStrategyAddress: interestRateStrategyAddress, - reservesCount: _reservesCount, - maxNumberReserves: MAX_NUMBER_RESERVES() - }) - ) - ) { - _reservesCount++; - } - } - - /// @inheritdoc IPool - function dropReserve(address asset) external virtual override onlyPoolConfigurator { - PoolLogic.executeDropReserve(_reserves, _reservesList, asset); - } - - /// @inheritdoc IPool - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external virtual override onlyPoolConfigurator { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - - _reserves[asset].interestRateStrategyAddress = rateStrategyAddress; - } - - /// @inheritdoc IPool - function syncIndexesState(address asset) external virtual override onlyPoolConfigurator { - DataTypes.ReserveData storage reserve = _reserves[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - } - - /// @inheritdoc IPool - function syncRatesState(address asset) external virtual override onlyPoolConfigurator { - DataTypes.ReserveData storage reserve = _reserves[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - ReserveLogic.updateInterestRatesAndVirtualBalance(reserve, reserveCache, asset, 0, 0); - } - - /// @inheritdoc IPool - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external virtual override onlyPoolConfigurator { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - _reserves[asset].configuration = configuration; - } - - /// @inheritdoc IPool - function updateBridgeProtocolFee( - uint256 protocolFee - ) external virtual override onlyPoolConfigurator { - _bridgeProtocolFee = protocolFee; - } - - /// @inheritdoc IPool - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external virtual override onlyPoolConfigurator { - _flashLoanPremiumTotal = flashLoanPremiumTotal; - _flashLoanPremiumToProtocol = flashLoanPremiumToProtocol; - } - - /// @inheritdoc IPool - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory category - ) external virtual override onlyPoolConfigurator { - // category 0 is reserved for volatile heterogeneous assets and it's always disabled - require(id != 0, Errors.EMODE_CATEGORY_RESERVED); - _eModeCategories[id].ltv = category.ltv; - _eModeCategories[id].liquidationThreshold = category.liquidationThreshold; - _eModeCategories[id].liquidationBonus = category.liquidationBonus; - _eModeCategories[id].label = category.label; - } - - /// @inheritdoc IPool - function configureEModeCategoryCollateralBitmap( - uint8 id, - uint128 collateralBitmap - ) external virtual override onlyPoolConfigurator { - // category 0 is reserved for volatile heterogeneous assets and it's always disabled - require(id != 0, Errors.EMODE_CATEGORY_RESERVED); - _eModeCategories[id].collateralBitmap = collateralBitmap; - } - - /// @inheritdoc IPool - function configureEModeCategoryBorrowableBitmap( - uint8 id, - uint128 borrowableBitmap - ) external virtual override onlyPoolConfigurator { - // category 0 is reserved for volatile heterogeneous assets and it's always disabled - require(id != 0, Errors.EMODE_CATEGORY_RESERVED); - _eModeCategories[id].borrowableBitmap = borrowableBitmap; - } - - /// @inheritdoc IPool - function getEModeCategoryData( - uint8 id - ) external view virtual override returns (DataTypes.EModeCategoryLegacy memory) { - DataTypes.EModeCategory memory category = _eModeCategories[id]; - return - DataTypes.EModeCategoryLegacy({ - ltv: category.ltv, - liquidationThreshold: category.liquidationThreshold, - liquidationBonus: category.liquidationBonus, - priceSource: address(0), - label: category.label - }); - } - - /// @inheritdoc IPool - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory) { - return - DataTypes.CollateralConfig({ - ltv: _eModeCategories[id].ltv, - liquidationThreshold: _eModeCategories[id].liquidationThreshold, - liquidationBonus: _eModeCategories[id].liquidationBonus - }); - } - - /// @inheritdoc IPool - function getEModeCategoryLabel(uint8 id) external view returns (string memory) { - return _eModeCategories[id].label; - } - - /// @inheritdoc IPool - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128) { - return _eModeCategories[id].collateralBitmap; - } - - /// @inheritdoc IPool - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128) { - return _eModeCategories[id].borrowableBitmap; - } - - /// @inheritdoc IPool - function setUserEMode(uint8 categoryId) external virtual override { - EModeLogic.executeSetUserEMode( - _reserves, - _reservesList, - _eModeCategories, - _usersEModeCategory, - _usersConfig[msg.sender], - DataTypes.ExecuteSetUserEModeParams({ - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - categoryId: categoryId - }) - ); - } - - /// @inheritdoc IPool - function getUserEMode(address user) external view virtual override returns (uint256) { - return _usersEModeCategory[user]; - } - - /// @inheritdoc IPool - function resetIsolationModeTotalDebt( - address asset - ) external virtual override onlyPoolConfigurator { - PoolLogic.executeResetIsolationModeTotalDebt(_reserves, asset); - } - - /// @inheritdoc IPool - function getLiquidationGracePeriod(address asset) external virtual override returns (uint40) { - return _reserves[asset].liquidationGracePeriodUntil; - } - - /// @inheritdoc IPool - function setLiquidationGracePeriod( - address asset, - uint40 until - ) external virtual override onlyPoolConfigurator { - require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - PoolLogic.executeSetLiquidationGracePeriod(_reserves, asset, until); - } - - /// @inheritdoc IPool - function rescueTokens( - address token, - address to, - uint256 amount - ) external virtual override onlyPoolAdmin { - PoolLogic.executeRescueTokens(token, to, amount); - } - - /// @inheritdoc IPool - /// @dev Deprecated: maintained for compatibility purposes - function deposit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external virtual override { - SupplyLogic.executeSupply( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteSupplyParams({ - asset: asset, - amount: amount, - onBehalfOf: onBehalfOf, - referralCode: referralCode - }) - ); - } - - /// @inheritdoc IPool - function getFlashLoanLogic() external pure returns (address) { - return address(FlashLoanLogic); - } - - /// @inheritdoc IPool - function getBorrowLogic() external pure returns (address) { - return address(BorrowLogic); - } - - /// @inheritdoc IPool - function getBridgeLogic() external pure returns (address) { - return address(BridgeLogic); - } - - /// @inheritdoc IPool - function getEModeLogic() external pure returns (address) { - return address(EModeLogic); - } - - /// @inheritdoc IPool - function getLiquidationLogic() external pure returns (address) { - return address(LiquidationLogic); - } - - /// @inheritdoc IPool - function getPoolLogic() external pure returns (address) { - return address(PoolLogic); - } - - /// @inheritdoc IPool - function getSupplyLogic() external pure returns (address) { - return address(SupplyLogic); - } -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/PoolStorage.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/PoolStorage.sol deleted file mode 100644 index 719461e4..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/pool/PoolStorage.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {UserConfiguration} from '../libraries/configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; -import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; -import {DataTypes} from '../libraries/types/DataTypes.sol'; - -/** - * @title PoolStorage - * @author Aave - * @notice Contract used as storage of the Pool contract. - * @dev It defines the storage layout of the Pool contract. - */ -contract PoolStorage { - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - // Map of reserves and their data (underlyingAssetOfReserve => reserveData) - mapping(address => DataTypes.ReserveData) internal _reserves; - - // Map of users address and their configuration data (userAddress => userConfiguration) - mapping(address => DataTypes.UserConfigurationMap) internal _usersConfig; - - // List of reserves as a map (reserveId => reserve). - // It is structured as a mapping for gas savings reasons, using the reserve id as index - mapping(uint256 => address) internal _reservesList; - - // List of eMode categories as a map (eModeCategoryId => eModeCategory). - // It is structured as a mapping for gas savings reasons, using the eModeCategoryId as index - mapping(uint8 => DataTypes.EModeCategory) internal _eModeCategories; - - // Map of users address and their eMode category (userAddress => eModeCategoryId) - mapping(address => uint8) internal _usersEModeCategory; - - // Fee of the protocol bridge, expressed in bps - uint256 internal _bridgeProtocolFee; - - // Total FlashLoan Premium, expressed in bps - uint128 internal _flashLoanPremiumTotal; - - // FlashLoan premium paid to protocol treasury, expressed in bps - uint128 internal _flashLoanPremiumToProtocol; - - // DEPRECATED on v3.2.0 - uint64 internal __DEPRECATED_maxStableRateBorrowSizePercent; - - // Maximum number of active reserves there have been in the protocol. It is the upper bound of the reserves list - uint16 internal _reservesCount; -} diff --git a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/ARBITRUM/L2_POOL_IMPL/L2PoolInstance/lib/aave-v3-origin/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC.sol deleted file mode 100644 index 7169fb30..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC.sol +++ /dev/null @@ -1,6036 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} - -// downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol - -/** - * @title LiquidationLogic library - * @author Aave - * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations - */ -library LiquidationLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Default percentage of borrower's debt to be repaid in a liquidation. - * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 0.5e4 results in 50.00% - */ - uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; - - /** - * @dev Maximum percentage of borrower's debt to be repaid in a liquidation - * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 1e4 results in 100.00% - */ - uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; - - /** - * @dev This constant represents below which health factor value it is possible to liquidate - * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. - * A value of 0.95e18 results in 0.95 - */ - uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; - - struct LiquidationCallLocalVars { - uint256 userCollateralBalance; - uint256 userTotalDebt; - uint256 actualDebtToLiquidate; - uint256 actualCollateralToLiquidate; - uint256 liquidationBonus; - uint256 healthFactor; - uint256 liquidationProtocolFeeAmount; - IAToken collateralAToken; - DataTypes.ReserveCache debtReserveCache; - } - - /** - * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) - * covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportional amount of the `collateralAsset` plus a bonus to cover market risk - * @dev Emits the `LiquidationCall()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params The additional parameters needed to execute the liquidation function - */ - function executeLiquidationCall( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ExecuteLiquidationCallParams memory params - ) external { - LiquidationCallLocalVars memory vars; - - DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; - DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; - DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; - vars.debtReserveCache = debtReserve.cache(); - debtReserve.updateState(vars.debtReserveCache); - - (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: params.reservesCount, - user: params.user, - oracle: params.priceOracle, - userEModeCategory: params.userEModeCategory - }) - ); - - (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( - vars.debtReserveCache, - params, - vars.healthFactor - ); - - ValidationLogic.validateLiquidationCall( - userConfig, - collateralReserve, - debtReserve, - DataTypes.ValidateLiquidationCallParams({ - debtReserveCache: vars.debtReserveCache, - totalDebt: vars.userTotalDebt, - healthFactor: vars.healthFactor, - priceOracleSentinel: params.priceOracleSentinel - }) - ); - - vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); - if ( - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - collateralReserve.id - ) - ) { - vars.liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; - } else { - vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); - } - - vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); - - ( - vars.actualCollateralToLiquidate, - vars.actualDebtToLiquidate, - vars.liquidationProtocolFeeAmount - ) = _calculateAvailableCollateralToLiquidate( - collateralReserve, - vars.debtReserveCache, - params.collateralAsset, - params.debtAsset, - vars.actualDebtToLiquidate, - vars.userCollateralBalance, - vars.liquidationBonus, - IPriceOracleGetter(params.priceOracle) - ); - - if (vars.userTotalDebt == vars.actualDebtToLiquidate) { - userConfig.setBorrowing(debtReserve.id, false); - } - - // If the collateral being liquidated is equal to the user balance, - // we set the currency as not being used as collateral anymore - if ( - vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == - vars.userCollateralBalance - ) { - userConfig.setUsingAsCollateral(collateralReserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); - } - - _burnDebtTokens(params, vars); - - debtReserve.updateInterestRatesAndVirtualBalance( - vars.debtReserveCache, - params.debtAsset, - vars.actualDebtToLiquidate, - 0 - ); - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - vars.debtReserveCache, - vars.actualDebtToLiquidate - ); - - if (params.receiveAToken) { - _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); - } else { - _burnCollateralATokens(collateralReserve, params, vars); - } - - // Transfer fee to treasury if it is non-zero - if (vars.liquidationProtocolFeeAmount != 0) { - uint256 liquidityIndex = collateralReserve.getNormalizedIncome(); - uint256 scaledDownLiquidationProtocolFee = vars.liquidationProtocolFeeAmount.rayDiv( - liquidityIndex - ); - uint256 scaledDownUserBalance = vars.collateralAToken.scaledBalanceOf(params.user); - // To avoid trying to send more aTokens than available on balance, due to 1 wei imprecision - if (scaledDownLiquidationProtocolFee > scaledDownUserBalance) { - vars.liquidationProtocolFeeAmount = scaledDownUserBalance.rayMul(liquidityIndex); - } - vars.collateralAToken.transferOnLiquidation( - params.user, - vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), - vars.liquidationProtocolFeeAmount - ); - } - - // Transfers the debt asset being repaid to the aToken, where the liquidity is kept - IERC20(params.debtAsset).safeTransferFrom( - msg.sender, - vars.debtReserveCache.aTokenAddress, - vars.actualDebtToLiquidate - ); - - IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.user, - vars.actualDebtToLiquidate - ); - - emit LiquidationCall( - params.collateralAsset, - params.debtAsset, - params.user, - vars.actualDebtToLiquidate, - vars.actualCollateralToLiquidate, - msg.sender, - params.receiveAToken - ); - } - - /** - * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. - * @dev The function also updates the state and the interest rate of the collateral reserve. - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _burnCollateralATokens( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); - collateralReserve.updateState(collateralReserveCache); - collateralReserve.updateInterestRatesAndVirtualBalance( - collateralReserveCache, - params.collateralAsset, - 0, - vars.actualCollateralToLiquidate - ); - - // Burn the equivalent amount of aToken, sending the underlying to the liquidator - vars.collateralAToken.burn( - params.user, - msg.sender, - vars.actualCollateralToLiquidate, - collateralReserveCache.nextLiquidityIndex - ); - } - - /** - * @notice Liquidates the user aTokens by transferring them to the liquidator. - * @dev The function also checks the state of the liquidator and activates the aToken as collateral - * as in standard transfers if the isolation mode constraints are respected. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _liquidateATokens( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); - vars.collateralAToken.transferOnLiquidation( - params.user, - msg.sender, - vars.actualCollateralToLiquidate - ); - - if (liquidatorPreviousATokenBalance == 0) { - DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - liquidatorConfig, - collateralReserve.configuration, - collateralReserve.aTokenAddress - ) - ) { - liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); - } - } - } - - /** - * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. - * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. - * @param params The additional parameters needed to execute the liquidation function - * @param vars the executeLiquidationCall() function local vars - */ - function _burnDebtTokens( - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( - vars.debtReserveCache.variableDebtTokenAddress - ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); - } - - /** - * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor - * and corresponding close factor. - * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR - * @param debtReserveCache The reserve cache data object of the debt reserve - * @param params The additional parameters needed to execute the liquidation function - * @param healthFactor The health factor of the position - * @return The total debt of the user - * @return The actual debt to liquidate as a function of the closeFactor - */ - function _calculateDebt( - DataTypes.ReserveCache memory debtReserveCache, - DataTypes.ExecuteLiquidationCallParams memory params, - uint256 healthFactor - ) internal view returns (uint256, uint256) { - uint256 userVariableDebt = IERC20(debtReserveCache.variableDebtTokenAddress).balanceOf( - params.user - ); - - uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD - ? DEFAULT_LIQUIDATION_CLOSE_FACTOR - : MAX_LIQUIDATION_CLOSE_FACTOR; - - uint256 maxLiquidatableDebt = userVariableDebt.percentMul(closeFactor); - - uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt - ? maxLiquidatableDebt - : params.debtToCover; - - return (userVariableDebt, actualDebtToLiquidate); - } - - struct AvailableCollateralToLiquidateLocalVars { - uint256 collateralPrice; - uint256 debtAssetPrice; - uint256 maxCollateralToLiquidate; - uint256 baseCollateral; - uint256 bonusCollateral; - uint256 debtAssetDecimals; - uint256 collateralDecimals; - uint256 collateralAssetUnit; - uint256 debtAssetUnit; - uint256 collateralAmount; - uint256 debtAmountNeeded; - uint256 liquidationProtocolFeePercentage; - uint256 liquidationProtocolFee; - } - - /** - * @notice Calculates how much of a specific collateral can be liquidated, given - * a certain amount of debt asset. - * @dev This function needs to be called after all the checks to validate the liquidation have been performed, - * otherwise it might fail. - * @param collateralReserve The data of the collateral reserve - * @param debtReserveCache The cached data of the debt reserve - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated - * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation - * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) - * @return The amount to repay with the liquidation - * @return The fee taken from the liquidation bonus amount to be paid to the protocol - */ - function _calculateAvailableCollateralToLiquidate( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveCache memory debtReserveCache, - address collateralAsset, - address debtAsset, - uint256 debtToCover, - uint256 userCollateralBalance, - uint256 liquidationBonus, - IPriceOracleGetter oracle - ) internal view returns (uint256, uint256, uint256) { - AvailableCollateralToLiquidateLocalVars memory vars; - - vars.collateralPrice = oracle.getAssetPrice(collateralAsset); - vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); - - vars.collateralDecimals = collateralReserve.configuration.getDecimals(); - vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); - - unchecked { - vars.collateralAssetUnit = 10 ** vars.collateralDecimals; - vars.debtAssetUnit = 10 ** vars.debtAssetDecimals; - } - - vars.liquidationProtocolFeePercentage = collateralReserve - .configuration - .getLiquidationProtocolFee(); - - // This is the base collateral to liquidate based on the given debt to cover - vars.baseCollateral = - ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / - (vars.collateralPrice * vars.debtAssetUnit); - - vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); - - if (vars.maxCollateralToLiquidate > userCollateralBalance) { - vars.collateralAmount = userCollateralBalance; - vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / - (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); - } else { - vars.collateralAmount = vars.maxCollateralToLiquidate; - vars.debtAmountNeeded = debtToCover; - } - - if (vars.liquidationProtocolFeePercentage != 0) { - vars.bonusCollateral = - vars.collateralAmount - - vars.collateralAmount.percentDiv(liquidationBonus); - - vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( - vars.liquidationProtocolFeePercentage - ); - - return ( - vars.collateralAmount - vars.liquidationProtocolFee, - vars.debtAmountNeeded, - vars.liquidationProtocolFee - ); - } else { - return (vars.collateralAmount, vars.debtAmountNeeded, 0); - } - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 01e1bcaf..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,833 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index e7ba8f7a..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 43987f47..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,583 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index 647fc7e7..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index cd5b83c6..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol deleted file mode 100644 index 473840ea..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol deleted file mode 100644 index 8f4c35f6..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ /dev/null @@ -1,460 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts//IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {PercentageMath} from '../../libraries/math/PercentageMath.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {DataTypes} from '../../libraries/types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {IsolationModeLogic} from './IsolationModeLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; -import {UserConfiguration} from '../../libraries/configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../../libraries/configuration/ReserveConfiguration.sol'; -import {EModeConfiguration} from '../../libraries/configuration/EModeConfiguration.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; - -/** - * @title LiquidationLogic library - * @author Aave - * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations - */ -library LiquidationLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Default percentage of borrower's debt to be repaid in a liquidation. - * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 0.5e4 results in 50.00% - */ - uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; - - /** - * @dev Maximum percentage of borrower's debt to be repaid in a liquidation - * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 1e4 results in 100.00% - */ - uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; - - /** - * @dev This constant represents below which health factor value it is possible to liquidate - * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. - * A value of 0.95e18 results in 0.95 - */ - uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; - - struct LiquidationCallLocalVars { - uint256 userCollateralBalance; - uint256 userTotalDebt; - uint256 actualDebtToLiquidate; - uint256 actualCollateralToLiquidate; - uint256 liquidationBonus; - uint256 healthFactor; - uint256 liquidationProtocolFeeAmount; - IAToken collateralAToken; - DataTypes.ReserveCache debtReserveCache; - } - - /** - * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) - * covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportional amount of the `collateralAsset` plus a bonus to cover market risk - * @dev Emits the `LiquidationCall()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params The additional parameters needed to execute the liquidation function - */ - function executeLiquidationCall( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ExecuteLiquidationCallParams memory params - ) external { - LiquidationCallLocalVars memory vars; - - DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; - DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; - DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; - vars.debtReserveCache = debtReserve.cache(); - debtReserve.updateState(vars.debtReserveCache); - - (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: params.reservesCount, - user: params.user, - oracle: params.priceOracle, - userEModeCategory: params.userEModeCategory - }) - ); - - (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( - vars.debtReserveCache, - params, - vars.healthFactor - ); - - ValidationLogic.validateLiquidationCall( - userConfig, - collateralReserve, - debtReserve, - DataTypes.ValidateLiquidationCallParams({ - debtReserveCache: vars.debtReserveCache, - totalDebt: vars.userTotalDebt, - healthFactor: vars.healthFactor, - priceOracleSentinel: params.priceOracleSentinel - }) - ); - - vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); - if ( - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - collateralReserve.id - ) - ) { - vars.liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; - } else { - vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); - } - - vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); - - ( - vars.actualCollateralToLiquidate, - vars.actualDebtToLiquidate, - vars.liquidationProtocolFeeAmount - ) = _calculateAvailableCollateralToLiquidate( - collateralReserve, - vars.debtReserveCache, - params.collateralAsset, - params.debtAsset, - vars.actualDebtToLiquidate, - vars.userCollateralBalance, - vars.liquidationBonus, - IPriceOracleGetter(params.priceOracle) - ); - - if (vars.userTotalDebt == vars.actualDebtToLiquidate) { - userConfig.setBorrowing(debtReserve.id, false); - } - - // If the collateral being liquidated is equal to the user balance, - // we set the currency as not being used as collateral anymore - if ( - vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == - vars.userCollateralBalance - ) { - userConfig.setUsingAsCollateral(collateralReserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); - } - - _burnDebtTokens(params, vars); - - debtReserve.updateInterestRatesAndVirtualBalance( - vars.debtReserveCache, - params.debtAsset, - vars.actualDebtToLiquidate, - 0 - ); - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - vars.debtReserveCache, - vars.actualDebtToLiquidate - ); - - if (params.receiveAToken) { - _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); - } else { - _burnCollateralATokens(collateralReserve, params, vars); - } - - // Transfer fee to treasury if it is non-zero - if (vars.liquidationProtocolFeeAmount != 0) { - uint256 liquidityIndex = collateralReserve.getNormalizedIncome(); - uint256 scaledDownLiquidationProtocolFee = vars.liquidationProtocolFeeAmount.rayDiv( - liquidityIndex - ); - uint256 scaledDownUserBalance = vars.collateralAToken.scaledBalanceOf(params.user); - // To avoid trying to send more aTokens than available on balance, due to 1 wei imprecision - if (scaledDownLiquidationProtocolFee > scaledDownUserBalance) { - vars.liquidationProtocolFeeAmount = scaledDownUserBalance.rayMul(liquidityIndex); - } - vars.collateralAToken.transferOnLiquidation( - params.user, - vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), - vars.liquidationProtocolFeeAmount - ); - } - - // Transfers the debt asset being repaid to the aToken, where the liquidity is kept - IERC20(params.debtAsset).safeTransferFrom( - msg.sender, - vars.debtReserveCache.aTokenAddress, - vars.actualDebtToLiquidate - ); - - IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.user, - vars.actualDebtToLiquidate - ); - - emit LiquidationCall( - params.collateralAsset, - params.debtAsset, - params.user, - vars.actualDebtToLiquidate, - vars.actualCollateralToLiquidate, - msg.sender, - params.receiveAToken - ); - } - - /** - * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. - * @dev The function also updates the state and the interest rate of the collateral reserve. - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _burnCollateralATokens( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); - collateralReserve.updateState(collateralReserveCache); - collateralReserve.updateInterestRatesAndVirtualBalance( - collateralReserveCache, - params.collateralAsset, - 0, - vars.actualCollateralToLiquidate - ); - - // Burn the equivalent amount of aToken, sending the underlying to the liquidator - vars.collateralAToken.burn( - params.user, - msg.sender, - vars.actualCollateralToLiquidate, - collateralReserveCache.nextLiquidityIndex - ); - } - - /** - * @notice Liquidates the user aTokens by transferring them to the liquidator. - * @dev The function also checks the state of the liquidator and activates the aToken as collateral - * as in standard transfers if the isolation mode constraints are respected. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _liquidateATokens( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); - vars.collateralAToken.transferOnLiquidation( - params.user, - msg.sender, - vars.actualCollateralToLiquidate - ); - - if (liquidatorPreviousATokenBalance == 0) { - DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - liquidatorConfig, - collateralReserve.configuration, - collateralReserve.aTokenAddress - ) - ) { - liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); - } - } - } - - /** - * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. - * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. - * @param params The additional parameters needed to execute the liquidation function - * @param vars the executeLiquidationCall() function local vars - */ - function _burnDebtTokens( - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( - vars.debtReserveCache.variableDebtTokenAddress - ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); - } - - /** - * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor - * and corresponding close factor. - * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR - * @param debtReserveCache The reserve cache data object of the debt reserve - * @param params The additional parameters needed to execute the liquidation function - * @param healthFactor The health factor of the position - * @return The total debt of the user - * @return The actual debt to liquidate as a function of the closeFactor - */ - function _calculateDebt( - DataTypes.ReserveCache memory debtReserveCache, - DataTypes.ExecuteLiquidationCallParams memory params, - uint256 healthFactor - ) internal view returns (uint256, uint256) { - uint256 userVariableDebt = IERC20(debtReserveCache.variableDebtTokenAddress).balanceOf( - params.user - ); - - uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD - ? DEFAULT_LIQUIDATION_CLOSE_FACTOR - : MAX_LIQUIDATION_CLOSE_FACTOR; - - uint256 maxLiquidatableDebt = userVariableDebt.percentMul(closeFactor); - - uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt - ? maxLiquidatableDebt - : params.debtToCover; - - return (userVariableDebt, actualDebtToLiquidate); - } - - struct AvailableCollateralToLiquidateLocalVars { - uint256 collateralPrice; - uint256 debtAssetPrice; - uint256 maxCollateralToLiquidate; - uint256 baseCollateral; - uint256 bonusCollateral; - uint256 debtAssetDecimals; - uint256 collateralDecimals; - uint256 collateralAssetUnit; - uint256 debtAssetUnit; - uint256 collateralAmount; - uint256 debtAmountNeeded; - uint256 liquidationProtocolFeePercentage; - uint256 liquidationProtocolFee; - } - - /** - * @notice Calculates how much of a specific collateral can be liquidated, given - * a certain amount of debt asset. - * @dev This function needs to be called after all the checks to validate the liquidation have been performed, - * otherwise it might fail. - * @param collateralReserve The data of the collateral reserve - * @param debtReserveCache The cached data of the debt reserve - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated - * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation - * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) - * @return The amount to repay with the liquidation - * @return The fee taken from the liquidation bonus amount to be paid to the protocol - */ - function _calculateAvailableCollateralToLiquidate( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveCache memory debtReserveCache, - address collateralAsset, - address debtAsset, - uint256 debtToCover, - uint256 userCollateralBalance, - uint256 liquidationBonus, - IPriceOracleGetter oracle - ) internal view returns (uint256, uint256, uint256) { - AvailableCollateralToLiquidateLocalVars memory vars; - - vars.collateralPrice = oracle.getAssetPrice(collateralAsset); - vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); - - vars.collateralDecimals = collateralReserve.configuration.getDecimals(); - vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); - - unchecked { - vars.collateralAssetUnit = 10 ** vars.collateralDecimals; - vars.debtAssetUnit = 10 ** vars.debtAssetDecimals; - } - - vars.liquidationProtocolFeePercentage = collateralReserve - .configuration - .getLiquidationProtocolFee(); - - // This is the base collateral to liquidate based on the given debt to cover - vars.baseCollateral = - ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / - (vars.collateralPrice * vars.debtAssetUnit); - - vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); - - if (vars.maxCollateralToLiquidate > userCollateralBalance) { - vars.collateralAmount = userCollateralBalance; - vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / - (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); - } else { - vars.collateralAmount = vars.maxCollateralToLiquidate; - vars.debtAmountNeeded = debtToCover; - } - - if (vars.liquidationProtocolFeePercentage != 0) { - vars.bonusCollateral = - vars.collateralAmount - - vars.collateralAmount.percentDiv(liquidationBonus); - - vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( - vars.liquidationProtocolFeePercentage - ); - - return ( - vars.collateralAmount - vars.liquidationProtocolFee, - vars.debtAmountNeeded, - vars.liquidationProtocolFee - ); - } else { - return (vars.collateralAmount, vars.debtAmountNeeded, 0); - } - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index dd5c637d..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index e08a30e8..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index 9adca939..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/ARBITRUM/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/ARBITRUM/ORACLE.sol b/downloads/ARBITRUM/ORACLE.sol deleted file mode 100644 index 47299698..00000000 --- a/downloads/ARBITRUM/ORACLE.sol +++ /dev/null @@ -1,759 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity =0.8.10 ^0.8.0; - -// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol - -// Chainlink Contracts v0.8 - -interface AggregatorInterface { - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt); - - event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); -} - -// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - **/ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - **/ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - **/ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - **/ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - **/ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - **/ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - **/ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - **/ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - **/ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - **/ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - **/ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - **/ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - **/ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' - string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 -} - -// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - **/ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an admin as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IAaveOracle.sol - -/** - * @title IAaveOracle - * @author Aave - * @notice Defines the basic interface for the Aave Oracle - */ -interface IAaveOracle is IPriceOracleGetter { - /** - * @dev Emitted after the base currency is set - * @param baseCurrency The base currency of used for price quotes - * @param baseCurrencyUnit The unit of the base currency - */ - event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); - - /** - * @dev Emitted after the price source of an asset is updated - * @param asset The address of the asset - * @param source The price source of the asset - */ - event AssetSourceUpdated(address indexed asset, address indexed source); - - /** - * @dev Emitted after the address of fallback oracle is updated - * @param fallbackOracle The address of the fallback oracle - */ - event FallbackOracleUpdated(address indexed fallbackOracle); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Sets or replaces price sources of assets - * @param assets The addresses of the assets - * @param sources The addresses of the price sources - */ - function setAssetSources(address[] calldata assets, address[] calldata sources) external; - - /** - * @notice Sets the fallback oracle - * @param fallbackOracle The address of the fallback oracle - */ - function setFallbackOracle(address fallbackOracle) external; - - /** - * @notice Returns a list of prices from a list of assets addresses - * @param assets The list of assets addresses - * @return The prices of the given assets - */ - function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); - - /** - * @notice Returns the address of the source for an asset address - * @param asset The address of the asset - * @return The address of the source - */ - function getSourceOfAsset(address asset) external view returns (address); - - /** - * @notice Returns the address of the fallback oracle - * @return The address of the fallback oracle - */ - function getFallbackOracle() external view returns (address); -} - -// downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/misc/AaveOracle.sol - -/** - * @title AaveOracle - * @author Aave - * @notice Contract to get asset prices, manage price sources and update the fallback oracle - * - Use of Chainlink Aggregators as first source of price - * - If the returned price by a Chainlink aggregator is <= 0, the call is forwarded to a fallback oracle - * - Owned by the Aave governance - */ -contract AaveOracle is IAaveOracle { - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - // Map of asset price sources (asset => priceSource) - mapping(address => AggregatorInterface) private assetsSources; - - IPriceOracleGetter private _fallbackOracle; - address public immutable override BASE_CURRENCY; - uint256 public immutable override BASE_CURRENCY_UNIT; - - /** - * @dev Only asset listing or pool admin can call functions marked by this modifier. - **/ - modifier onlyAssetListingOrPoolAdmins() { - _onlyAssetListingOrPoolAdmins(); - _; - } - - /** - * @notice Constructor - * @param provider The address of the new PoolAddressesProvider - * @param assets The addresses of the assets - * @param sources The address of the source of each asset - * @param fallbackOracle The address of the fallback oracle to use if the data of an - * aggregator is not consistent - * @param baseCurrency The base currency used for the price quotes. If USD is used, base currency is 0x0 - * @param baseCurrencyUnit The unit of the base currency - */ - constructor( - IPoolAddressesProvider provider, - address[] memory assets, - address[] memory sources, - address fallbackOracle, - address baseCurrency, - uint256 baseCurrencyUnit - ) { - ADDRESSES_PROVIDER = provider; - _setFallbackOracle(fallbackOracle); - _setAssetsSources(assets, sources); - BASE_CURRENCY = baseCurrency; - BASE_CURRENCY_UNIT = baseCurrencyUnit; - emit BaseCurrencySet(baseCurrency, baseCurrencyUnit); - } - - /// @inheritdoc IAaveOracle - function setAssetSources( - address[] calldata assets, - address[] calldata sources - ) external override onlyAssetListingOrPoolAdmins { - _setAssetsSources(assets, sources); - } - - /// @inheritdoc IAaveOracle - function setFallbackOracle( - address fallbackOracle - ) external override onlyAssetListingOrPoolAdmins { - _setFallbackOracle(fallbackOracle); - } - - /** - * @notice Internal function to set the sources for each asset - * @param assets The addresses of the assets - * @param sources The address of the source of each asset - */ - function _setAssetsSources(address[] memory assets, address[] memory sources) internal { - require(assets.length == sources.length, Errors.INCONSISTENT_PARAMS_LENGTH); - for (uint256 i = 0; i < assets.length; i++) { - assetsSources[assets[i]] = AggregatorInterface(sources[i]); - emit AssetSourceUpdated(assets[i], sources[i]); - } - } - - /** - * @notice Internal function to set the fallback oracle - * @param fallbackOracle The address of the fallback oracle - */ - function _setFallbackOracle(address fallbackOracle) internal { - _fallbackOracle = IPriceOracleGetter(fallbackOracle); - emit FallbackOracleUpdated(fallbackOracle); - } - - /// @inheritdoc IPriceOracleGetter - function getAssetPrice(address asset) public view override returns (uint256) { - AggregatorInterface source = assetsSources[asset]; - - if (asset == BASE_CURRENCY) { - return BASE_CURRENCY_UNIT; - } else if (address(source) == address(0)) { - return _fallbackOracle.getAssetPrice(asset); - } else { - int256 price = source.latestAnswer(); - if (price > 0) { - return uint256(price); - } else { - return _fallbackOracle.getAssetPrice(asset); - } - } - } - - /// @inheritdoc IAaveOracle - function getAssetsPrices( - address[] calldata assets - ) external view override returns (uint256[] memory) { - uint256[] memory prices = new uint256[](assets.length); - for (uint256 i = 0; i < assets.length; i++) { - prices[i] = getAssetPrice(assets[i]); - } - return prices; - } - - /// @inheritdoc IAaveOracle - function getSourceOfAsset(address asset) external view override returns (address) { - return address(assetsSources[asset]); - } - - /// @inheritdoc IAaveOracle - function getFallbackOracle() external view returns (address) { - return address(_fallbackOracle); - } - - function _onlyAssetListingOrPoolAdmins() internal view { - IACLManager aclManager = IACLManager(ADDRESSES_PROVIDER.getACLManager()); - require( - aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), - Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN - ); - } -} diff --git a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol deleted file mode 100644 index 496151aa..00000000 --- a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -// Chainlink Contracts v0.8 -pragma solidity ^0.8.0; - -interface AggregatorInterface { - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt); - - event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); -} diff --git a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 4bb6e645..00000000 --- a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - **/ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an admin as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IAaveOracle.sol b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IAaveOracle.sol deleted file mode 100644 index 0ad9b47f..00000000 --- a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IAaveOracle.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IPriceOracleGetter} from './IPriceOracleGetter.sol'; -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IAaveOracle - * @author Aave - * @notice Defines the basic interface for the Aave Oracle - */ -interface IAaveOracle is IPriceOracleGetter { - /** - * @dev Emitted after the base currency is set - * @param baseCurrency The base currency of used for price quotes - * @param baseCurrencyUnit The unit of the base currency - */ - event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); - - /** - * @dev Emitted after the price source of an asset is updated - * @param asset The address of the asset - * @param source The price source of the asset - */ - event AssetSourceUpdated(address indexed asset, address indexed source); - - /** - * @dev Emitted after the address of fallback oracle is updated - * @param fallbackOracle The address of the fallback oracle - */ - event FallbackOracleUpdated(address indexed fallbackOracle); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Sets or replaces price sources of assets - * @param assets The addresses of the assets - * @param sources The addresses of the price sources - */ - function setAssetSources(address[] calldata assets, address[] calldata sources) external; - - /** - * @notice Sets the fallback oracle - * @param fallbackOracle The address of the fallback oracle - */ - function setFallbackOracle(address fallbackOracle) external; - - /** - * @notice Returns a list of prices from a list of assets addresses - * @param assets The list of assets addresses - * @return The prices of the given assets - */ - function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); - - /** - * @notice Returns the address of the source for an asset address - * @param asset The address of the asset - * @return The address of the source - */ - function getSourceOfAsset(address asset) external view returns (address); - - /** - * @notice Returns the address of the fallback oracle - * @return The address of the fallback oracle - */ - function getFallbackOracle() external view returns (address); -} diff --git a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index 01a126bd..00000000 --- a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - **/ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - **/ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - **/ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - **/ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - **/ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - **/ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - **/ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - **/ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - **/ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 92c1c466..00000000 --- a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - **/ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - **/ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - **/ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - **/ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/misc/AaveOracle.sol b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/misc/AaveOracle.sol deleted file mode 100644 index 99afe286..00000000 --- a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/misc/AaveOracle.sol +++ /dev/null @@ -1,152 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {AggregatorInterface} from '../dependencies/chainlink/AggregatorInterface.sol'; -import {Errors} from '../protocol/libraries/helpers/Errors.sol'; -import {IACLManager} from '../interfaces/IACLManager.sol'; -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {IPriceOracleGetter} from '../interfaces/IPriceOracleGetter.sol'; -import {IAaveOracle} from '../interfaces/IAaveOracle.sol'; - -/** - * @title AaveOracle - * @author Aave - * @notice Contract to get asset prices, manage price sources and update the fallback oracle - * - Use of Chainlink Aggregators as first source of price - * - If the returned price by a Chainlink aggregator is <= 0, the call is forwarded to a fallback oracle - * - Owned by the Aave governance - */ -contract AaveOracle is IAaveOracle { - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - // Map of asset price sources (asset => priceSource) - mapping(address => AggregatorInterface) private assetsSources; - - IPriceOracleGetter private _fallbackOracle; - address public immutable override BASE_CURRENCY; - uint256 public immutable override BASE_CURRENCY_UNIT; - - /** - * @dev Only asset listing or pool admin can call functions marked by this modifier. - **/ - modifier onlyAssetListingOrPoolAdmins() { - _onlyAssetListingOrPoolAdmins(); - _; - } - - /** - * @notice Constructor - * @param provider The address of the new PoolAddressesProvider - * @param assets The addresses of the assets - * @param sources The address of the source of each asset - * @param fallbackOracle The address of the fallback oracle to use if the data of an - * aggregator is not consistent - * @param baseCurrency The base currency used for the price quotes. If USD is used, base currency is 0x0 - * @param baseCurrencyUnit The unit of the base currency - */ - constructor( - IPoolAddressesProvider provider, - address[] memory assets, - address[] memory sources, - address fallbackOracle, - address baseCurrency, - uint256 baseCurrencyUnit - ) { - ADDRESSES_PROVIDER = provider; - _setFallbackOracle(fallbackOracle); - _setAssetsSources(assets, sources); - BASE_CURRENCY = baseCurrency; - BASE_CURRENCY_UNIT = baseCurrencyUnit; - emit BaseCurrencySet(baseCurrency, baseCurrencyUnit); - } - - /// @inheritdoc IAaveOracle - function setAssetSources(address[] calldata assets, address[] calldata sources) - external - override - onlyAssetListingOrPoolAdmins - { - _setAssetsSources(assets, sources); - } - - /// @inheritdoc IAaveOracle - function setFallbackOracle(address fallbackOracle) - external - override - onlyAssetListingOrPoolAdmins - { - _setFallbackOracle(fallbackOracle); - } - - /** - * @notice Internal function to set the sources for each asset - * @param assets The addresses of the assets - * @param sources The address of the source of each asset - */ - function _setAssetsSources(address[] memory assets, address[] memory sources) internal { - require(assets.length == sources.length, Errors.INCONSISTENT_PARAMS_LENGTH); - for (uint256 i = 0; i < assets.length; i++) { - assetsSources[assets[i]] = AggregatorInterface(sources[i]); - emit AssetSourceUpdated(assets[i], sources[i]); - } - } - - /** - * @notice Internal function to set the fallback oracle - * @param fallbackOracle The address of the fallback oracle - */ - function _setFallbackOracle(address fallbackOracle) internal { - _fallbackOracle = IPriceOracleGetter(fallbackOracle); - emit FallbackOracleUpdated(fallbackOracle); - } - - /// @inheritdoc IPriceOracleGetter - function getAssetPrice(address asset) public view override returns (uint256) { - AggregatorInterface source = assetsSources[asset]; - - if (asset == BASE_CURRENCY) { - return BASE_CURRENCY_UNIT; - } else if (address(source) == address(0)) { - return _fallbackOracle.getAssetPrice(asset); - } else { - int256 price = source.latestAnswer(); - if (price > 0) { - return uint256(price); - } else { - return _fallbackOracle.getAssetPrice(asset); - } - } - } - - /// @inheritdoc IAaveOracle - function getAssetsPrices(address[] calldata assets) - external - view - override - returns (uint256[] memory) - { - uint256[] memory prices = new uint256[](assets.length); - for (uint256 i = 0; i < assets.length; i++) { - prices[i] = getAssetPrice(assets[i]); - } - return prices; - } - - /// @inheritdoc IAaveOracle - function getSourceOfAsset(address asset) external view override returns (address) { - return address(assetsSources[asset]); - } - - /// @inheritdoc IAaveOracle - function getFallbackOracle() external view returns (address) { - return address(_fallbackOracle); - } - - function _onlyAssetListingOrPoolAdmins() internal view { - IACLManager aclManager = IACLManager(ADDRESSES_PROVIDER.getACLManager()); - require( - aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), - Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN - ); - } -} diff --git a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index 640e4632..00000000 --- a/downloads/ARBITRUM/ORACLE/AaveOracle/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' - string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER.sol deleted file mode 100644 index 9478e368..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER.sol +++ /dev/null @@ -1,855 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity =0.8.10; - -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // According to EIP-1052, 0x0 is the value returned for not-yet created accounts - // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned - // for accounts without code, i.e. `keccak256('')` - bytes32 codehash; - bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; - // solhint-disable-next-line no-inline-assembly - assembly { - codehash := extcodehash(account) - } - return (codehash != accountHash && codehash != 0x0); - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - // solhint-disable-next-line avoid-low-level-calls, avoid-call-value - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } -} - -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol - -/** - * @title Proxy - * @dev Implements delegation of calls to other contracts, with proper - * forwarding of return values and bubbling of failures. - * It defines a fallback function that delegates all calls to the address - * returned by the abstract _implementation() internal function. - */ -abstract contract Proxy { - /** - * @dev Fallback function. - * Will run if no other function in the contract matches the call data. - * Implemented entirely in `_fallback`. - */ - fallback() external payable { - _fallback(); - } - - /** - * @return The Address of the implementation. - */ - function _implementation() internal view virtual returns (address); - - /** - * @dev Delegates execution to an implementation contract. - * This is a low level function that doesn't return to its internal call site. - * It will return to the external caller whatever the implementation returns. - * @param implementation Address to delegate. - */ - function _delegate(address implementation) internal { - //solium-disable-next-line - assembly { - // Copy msg.data. We take full control of memory in this inline assembly - // block because it will not return to Solidity code. We overwrite the - // Solidity scratch pad at memory position 0. - calldatacopy(0, 0, calldatasize()) - - // Call the implementation. - // out and outsize are 0 because we don't know the size yet. - let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) - - // Copy the returned data. - returndatacopy(0, 0, returndatasize()) - - switch result - // delegatecall returns 0 on error. - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } - } - } - - /** - * @dev Function that is run as the first thing in the fallback function. - * Can be redefined in derived contracts to add functionality. - * Redefinitions must call super._willFallback(). - */ - function _willFallback() internal virtual {} - - /** - * @dev fallback implementation. - * Extracted to enable manual triggering. - */ - function _fallback() internal { - _willFallback(); - _delegate(_implementation()); - } -} - -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - **/ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - **/ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - **/ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - **/ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - **/ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - **/ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - **/ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - **/ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - **/ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} - -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol - -/** - * @title BaseUpgradeabilityProxy - * @dev This contract implements a proxy that allows to change the - * implementation address to which it will delegate. - * Such a change is called an implementation upgrade. - */ -contract BaseUpgradeabilityProxy is Proxy { - /** - * @dev Emitted when the implementation is upgraded. - * @param implementation Address of the new implementation. - */ - event Upgraded(address indexed implementation); - - /** - * @dev Storage slot with the address of the current implementation. - * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant IMPLEMENTATION_SLOT = - 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /** - * @dev Returns the current implementation. - * @return impl Address of the current implementation - */ - function _implementation() internal view override returns (address impl) { - bytes32 slot = IMPLEMENTATION_SLOT; - //solium-disable-next-line - assembly { - impl := sload(slot) - } - } - - /** - * @dev Upgrades the proxy to a new implementation. - * @param newImplementation Address of the new implementation. - */ - function _upgradeTo(address newImplementation) internal { - _setImplementation(newImplementation); - emit Upgraded(newImplementation); - } - - /** - * @dev Sets the implementation address of the proxy. - * @param newImplementation Address of the new implementation. - */ - function _setImplementation(address newImplementation) internal { - require( - Address.isContract(newImplementation), - 'Cannot set a proxy implementation to a non-contract address' - ); - - bytes32 slot = IMPLEMENTATION_SLOT; - - //solium-disable-next-line - assembly { - sstore(slot, newImplementation) - } - } -} - -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol - -/** - * @title InitializableUpgradeabilityProxy - * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing - * implementation and init data. - */ -contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { - /** - * @dev Contract initializer. - * @param _logic Address of the initial implementation. - * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. - */ - function initialize(address _logic, bytes memory _data) public payable { - require(_implementation() == address(0)); - assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); - _setImplementation(_logic); - if (_data.length > 0) { - (bool success, ) = _logic.delegatecall(_data); - require(success); - } - } -} - -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol - -/** - * @title BaseImmutableAdminUpgradeabilityProxy - * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern - * @notice This contract combines an upgradeability proxy with an authorization - * mechanism for administrative tasks. - * @dev The admin role is stored in an immutable, which helps saving transactions costs - * All external functions in this contract must be guarded by the - * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity - * feature proposal that would enable this to be done automatically. - */ -contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - address internal immutable _admin; - - /** - * @dev Constructor. - * @param admin The address of the admin - */ - constructor(address admin) { - _admin = admin; - } - - modifier ifAdmin() { - if (msg.sender == _admin) { - _; - } else { - _fallback(); - } - } - - /** - * @notice Return the admin address - * @return The address of the proxy admin. - */ - function admin() external ifAdmin returns (address) { - return _admin; - } - - /** - * @notice Return the implementation address - * @return The address of the implementation. - */ - function implementation() external ifAdmin returns (address) { - return _implementation(); - } - - /** - * @notice Upgrade the backing implementation of the proxy. - * @dev Only the admin can call this function. - * @param newImplementation The address of the new implementation. - */ - function upgradeTo(address newImplementation) external ifAdmin { - _upgradeTo(newImplementation); - } - - /** - * @notice Upgrade the backing implementation of the proxy and call a function - * on the new implementation. - * @dev This is useful to initialize the proxied contract. - * @param newImplementation The address of the new implementation. - * @param data Data to send as msg.data in the low level call. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - */ - function upgradeToAndCall( - address newImplementation, - bytes calldata data - ) external payable ifAdmin { - _upgradeTo(newImplementation); - (bool success, ) = newImplementation.delegatecall(data); - require(success); - } - - /** - * @notice Only fall back when the sender is not the admin. - */ - function _willFallback() internal virtual override { - require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); - super._willFallback(); - } -} - -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol - -/** - * @title InitializableAdminUpgradeabilityProxy - * @author Aave - * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function - */ -contract InitializableImmutableAdminUpgradeabilityProxy is - BaseImmutableAdminUpgradeabilityProxy, - InitializableUpgradeabilityProxy -{ - /** - * @dev Constructor. - * @param admin The address of the admin - */ - constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { - // Intentionally left blank - } - - /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy - function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { - BaseImmutableAdminUpgradeabilityProxy._willFallback(); - } -} - -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol - -/** - * @title PoolAddressesProvider - * @author Aave - * @notice Main registry of addresses part of or connected to the protocol, including permissioned roles - * @dev Acts as factory of proxies and admin of those, so with right to change its implementations - * @dev Owned by the Aave Governance - **/ -contract PoolAddressesProvider is Ownable, IPoolAddressesProvider { - // Identifier of the Aave Market - string private _marketId; - - // Map of registered addresses (identifier => registeredAddress) - mapping(bytes32 => address) private _addresses; - - // Main identifiers - bytes32 private constant POOL = 'POOL'; - bytes32 private constant POOL_CONFIGURATOR = 'POOL_CONFIGURATOR'; - bytes32 private constant PRICE_ORACLE = 'PRICE_ORACLE'; - bytes32 private constant ACL_MANAGER = 'ACL_MANAGER'; - bytes32 private constant ACL_ADMIN = 'ACL_ADMIN'; - bytes32 private constant PRICE_ORACLE_SENTINEL = 'PRICE_ORACLE_SENTINEL'; - bytes32 private constant DATA_PROVIDER = 'DATA_PROVIDER'; - - /** - * @dev Constructor. - * @param marketId The identifier of the market. - * @param owner The owner address of this contract. - */ - constructor(string memory marketId, address owner) { - _setMarketId(marketId); - transferOwnership(owner); - } - - /// @inheritdoc IPoolAddressesProvider - function getMarketId() external view override returns (string memory) { - return _marketId; - } - - /// @inheritdoc IPoolAddressesProvider - function setMarketId(string memory newMarketId) external override onlyOwner { - _setMarketId(newMarketId); - } - - /// @inheritdoc IPoolAddressesProvider - function getAddress(bytes32 id) public view override returns (address) { - return _addresses[id]; - } - - /// @inheritdoc IPoolAddressesProvider - function setAddress(bytes32 id, address newAddress) external override onlyOwner { - address oldAddress = _addresses[id]; - _addresses[id] = newAddress; - emit AddressSet(id, oldAddress, newAddress); - } - - /// @inheritdoc IPoolAddressesProvider - function setAddressAsProxy( - bytes32 id, - address newImplementationAddress - ) external override onlyOwner { - address proxyAddress = _addresses[id]; - address oldImplementationAddress = _getProxyImplementation(id); - _updateImpl(id, newImplementationAddress); - emit AddressSetAsProxy(id, proxyAddress, oldImplementationAddress, newImplementationAddress); - } - - /// @inheritdoc IPoolAddressesProvider - function getPool() external view override returns (address) { - return getAddress(POOL); - } - - /// @inheritdoc IPoolAddressesProvider - function setPoolImpl(address newPoolImpl) external override onlyOwner { - address oldPoolImpl = _getProxyImplementation(POOL); - _updateImpl(POOL, newPoolImpl); - emit PoolUpdated(oldPoolImpl, newPoolImpl); - } - - /// @inheritdoc IPoolAddressesProvider - function getPoolConfigurator() external view override returns (address) { - return getAddress(POOL_CONFIGURATOR); - } - - /// @inheritdoc IPoolAddressesProvider - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external override onlyOwner { - address oldPoolConfiguratorImpl = _getProxyImplementation(POOL_CONFIGURATOR); - _updateImpl(POOL_CONFIGURATOR, newPoolConfiguratorImpl); - emit PoolConfiguratorUpdated(oldPoolConfiguratorImpl, newPoolConfiguratorImpl); - } - - /// @inheritdoc IPoolAddressesProvider - function getPriceOracle() external view override returns (address) { - return getAddress(PRICE_ORACLE); - } - - /// @inheritdoc IPoolAddressesProvider - function setPriceOracle(address newPriceOracle) external override onlyOwner { - address oldPriceOracle = _addresses[PRICE_ORACLE]; - _addresses[PRICE_ORACLE] = newPriceOracle; - emit PriceOracleUpdated(oldPriceOracle, newPriceOracle); - } - - /// @inheritdoc IPoolAddressesProvider - function getACLManager() external view override returns (address) { - return getAddress(ACL_MANAGER); - } - - /// @inheritdoc IPoolAddressesProvider - function setACLManager(address newAclManager) external override onlyOwner { - address oldAclManager = _addresses[ACL_MANAGER]; - _addresses[ACL_MANAGER] = newAclManager; - emit ACLManagerUpdated(oldAclManager, newAclManager); - } - - /// @inheritdoc IPoolAddressesProvider - function getACLAdmin() external view override returns (address) { - return getAddress(ACL_ADMIN); - } - - /// @inheritdoc IPoolAddressesProvider - function setACLAdmin(address newAclAdmin) external override onlyOwner { - address oldAclAdmin = _addresses[ACL_ADMIN]; - _addresses[ACL_ADMIN] = newAclAdmin; - emit ACLAdminUpdated(oldAclAdmin, newAclAdmin); - } - - /// @inheritdoc IPoolAddressesProvider - function getPriceOracleSentinel() external view override returns (address) { - return getAddress(PRICE_ORACLE_SENTINEL); - } - - /// @inheritdoc IPoolAddressesProvider - function setPriceOracleSentinel(address newPriceOracleSentinel) external override onlyOwner { - address oldPriceOracleSentinel = _addresses[PRICE_ORACLE_SENTINEL]; - _addresses[PRICE_ORACLE_SENTINEL] = newPriceOracleSentinel; - emit PriceOracleSentinelUpdated(oldPriceOracleSentinel, newPriceOracleSentinel); - } - - /// @inheritdoc IPoolAddressesProvider - function getPoolDataProvider() external view override returns (address) { - return getAddress(DATA_PROVIDER); - } - - /// @inheritdoc IPoolAddressesProvider - function setPoolDataProvider(address newDataProvider) external override onlyOwner { - address oldDataProvider = _addresses[DATA_PROVIDER]; - _addresses[DATA_PROVIDER] = newDataProvider; - emit PoolDataProviderUpdated(oldDataProvider, newDataProvider); - } - - /** - * @notice Internal function to update the implementation of a specific proxied component of the protocol. - * @dev If there is no proxy registered with the given identifier, it creates the proxy setting `newAddress` - * as implementation and calls the initialize() function on the proxy - * @dev If there is already a proxy registered, it just updates the implementation to `newAddress` and - * calls the initialize() function via upgradeToAndCall() in the proxy - * @param id The id of the proxy to be updated - * @param newAddress The address of the new implementation - **/ - function _updateImpl(bytes32 id, address newAddress) internal { - address proxyAddress = _addresses[id]; - InitializableImmutableAdminUpgradeabilityProxy proxy; - bytes memory params = abi.encodeWithSignature('initialize(address)', address(this)); - - if (proxyAddress == address(0)) { - proxy = new InitializableImmutableAdminUpgradeabilityProxy(address(this)); - _addresses[id] = proxyAddress = address(proxy); - proxy.initialize(newAddress, params); - emit ProxyCreated(id, proxyAddress, newAddress); - } else { - proxy = InitializableImmutableAdminUpgradeabilityProxy(payable(proxyAddress)); - proxy.upgradeToAndCall(newAddress, params); - } - } - - /** - * @notice Updates the identifier of the Aave market. - * @param newMarketId The new id of the market - **/ - function _setMarketId(string memory newMarketId) internal { - string memory oldMarketId = _marketId; - _marketId = newMarketId; - emit MarketIdSet(oldMarketId, newMarketId); - } - - /** - * @notice Returns the the implementation contract of the proxy contract by its identifier. - * @dev It returns ZERO if there is no registered address with the given id - * @dev It reverts if the registered address with the given id is not `InitializableImmutableAdminUpgradeabilityProxy` - * @param id The id - * @return The address of the implementation contract - */ - function _getProxyImplementation(bytes32 id) internal returns (address) { - address proxyAddress = _addresses[id]; - if (proxyAddress == address(0)) { - return address(0); - } else { - address payable payableProxyAddress = payable(proxyAddress); - return InitializableImmutableAdminUpgradeabilityProxy(payableProxyAddress).implementation(); - } - } -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index c6dcfda7..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // According to EIP-1052, 0x0 is the value returned for not-yet created accounts - // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned - // for accounts without code, i.e. `keccak256('')` - bytes32 codehash; - bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; - // solhint-disable-next-line no-inline-assembly - assembly { - codehash := extcodehash(account) - } - return (codehash != accountHash && codehash != 0x0); - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - // solhint-disable-next-line avoid-low-level-calls, avoid-call-value - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 445ee640..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol deleted file mode 100644 index 020feeca..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.10; - -import './Context.sol'; - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol deleted file mode 100644 index bf52cd59..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import './Proxy.sol'; -import '../contracts/Address.sol'; - -/** - * @title BaseUpgradeabilityProxy - * @dev This contract implements a proxy that allows to change the - * implementation address to which it will delegate. - * Such a change is called an implementation upgrade. - */ -contract BaseUpgradeabilityProxy is Proxy { - /** - * @dev Emitted when the implementation is upgraded. - * @param implementation Address of the new implementation. - */ - event Upgraded(address indexed implementation); - - /** - * @dev Storage slot with the address of the current implementation. - * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant IMPLEMENTATION_SLOT = - 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /** - * @dev Returns the current implementation. - * @return impl Address of the current implementation - */ - function _implementation() internal view override returns (address impl) { - bytes32 slot = IMPLEMENTATION_SLOT; - //solium-disable-next-line - assembly { - impl := sload(slot) - } - } - - /** - * @dev Upgrades the proxy to a new implementation. - * @param newImplementation Address of the new implementation. - */ - function _upgradeTo(address newImplementation) internal { - _setImplementation(newImplementation); - emit Upgraded(newImplementation); - } - - /** - * @dev Sets the implementation address of the proxy. - * @param newImplementation Address of the new implementation. - */ - function _setImplementation(address newImplementation) internal { - require( - Address.isContract(newImplementation), - 'Cannot set a proxy implementation to a non-contract address' - ); - - bytes32 slot = IMPLEMENTATION_SLOT; - - //solium-disable-next-line - assembly { - sstore(slot, newImplementation) - } - } -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol deleted file mode 100644 index 5ecec083..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import './BaseUpgradeabilityProxy.sol'; - -/** - * @title InitializableUpgradeabilityProxy - * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing - * implementation and init data. - */ -contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { - /** - * @dev Contract initializer. - * @param _logic Address of the initial implementation. - * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. - */ - function initialize(address _logic, bytes memory _data) public payable { - require(_implementation() == address(0)); - assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); - _setImplementation(_logic); - if (_data.length > 0) { - (bool success, ) = _logic.delegatecall(_data); - require(success); - } - } -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol deleted file mode 100644 index 44b790da..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -/** - * @title Proxy - * @dev Implements delegation of calls to other contracts, with proper - * forwarding of return values and bubbling of failures. - * It defines a fallback function that delegates all calls to the address - * returned by the abstract _implementation() internal function. - */ -abstract contract Proxy { - /** - * @dev Fallback function. - * Will run if no other function in the contract matches the call data. - * Implemented entirely in `_fallback`. - */ - fallback() external payable { - _fallback(); - } - - /** - * @return The Address of the implementation. - */ - function _implementation() internal view virtual returns (address); - - /** - * @dev Delegates execution to an implementation contract. - * This is a low level function that doesn't return to its internal call site. - * It will return to the external caller whatever the implementation returns. - * @param implementation Address to delegate. - */ - function _delegate(address implementation) internal { - //solium-disable-next-line - assembly { - // Copy msg.data. We take full control of memory in this inline assembly - // block because it will not return to Solidity code. We overwrite the - // Solidity scratch pad at memory position 0. - calldatacopy(0, 0, calldatasize()) - - // Call the implementation. - // out and outsize are 0 because we don't know the size yet. - let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) - - // Copy the returned data. - returndatacopy(0, 0, returndatasize()) - - switch result - // delegatecall returns 0 on error. - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } - } - } - - /** - * @dev Function that is run as the first thing in the fallback function. - * Can be redefined in derived contracts to add functionality. - * Redefinitions must call super._willFallback(). - */ - function _willFallback() internal virtual {} - - /** - * @dev fallback implementation. - * Extracted to enable manual triggering. - */ - function _fallback() internal { - _willFallback(); - _delegate(_implementation()); - } -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index 01a126bd..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - **/ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - **/ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - **/ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - **/ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - **/ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - **/ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - **/ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - **/ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - **/ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol deleted file mode 100644 index 073e92f3..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProvider.sol +++ /dev/null @@ -1,210 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {Ownable} from '../../dependencies/openzeppelin/contracts/Ownable.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {InitializableImmutableAdminUpgradeabilityProxy} from '../libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; - -/** - * @title PoolAddressesProvider - * @author Aave - * @notice Main registry of addresses part of or connected to the protocol, including permissioned roles - * @dev Acts as factory of proxies and admin of those, so with right to change its implementations - * @dev Owned by the Aave Governance - **/ -contract PoolAddressesProvider is Ownable, IPoolAddressesProvider { - // Identifier of the Aave Market - string private _marketId; - - // Map of registered addresses (identifier => registeredAddress) - mapping(bytes32 => address) private _addresses; - - // Main identifiers - bytes32 private constant POOL = 'POOL'; - bytes32 private constant POOL_CONFIGURATOR = 'POOL_CONFIGURATOR'; - bytes32 private constant PRICE_ORACLE = 'PRICE_ORACLE'; - bytes32 private constant ACL_MANAGER = 'ACL_MANAGER'; - bytes32 private constant ACL_ADMIN = 'ACL_ADMIN'; - bytes32 private constant PRICE_ORACLE_SENTINEL = 'PRICE_ORACLE_SENTINEL'; - bytes32 private constant DATA_PROVIDER = 'DATA_PROVIDER'; - - /** - * @dev Constructor. - * @param marketId The identifier of the market. - * @param owner The owner address of this contract. - */ - constructor(string memory marketId, address owner) { - _setMarketId(marketId); - transferOwnership(owner); - } - - /// @inheritdoc IPoolAddressesProvider - function getMarketId() external view override returns (string memory) { - return _marketId; - } - - /// @inheritdoc IPoolAddressesProvider - function setMarketId(string memory newMarketId) external override onlyOwner { - _setMarketId(newMarketId); - } - - /// @inheritdoc IPoolAddressesProvider - function getAddress(bytes32 id) public view override returns (address) { - return _addresses[id]; - } - - /// @inheritdoc IPoolAddressesProvider - function setAddress(bytes32 id, address newAddress) external override onlyOwner { - address oldAddress = _addresses[id]; - _addresses[id] = newAddress; - emit AddressSet(id, oldAddress, newAddress); - } - - /// @inheritdoc IPoolAddressesProvider - function setAddressAsProxy(bytes32 id, address newImplementationAddress) - external - override - onlyOwner - { - address proxyAddress = _addresses[id]; - address oldImplementationAddress = _getProxyImplementation(id); - _updateImpl(id, newImplementationAddress); - emit AddressSetAsProxy(id, proxyAddress, oldImplementationAddress, newImplementationAddress); - } - - /// @inheritdoc IPoolAddressesProvider - function getPool() external view override returns (address) { - return getAddress(POOL); - } - - /// @inheritdoc IPoolAddressesProvider - function setPoolImpl(address newPoolImpl) external override onlyOwner { - address oldPoolImpl = _getProxyImplementation(POOL); - _updateImpl(POOL, newPoolImpl); - emit PoolUpdated(oldPoolImpl, newPoolImpl); - } - - /// @inheritdoc IPoolAddressesProvider - function getPoolConfigurator() external view override returns (address) { - return getAddress(POOL_CONFIGURATOR); - } - - /// @inheritdoc IPoolAddressesProvider - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external override onlyOwner { - address oldPoolConfiguratorImpl = _getProxyImplementation(POOL_CONFIGURATOR); - _updateImpl(POOL_CONFIGURATOR, newPoolConfiguratorImpl); - emit PoolConfiguratorUpdated(oldPoolConfiguratorImpl, newPoolConfiguratorImpl); - } - - /// @inheritdoc IPoolAddressesProvider - function getPriceOracle() external view override returns (address) { - return getAddress(PRICE_ORACLE); - } - - /// @inheritdoc IPoolAddressesProvider - function setPriceOracle(address newPriceOracle) external override onlyOwner { - address oldPriceOracle = _addresses[PRICE_ORACLE]; - _addresses[PRICE_ORACLE] = newPriceOracle; - emit PriceOracleUpdated(oldPriceOracle, newPriceOracle); - } - - /// @inheritdoc IPoolAddressesProvider - function getACLManager() external view override returns (address) { - return getAddress(ACL_MANAGER); - } - - /// @inheritdoc IPoolAddressesProvider - function setACLManager(address newAclManager) external override onlyOwner { - address oldAclManager = _addresses[ACL_MANAGER]; - _addresses[ACL_MANAGER] = newAclManager; - emit ACLManagerUpdated(oldAclManager, newAclManager); - } - - /// @inheritdoc IPoolAddressesProvider - function getACLAdmin() external view override returns (address) { - return getAddress(ACL_ADMIN); - } - - /// @inheritdoc IPoolAddressesProvider - function setACLAdmin(address newAclAdmin) external override onlyOwner { - address oldAclAdmin = _addresses[ACL_ADMIN]; - _addresses[ACL_ADMIN] = newAclAdmin; - emit ACLAdminUpdated(oldAclAdmin, newAclAdmin); - } - - /// @inheritdoc IPoolAddressesProvider - function getPriceOracleSentinel() external view override returns (address) { - return getAddress(PRICE_ORACLE_SENTINEL); - } - - /// @inheritdoc IPoolAddressesProvider - function setPriceOracleSentinel(address newPriceOracleSentinel) external override onlyOwner { - address oldPriceOracleSentinel = _addresses[PRICE_ORACLE_SENTINEL]; - _addresses[PRICE_ORACLE_SENTINEL] = newPriceOracleSentinel; - emit PriceOracleSentinelUpdated(oldPriceOracleSentinel, newPriceOracleSentinel); - } - - /// @inheritdoc IPoolAddressesProvider - function getPoolDataProvider() external view override returns (address) { - return getAddress(DATA_PROVIDER); - } - - /// @inheritdoc IPoolAddressesProvider - function setPoolDataProvider(address newDataProvider) external override onlyOwner { - address oldDataProvider = _addresses[DATA_PROVIDER]; - _addresses[DATA_PROVIDER] = newDataProvider; - emit PoolDataProviderUpdated(oldDataProvider, newDataProvider); - } - - /** - * @notice Internal function to update the implementation of a specific proxied component of the protocol. - * @dev If there is no proxy registered with the given identifier, it creates the proxy setting `newAddress` - * as implementation and calls the initialize() function on the proxy - * @dev If there is already a proxy registered, it just updates the implementation to `newAddress` and - * calls the initialize() function via upgradeToAndCall() in the proxy - * @param id The id of the proxy to be updated - * @param newAddress The address of the new implementation - **/ - function _updateImpl(bytes32 id, address newAddress) internal { - address proxyAddress = _addresses[id]; - InitializableImmutableAdminUpgradeabilityProxy proxy; - bytes memory params = abi.encodeWithSignature('initialize(address)', address(this)); - - if (proxyAddress == address(0)) { - proxy = new InitializableImmutableAdminUpgradeabilityProxy(address(this)); - _addresses[id] = proxyAddress = address(proxy); - proxy.initialize(newAddress, params); - emit ProxyCreated(id, proxyAddress, newAddress); - } else { - proxy = InitializableImmutableAdminUpgradeabilityProxy(payable(proxyAddress)); - proxy.upgradeToAndCall(newAddress, params); - } - } - - /** - * @notice Updates the identifier of the Aave market. - * @param newMarketId The new id of the market - **/ - function _setMarketId(string memory newMarketId) internal { - string memory oldMarketId = _marketId; - _marketId = newMarketId; - emit MarketIdSet(oldMarketId, newMarketId); - } - - /** - * @notice Returns the the implementation contract of the proxy contract by its identifier. - * @dev It returns ZERO if there is no registered address with the given id - * @dev It reverts if the registered address with the given id is not `InitializableImmutableAdminUpgradeabilityProxy` - * @param id The id - * @return The address of the implementation contract - */ - function _getProxyImplementation(bytes32 id) internal returns (address) { - address proxyAddress = _addresses[id]; - if (proxyAddress == address(0)) { - return address(0); - } else { - address payable payableProxyAddress = payable(proxyAddress); - return InitializableImmutableAdminUpgradeabilityProxy(payableProxyAddress).implementation(); - } - } -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol deleted file mode 100644 index 87550c2e..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,86 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {BaseUpgradeabilityProxy} from '../../../dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol'; - -/** - * @title BaseImmutableAdminUpgradeabilityProxy - * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern - * @notice This contract combines an upgradeability proxy with an authorization - * mechanism for administrative tasks. - * @dev The admin role is stored in an immutable, which helps saving transactions costs - * All external functions in this contract must be guarded by the - * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity - * feature proposal that would enable this to be done automatically. - */ -contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - address internal immutable _admin; - - /** - * @dev Constructor. - * @param admin The address of the admin - */ - constructor(address admin) { - _admin = admin; - } - - modifier ifAdmin() { - if (msg.sender == _admin) { - _; - } else { - _fallback(); - } - } - - /** - * @notice Return the admin address - * @return The address of the proxy admin. - */ - function admin() external ifAdmin returns (address) { - return _admin; - } - - /** - * @notice Return the implementation address - * @return The address of the implementation. - */ - function implementation() external ifAdmin returns (address) { - return _implementation(); - } - - /** - * @notice Upgrade the backing implementation of the proxy. - * @dev Only the admin can call this function. - * @param newImplementation The address of the new implementation. - */ - function upgradeTo(address newImplementation) external ifAdmin { - _upgradeTo(newImplementation); - } - - /** - * @notice Upgrade the backing implementation of the proxy and call a function - * on the new implementation. - * @dev This is useful to initialize the proxied contract. - * @param newImplementation The address of the new implementation. - * @param data Data to send as msg.data in the low level call. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - */ - function upgradeToAndCall(address newImplementation, bytes calldata data) - external - payable - ifAdmin - { - _upgradeTo(newImplementation); - (bool success, ) = newImplementation.delegatecall(data); - require(success); - } - - /** - * @notice Only fall back when the sender is not the admin. - */ - function _willFallback() internal virtual override { - require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); - super._willFallback(); - } -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol deleted file mode 100644 index 655e5f9e..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {InitializableUpgradeabilityProxy} from '../../../dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol'; -import {Proxy} from '../../../dependencies/openzeppelin/upgradeability/Proxy.sol'; -import {BaseImmutableAdminUpgradeabilityProxy} from './BaseImmutableAdminUpgradeabilityProxy.sol'; - -/** - * @title InitializableAdminUpgradeabilityProxy - * @author Aave - * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function - */ -contract InitializableImmutableAdminUpgradeabilityProxy is - BaseImmutableAdminUpgradeabilityProxy, - InitializableUpgradeabilityProxy -{ - /** - * @dev Constructor. - * @param admin The address of the admin - */ - constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { - // Intentionally left blank - } - - /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy - function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { - BaseImmutableAdminUpgradeabilityProxy._willFallback(); - } -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY.sol deleted file mode 100644 index b396e1f7..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY.sol +++ /dev/null @@ -1,349 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity =0.8.10; - -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol - -/** - * @title IPoolAddressesProviderRegistry - * @author Aave - * @notice Defines the basic interface for an Aave Pool Addresses Provider Registry. - **/ -interface IPoolAddressesProviderRegistry { - /** - * @dev Emitted when a new AddressesProvider is registered. - * @param addressesProvider The address of the registered PoolAddressesProvider - * @param id The id of the registered PoolAddressesProvider - */ - event AddressesProviderRegistered(address indexed addressesProvider, uint256 indexed id); - - /** - * @dev Emitted when an AddressesProvider is unregistered. - * @param addressesProvider The address of the unregistered PoolAddressesProvider - * @param id The id of the unregistered PoolAddressesProvider - */ - event AddressesProviderUnregistered(address indexed addressesProvider, uint256 indexed id); - - /** - * @notice Returns the list of registered addresses providers - * @return The list of addresses providers - **/ - function getAddressesProvidersList() external view returns (address[] memory); - - /** - * @notice Returns the id of a registered PoolAddressesProvider - * @param addressesProvider The address of the PoolAddressesProvider - * @return The id of the PoolAddressesProvider or 0 if is not registered - */ - function getAddressesProviderIdByAddress( - address addressesProvider - ) external view returns (uint256); - - /** - * @notice Returns the address of a registered PoolAddressesProvider - * @param id The id of the market - * @return The address of the PoolAddressesProvider with the given id or zero address if it is not registered - */ - function getAddressesProviderAddressById(uint256 id) external view returns (address); - - /** - * @notice Registers an addresses provider - * @dev The PoolAddressesProvider must not already be registered in the registry - * @dev The id must not be used by an already registered PoolAddressesProvider - * @param provider The address of the new PoolAddressesProvider - * @param id The id for the new PoolAddressesProvider, referring to the market it belongs to - **/ - function registerAddressesProvider(address provider, uint256 id) external; - - /** - * @notice Removes an addresses provider from the list of registered addresses providers - * @param provider The PoolAddressesProvider address - **/ - function unregisterAddressesProvider(address provider) external; -} - -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' - string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 -} - -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} - -// downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol - -/** - * @title PoolAddressesProviderRegistry - * @author Aave - * @notice Main registry of PoolAddressesProvider of Aave markets. - * @dev Used for indexing purposes of Aave protocol's markets. The id assigned to a PoolAddressesProvider refers to the - * market it is connected with, for example with `1` for the Aave main market and `2` for the next created. - **/ -contract PoolAddressesProviderRegistry is Ownable, IPoolAddressesProviderRegistry { - // Map of address provider ids (addressesProvider => id) - mapping(address => uint256) private _addressesProviderToId; - // Map of id to address provider (id => addressesProvider) - mapping(uint256 => address) private _idToAddressesProvider; - // List of addresses providers - address[] private _addressesProvidersList; - // Map of address provider list indexes (addressesProvider => indexInList) - mapping(address => uint256) private _addressesProvidersIndexes; - - /** - * @dev Constructor. - * @param owner The owner address of this contract. - */ - constructor(address owner) { - transferOwnership(owner); - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function getAddressesProvidersList() external view override returns (address[] memory) { - return _addressesProvidersList; - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function registerAddressesProvider(address provider, uint256 id) external override onlyOwner { - require(id != 0, Errors.INVALID_ADDRESSES_PROVIDER_ID); - require(_idToAddressesProvider[id] == address(0), Errors.INVALID_ADDRESSES_PROVIDER_ID); - require(_addressesProviderToId[provider] == 0, Errors.ADDRESSES_PROVIDER_ALREADY_ADDED); - - _addressesProviderToId[provider] = id; - _idToAddressesProvider[id] = provider; - - _addToAddressesProvidersList(provider); - emit AddressesProviderRegistered(provider, id); - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function unregisterAddressesProvider(address provider) external override onlyOwner { - require(_addressesProviderToId[provider] != 0, Errors.ADDRESSES_PROVIDER_NOT_REGISTERED); - uint256 oldId = _addressesProviderToId[provider]; - _idToAddressesProvider[oldId] = address(0); - _addressesProviderToId[provider] = 0; - - _removeFromAddressesProvidersList(provider); - - emit AddressesProviderUnregistered(provider, oldId); - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function getAddressesProviderIdByAddress( - address addressesProvider - ) external view override returns (uint256) { - return _addressesProviderToId[addressesProvider]; - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function getAddressesProviderAddressById(uint256 id) external view override returns (address) { - return _idToAddressesProvider[id]; - } - - /** - * @notice Adds the addresses provider address to the list. - * @param provider The address of the PoolAddressesProvider - */ - function _addToAddressesProvidersList(address provider) internal { - _addressesProvidersIndexes[provider] = _addressesProvidersList.length; - _addressesProvidersList.push(provider); - } - - /** - * @notice Removes the addresses provider address from the list. - * @param provider The address of the PoolAddressesProvider - */ - function _removeFromAddressesProvidersList(address provider) internal { - uint256 index = _addressesProvidersIndexes[provider]; - - _addressesProvidersIndexes[provider] = 0; - - // Swap the index of the last addresses provider in the list with the index of the provider to remove - uint256 lastIndex = _addressesProvidersList.length - 1; - if (index < lastIndex) { - address lastProvider = _addressesProvidersList[lastIndex]; - _addressesProvidersList[index] = lastProvider; - _addressesProvidersIndexes[lastProvider] = index; - } - _addressesProvidersList.pop(); - } -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 445ee640..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol deleted file mode 100644 index 020feeca..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.10; - -import './Context.sol'; - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol deleted file mode 100644 index a48ff207..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/interfaces/IPoolAddressesProviderRegistry.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title IPoolAddressesProviderRegistry - * @author Aave - * @notice Defines the basic interface for an Aave Pool Addresses Provider Registry. - **/ -interface IPoolAddressesProviderRegistry { - /** - * @dev Emitted when a new AddressesProvider is registered. - * @param addressesProvider The address of the registered PoolAddressesProvider - * @param id The id of the registered PoolAddressesProvider - */ - event AddressesProviderRegistered(address indexed addressesProvider, uint256 indexed id); - - /** - * @dev Emitted when an AddressesProvider is unregistered. - * @param addressesProvider The address of the unregistered PoolAddressesProvider - * @param id The id of the unregistered PoolAddressesProvider - */ - event AddressesProviderUnregistered(address indexed addressesProvider, uint256 indexed id); - - /** - * @notice Returns the list of registered addresses providers - * @return The list of addresses providers - **/ - function getAddressesProvidersList() external view returns (address[] memory); - - /** - * @notice Returns the id of a registered PoolAddressesProvider - * @param addressesProvider The address of the PoolAddressesProvider - * @return The id of the PoolAddressesProvider or 0 if is not registered - */ - function getAddressesProviderIdByAddress(address addressesProvider) - external - view - returns (uint256); - - /** - * @notice Returns the address of a registered PoolAddressesProvider - * @param id The id of the market - * @return The address of the PoolAddressesProvider with the given id or zero address if it is not registered - */ - function getAddressesProviderAddressById(uint256 id) external view returns (address); - - /** - * @notice Registers an addresses provider - * @dev The PoolAddressesProvider must not already be registered in the registry - * @dev The id must not be used by an already registered PoolAddressesProvider - * @param provider The address of the new PoolAddressesProvider - * @param id The id for the new PoolAddressesProvider, referring to the market it belongs to - **/ - function registerAddressesProvider(address provider, uint256 id) external; - - /** - * @notice Removes an addresses provider from the list of registered addresses providers - * @param provider The PoolAddressesProvider address - **/ - function unregisterAddressesProvider(address provider) external; -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol deleted file mode 100644 index f5cb3d37..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol +++ /dev/null @@ -1,105 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {Ownable} from '../../dependencies/openzeppelin/contracts/Ownable.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; -import {IPoolAddressesProviderRegistry} from '../../interfaces/IPoolAddressesProviderRegistry.sol'; - -/** - * @title PoolAddressesProviderRegistry - * @author Aave - * @notice Main registry of PoolAddressesProvider of Aave markets. - * @dev Used for indexing purposes of Aave protocol's markets. The id assigned to a PoolAddressesProvider refers to the - * market it is connected with, for example with `1` for the Aave main market and `2` for the next created. - **/ -contract PoolAddressesProviderRegistry is Ownable, IPoolAddressesProviderRegistry { - // Map of address provider ids (addressesProvider => id) - mapping(address => uint256) private _addressesProviderToId; - // Map of id to address provider (id => addressesProvider) - mapping(uint256 => address) private _idToAddressesProvider; - // List of addresses providers - address[] private _addressesProvidersList; - // Map of address provider list indexes (addressesProvider => indexInList) - mapping(address => uint256) private _addressesProvidersIndexes; - - /** - * @dev Constructor. - * @param owner The owner address of this contract. - */ - constructor(address owner) { - transferOwnership(owner); - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function getAddressesProvidersList() external view override returns (address[] memory) { - return _addressesProvidersList; - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function registerAddressesProvider(address provider, uint256 id) external override onlyOwner { - require(id != 0, Errors.INVALID_ADDRESSES_PROVIDER_ID); - require(_idToAddressesProvider[id] == address(0), Errors.INVALID_ADDRESSES_PROVIDER_ID); - require(_addressesProviderToId[provider] == 0, Errors.ADDRESSES_PROVIDER_ALREADY_ADDED); - - _addressesProviderToId[provider] = id; - _idToAddressesProvider[id] = provider; - - _addToAddressesProvidersList(provider); - emit AddressesProviderRegistered(provider, id); - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function unregisterAddressesProvider(address provider) external override onlyOwner { - require(_addressesProviderToId[provider] != 0, Errors.ADDRESSES_PROVIDER_NOT_REGISTERED); - uint256 oldId = _addressesProviderToId[provider]; - _idToAddressesProvider[oldId] = address(0); - _addressesProviderToId[provider] = 0; - - _removeFromAddressesProvidersList(provider); - - emit AddressesProviderUnregistered(provider, oldId); - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function getAddressesProviderIdByAddress(address addressesProvider) - external - view - override - returns (uint256) - { - return _addressesProviderToId[addressesProvider]; - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function getAddressesProviderAddressById(uint256 id) external view override returns (address) { - return _idToAddressesProvider[id]; - } - - /** - * @notice Adds the addresses provider address to the list. - * @param provider The address of the PoolAddressesProvider - */ - function _addToAddressesProvidersList(address provider) internal { - _addressesProvidersIndexes[provider] = _addressesProvidersList.length; - _addressesProvidersList.push(provider); - } - - /** - * @notice Removes the addresses provider address from the list. - * @param provider The address of the PoolAddressesProvider - */ - function _removeFromAddressesProvidersList(address provider) internal { - uint256 index = _addressesProvidersIndexes[provider]; - - _addressesProvidersIndexes[provider] = 0; - - // Swap the index of the last addresses provider in the list with the index of the provider to remove - uint256 lastIndex = _addressesProvidersList.length - 1; - if (index < lastIndex) { - address lastProvider = _addressesProvidersList[lastIndex]; - _addressesProvidersList[index] = lastProvider; - _addressesProvidersIndexes[lastProvider] = index; - } - _addressesProvidersList.pop(); - } -} diff --git a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index 640e4632..00000000 --- a/downloads/ARBITRUM/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' - string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL.sol deleted file mode 100644 index 09a7d9d6..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL.sol +++ /dev/null @@ -1,4995 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol - -/** - * @title Proxy - * @dev Implements delegation of calls to other contracts, with proper - * forwarding of return values and bubbling of failures. - * It defines a fallback function that delegates all calls to the address - * returned by the abstract _implementation() internal function. - */ -abstract contract Proxy { - /** - * @dev Fallback function. - * Will run if no other function in the contract matches the call data. - * Implemented entirely in `_fallback`. - */ - fallback() external payable { - _fallback(); - } - - /** - * @dev Fallback function that will run if call data is empty. - * IMPORTANT. receive() on implementation contracts will be unreachable - */ - receive() external payable { - _fallback(); - } - - /** - * @return The Address of the implementation. - */ - function _implementation() internal view virtual returns (address); - - /** - * @dev Delegates execution to an implementation contract. - * This is a low level function that doesn't return to its internal call site. - * It will return to the external caller whatever the implementation returns. - * @param implementation Address to delegate. - */ - function _delegate(address implementation) internal { - //solium-disable-next-line - assembly { - // Copy msg.data. We take full control of memory in this inline assembly - // block because it will not return to Solidity code. We overwrite the - // Solidity scratch pad at memory position 0. - calldatacopy(0, 0, calldatasize()) - - // Call the implementation. - // out and outsize are 0 because we don't know the size yet. - let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) - - // Copy the returned data. - returndatacopy(0, 0, returndatasize()) - - switch result - // delegatecall returns 0 on error. - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } - } - } - - /** - * @dev Function that is run as the first thing in the fallback function. - * Can be redefined in derived contracts to add functionality. - * Redefinitions must call super._willFallback(). - */ - function _willFallback() internal virtual {} - - /** - * @dev fallback implementation. - * Extracted to enable manual triggering. - */ - function _fallback() internal { - _willFallback(); - _delegate(_implementation()); - } -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol - -library ConfiguratorInputTypes { - struct InitReserveInput { - address aTokenImpl; - address variableDebtTokenImpl; - bool useVirtualBalance; - address interestRateStrategyAddress; - address underlyingAsset; - address treasury; - address incentivesController; - string aTokenName; - string aTokenSymbol; - string variableDebtTokenName; - string variableDebtTokenSymbol; - bytes params; - bytes interestRateData; - } - - struct UpdateATokenInput { - address asset; - address treasury; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } - - struct UpdateDebtTokenInput { - address asset; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol - -/** - * @title IPoolDataProvider - * @author Aave - * @notice Defines the basic interface of a PoolDataProvider - */ -interface IPoolDataProvider { - struct TokenData { - string symbol; - address tokenAddress; - } - - /** - * @notice Returns the address for the PoolAddressesProvider contract. - * @return The address for the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the list of the existing reserves in the pool. - * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. - * @return The list of reserves, pairs of symbols and addresses - */ - function getAllReservesTokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the list of the existing ATokens in the pool. - * @return The list of ATokens, pairs of symbols and addresses - */ - function getAllATokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the configuration data of the reserve - * @dev Not returning borrow and supply caps for compatibility, nor pause flag - * @param asset The address of the underlying asset of the reserve - * @return decimals The number of decimals of the reserve - * @return ltv The ltv of the reserve - * @return liquidationThreshold The liquidationThreshold of the reserve - * @return liquidationBonus The liquidationBonus of the reserve - * @return reserveFactor The reserveFactor of the reserve - * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise - * @return borrowingEnabled True if borrowing is enabled, false otherwise - * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise - * @return isActive True if it is active, false otherwise - * @return isFrozen True if it is frozen, false otherwise - */ - function getReserveConfigurationData( - address asset - ) - external - view - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ); - - /** - * @notice Returns the caps parameters of the reserve - * @param asset The address of the underlying asset of the reserve - * @return borrowCap The borrow cap of the reserve - * @return supplyCap The supply cap of the reserve - */ - function getReserveCaps( - address asset - ) external view returns (uint256 borrowCap, uint256 supplyCap); - - /** - * @notice Returns if the pool is paused - * @param asset The address of the underlying asset of the reserve - * @return isPaused True if the pool is paused, false otherwise - */ - function getPaused(address asset) external view returns (bool isPaused); - - /** - * @notice Returns the siloed borrowing flag - * @param asset The address of the underlying asset of the reserve - * @return True if the asset is siloed for borrowing - */ - function getSiloedBorrowing(address asset) external view returns (bool); - - /** - * @notice Returns the protocol fee on the liquidation bonus - * @param asset The address of the underlying asset of the reserve - * @return The protocol fee on liquidation - */ - function getLiquidationProtocolFee(address asset) external view returns (uint256); - - /** - * @notice Returns the unbacked mint cap of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The unbacked mint cap of the reserve - */ - function getUnbackedMintCap(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The debt ceiling of the reserve - */ - function getDebtCeiling(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling decimals - * @return The debt ceiling decimals - */ - function getDebtCeilingDecimals() external pure returns (uint256); - - /** - * @notice Returns the reserve data - * @param asset The address of the underlying asset of the reserve - * @return unbacked The amount of unbacked tokens - * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted - * @return totalAToken The total supply of the aToken - * @return totalStableDebt The total stable debt of the reserve - * @return totalVariableDebt The total variable debt of the reserve - * @return liquidityRate The liquidity rate of the reserve - * @return variableBorrowRate The variable borrow rate of the reserve - * @return stableBorrowRate The stable borrow rate of the reserve - * @return averageStableBorrowRate The average stable borrow rate of the reserve - * @return liquidityIndex The liquidity index of the reserve - * @return variableBorrowIndex The variable borrow index of the reserve - * @return lastUpdateTimestamp The timestamp of the last update of the reserve - */ - function getReserveData( - address asset - ) - external - view - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ); - - /** - * @notice Returns the total supply of aTokens for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total supply of the aToken - */ - function getATokenTotalSupply(address asset) external view returns (uint256); - - /** - * @notice Returns the total debt for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total debt for asset - */ - function getTotalDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the user data in a reserve - * @param asset The address of the underlying asset of the reserve - * @param user The address of the user - * @return currentATokenBalance The current AToken balance of the user - * @return currentStableDebt The current stable debt of the user - * @return currentVariableDebt The current variable debt of the user - * @return principalStableDebt The principal stable debt of the user - * @return scaledVariableDebt The scaled variable debt of the user - * @return stableBorrowRate The stable borrow rate of the user - * @return liquidityRate The liquidity rate of the reserve - * @return stableRateLastUpdated The timestamp of the last update of the user stable rate - * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false - * otherwise - */ - function getUserReserveData( - address asset, - address user - ) - external - view - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ); - - /** - * @notice Returns the token addresses of the reserve - * @param asset The address of the underlying asset of the reserve - * @return aTokenAddress The AToken address of the reserve - * @return stableDebtTokenAddress DEPRECATED in v3.2.0 - * @return variableDebtTokenAddress The VariableDebtToken address of the reserve - */ - function getReserveTokensAddresses( - address asset - ) - external - view - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ); - - /** - * @notice Returns the address of the Interest Rate strategy - * @param asset The address of the underlying asset of the reserve - * @return irStrategyAddress The address of the Interest Rate strategy - */ - function getInterestRateStrategyAddress( - address asset - ) external view returns (address irStrategyAddress); - - /** - * @notice Returns whether the reserve has FlashLoans enabled or disabled - * @param asset The address of the underlying asset of the reserve - * @return True if FlashLoans are enabled, false otherwise - */ - function getFlashLoanEnabled(address asset) external view returns (bool); - - /** - * @notice Returns whether virtual accounting is enabled/not for a reserve - * @param asset The address of the underlying asset of the reserve - * @return True if active, false otherwise - */ - function getIsVirtualAccActive(address asset) external view returns (bool); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint256); -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol - -/** - * @title BaseUpgradeabilityProxy - * @dev This contract implements a proxy that allows to change the - * implementation address to which it will delegate. - * Such a change is called an implementation upgrade. - */ -contract BaseUpgradeabilityProxy is Proxy { - /** - * @dev Emitted when the implementation is upgraded. - * @param implementation Address of the new implementation. - */ - event Upgraded(address indexed implementation); - - /** - * @dev Storage slot with the address of the current implementation. - * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant IMPLEMENTATION_SLOT = - 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /** - * @dev Returns the current implementation. - * @return impl Address of the current implementation - */ - function _implementation() internal view override returns (address impl) { - bytes32 slot = IMPLEMENTATION_SLOT; - //solium-disable-next-line - assembly { - impl := sload(slot) - } - } - - /** - * @dev Upgrades the proxy to a new implementation. - * @param newImplementation Address of the new implementation. - */ - function _upgradeTo(address newImplementation) internal { - _setImplementation(newImplementation); - emit Upgraded(newImplementation); - } - - /** - * @dev Sets the implementation address of the proxy. - * @param newImplementation Address of the new implementation. - */ - function _setImplementation(address newImplementation) internal { - require( - Address.isContract(newImplementation), - 'Cannot set a proxy implementation to a non-contract address' - ); - - bytes32 slot = IMPLEMENTATION_SLOT; - - //solium-disable-next-line - assembly { - sstore(slot, newImplementation) - } - } -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol - -/** - * @title InitializableUpgradeabilityProxy - * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing - * implementation and init data. - */ -contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { - /** - * @dev Contract initializer. - * @param _logic Address of the initial implementation. - * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. - */ - function initialize(address _logic, bytes memory _data) public payable { - require(_implementation() == address(0)); - assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); - _setImplementation(_logic); - if (_data.length > 0) { - (bool success, ) = _logic.delegatecall(_data); - require(success); - } - } -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol - -/** - * @title IDefaultInterestRateStrategyV2 - * @author BGD Labs - * @notice Interface of the default interest rate strategy used by the Aave protocol - */ -interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { - /** - * @notice Holds the interest rate data for a given reserve - * - * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This - * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. - * - * @param optimalUsageRatio The optimal usage ratio, in bps - * @param baseVariableBorrowRate The base variable borrow rate, in bps - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps - */ - struct InterestRateData { - uint16 optimalUsageRatio; - uint32 baseVariableBorrowRate; - uint32 variableRateSlope1; - uint32 variableRateSlope2; - } - - /** - * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, - * used in in-memory calculations. - * - * @param optimalUsageRatio The optimal usage ratio - * @param baseVariableBorrowRate The base variable borrow rate - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio - */ - struct InterestRateDataRay { - uint256 optimalUsageRatio; - uint256 baseVariableBorrowRate; - uint256 variableRateSlope1; - uint256 variableRateSlope2; - } - - /** - * @notice emitted when new interest rate data is set in a reserve - * - * @param reserve address of the reserve that has new interest rate data set - * @param optimalUsageRatio The optimal usage ratio, in bps - * @param baseVariableBorrowRate The base variable borrow rate, in bps - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps - */ - event RateDataUpdate( - address indexed reserve, - uint256 optimalUsageRatio, - uint256 baseVariableBorrowRate, - uint256 variableRateSlope1, - uint256 variableRateSlope2 - ); - - /** - * @notice Returns the address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the maximum value achievable for variable borrow rate, in bps - * @return The maximum rate - */ - function MAX_BORROW_RATE() external view returns (uint256); - - /** - * @notice Returns the minimum optimal point, in bps - * @return The optimal point - */ - function MIN_OPTIMAL_POINT() external view returns (uint256); - - /** - * @notice Returns the maximum optimal point, in bps - * @return The optimal point - */ - function MAX_OPTIMAL_POINT() external view returns (uint256); - - /** - * notice Returns the full InterestRateData object for the given reserve, in ray - * - * @param reserve The reserve to get the data of - * - * @return The InterestRateDataRay object for the given reserve - */ - function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); - - /** - * notice Returns the full InterestRateDataRay object for the given reserve, in bps - * - * @param reserve The reserve to get the data of - * - * @return The InterestRateData object for the given reserve - */ - function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); - - /** - * @notice Returns the optimal usage rate for the given reserve in ray - * - * @param reserve The reserve to get the optimal usage rate of - * - * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate - */ - function getOptimalUsageRatio(address reserve) external view returns (uint256); - - /** - * @notice Returns the variable rate slope below optimal usage ratio in ray - * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO - * - * @param reserve The reserve to get the variable rate slope 1 of - * - * @return The variable rate slope - */ - function getVariableRateSlope1(address reserve) external view returns (uint256); - - /** - * @notice Returns the variable rate slope above optimal usage ratio in ray - * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO - * - * @param reserve The reserve to get the variable rate slope 2 of - * - * @return The variable rate slope - */ - function getVariableRateSlope2(address reserve) external view returns (uint256); - - /** - * @notice Returns the base variable borrow rate, in ray - * - * @param reserve The reserve to get the base variable borrow rate of - * - * @return The base variable borrow rate - */ - function getBaseVariableBorrowRate(address reserve) external view returns (uint256); - - /** - * @notice Returns the maximum variable borrow rate, in ray - * - * @param reserve The reserve to get the maximum variable borrow rate of - * - * @return The maximum variable borrow rate - */ - function getMaxVariableBorrowRate(address reserve) external view returns (uint256); - - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The reserve interest rate data to apply to the given reserve - * Being specific to this custom implementation, with custom struct type, - * overloading the function on the generic interface - */ - function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol - -/** - * @title BaseImmutableAdminUpgradeabilityProxy - * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern - * @notice This contract combines an upgradeability proxy with an authorization - * mechanism for administrative tasks. - * @dev The admin role is stored in an immutable, which helps saving transactions costs - * All external functions in this contract must be guarded by the - * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity - * feature proposal that would enable this to be done automatically. - */ -contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - address internal immutable _admin; - - /** - * @dev Constructor. - * @param admin_ The address of the admin - */ - constructor(address admin_) { - _admin = admin_; - } - - modifier ifAdmin() { - if (msg.sender == _admin) { - _; - } else { - _fallback(); - } - } - - /** - * @notice Return the admin address - * @return The address of the proxy admin. - */ - function admin() external ifAdmin returns (address) { - return _admin; - } - - /** - * @notice Return the implementation address - * @return The address of the implementation. - */ - function implementation() external ifAdmin returns (address) { - return _implementation(); - } - - /** - * @notice Upgrade the backing implementation of the proxy. - * @dev Only the admin can call this function. - * @param newImplementation The address of the new implementation. - */ - function upgradeTo(address newImplementation) external ifAdmin { - _upgradeTo(newImplementation); - } - - /** - * @notice Upgrade the backing implementation of the proxy and call a function - * on the new implementation. - * @dev This is useful to initialize the proxied contract. - * @param newImplementation The address of the new implementation. - * @param data Data to send as msg.data in the low level call. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - */ - function upgradeToAndCall( - address newImplementation, - bytes calldata data - ) external payable ifAdmin { - _upgradeTo(newImplementation); - (bool success, ) = newImplementation.delegatecall(data); - require(success); - } - - /** - * @notice Only fall back when the sender is not the admin. - */ - function _willFallback() internal virtual override { - require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); - super._willFallback(); - } -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolConfigurator.sol - -/** - * @title IPoolConfigurator - * @author Aave - * @notice Defines the basic interface for a Pool configurator. - */ -interface IPoolConfigurator { - /** - * @dev Emitted when a reserve is initialized. - * @param asset The address of the underlying asset of the reserve - * @param aToken The address of the associated aToken contract - * @param stableDebtToken, DEPRECATED in v3.2.0 - * @param variableDebtToken The address of the associated variable rate debt token - * @param interestRateStrategyAddress The address of the interest rate strategy for the reserve - */ - event ReserveInitialized( - address indexed asset, - address indexed aToken, - address stableDebtToken, - address variableDebtToken, - address interestRateStrategyAddress - ); - - /** - * @dev Emitted when borrowing is enabled or disabled on a reserve. - * @param asset The address of the underlying asset of the reserve - * @param enabled True if borrowing is enabled, false otherwise - */ - event ReserveBorrowing(address indexed asset, bool enabled); - - /** - * @dev Emitted when flashloans are enabled or disabled on a reserve. - * @param asset The address of the underlying asset of the reserve - * @param enabled True if flashloans are enabled, false otherwise - */ - event ReserveFlashLoaning(address indexed asset, bool enabled); - - /** - * @dev Emitted when the ltv is set for the frozen asset. - * @param asset The address of the underlying asset of the reserve - * @param ltv The loan to value of the asset when used as collateral - */ - event PendingLtvChanged(address indexed asset, uint256 ltv); - - /** - * @dev Emitted when the collateralization risk parameters for the specified asset are updated. - * @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 - */ - event CollateralConfigurationChanged( - address indexed asset, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus - ); - - /** - * @dev Emitted when a reserve is activated or deactivated - * @param asset The address of the underlying asset of the reserve - * @param active True if reserve is active, false otherwise - */ - event ReserveActive(address indexed asset, bool active); - - /** - * @dev Emitted when a reserve is frozen or unfrozen - * @param asset The address of the underlying asset of the reserve - * @param frozen True if reserve is frozen, false otherwise - */ - event ReserveFrozen(address indexed asset, bool frozen); - - /** - * @dev Emitted when a reserve is paused or unpaused - * @param asset The address of the underlying asset of the reserve - * @param paused True if reserve is paused, false otherwise - */ - event ReservePaused(address indexed asset, bool paused); - - /** - * @dev Emitted when a reserve is dropped. - * @param asset The address of the underlying asset of the reserve - */ - event ReserveDropped(address indexed asset); - - /** - * @dev Emitted when a reserve factor is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldReserveFactor The old reserve factor, expressed in bps - * @param newReserveFactor The new reserve factor, expressed in bps - */ - event ReserveFactorChanged( - address indexed asset, - uint256 oldReserveFactor, - uint256 newReserveFactor - ); - - /** - * @dev Emitted when the borrow cap of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldBorrowCap The old borrow cap - * @param newBorrowCap The new borrow cap - */ - event BorrowCapChanged(address indexed asset, uint256 oldBorrowCap, uint256 newBorrowCap); - - /** - * @dev Emitted when the supply cap of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldSupplyCap The old supply cap - * @param newSupplyCap The new supply cap - */ - event SupplyCapChanged(address indexed asset, uint256 oldSupplyCap, uint256 newSupplyCap); - - /** - * @dev Emitted when the liquidation protocol fee of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldFee The old liquidation protocol fee, expressed in bps - * @param newFee The new liquidation protocol fee, expressed in bps - */ - event LiquidationProtocolFeeChanged(address indexed asset, uint256 oldFee, uint256 newFee); - - /** - * @dev Emitted when the liquidation grace period is updated. - * @param asset The address of the underlying asset of the reserve - * @param gracePeriodUntil Timestamp until when liquidations will not be allowed post-unpause - */ - event LiquidationGracePeriodChanged(address indexed asset, uint40 gracePeriodUntil); - - /** - * @dev Emitted when the liquidation grace period is disabled. - * @param asset The address of the underlying asset of the reserve - */ - event LiquidationGracePeriodDisabled(address indexed asset); - - /** - * @dev Emitted when the unbacked mint cap of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldUnbackedMintCap The old unbacked mint cap - * @param newUnbackedMintCap The new unbacked mint cap - */ - event UnbackedMintCapChanged( - address indexed asset, - uint256 oldUnbackedMintCap, - uint256 newUnbackedMintCap - ); - - /** - * @dev Emitted when an collateral configuration of an asset in an eMode is changed. - * @param asset The address of the underlying asset of the reserve - * @param categoryId The eMode category - * @param collateral True if the asset is enabled as collateral in the eMode, false otherwise. - */ - event AssetCollateralInEModeChanged(address indexed asset, uint8 categoryId, bool collateral); - - /** - * @dev Emitted when the borrowable configuration of an asset in an eMode changed. - * @param asset The address of the underlying asset of the reserve - * @param categoryId The eMode category - * @param borrowable True if the asset is enabled as borrowable in the eMode, false otherwise. - */ - event AssetBorrowableInEModeChanged(address indexed asset, uint8 categoryId, bool borrowable); - - /** - * @dev Emitted when a new eMode category is added or an existing category is altered. - * @param categoryId The new eMode category id - * @param ltv The ltv for the asset category in eMode - * @param liquidationThreshold The liquidationThreshold for the asset category in eMode - * @param liquidationBonus The liquidationBonus for the asset category in eMode - * @param oracle DEPRECATED in v3.2.0 - * @param label A human readable identifier for the category - */ - event EModeCategoryAdded( - uint8 indexed categoryId, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - address oracle, - string label - ); - - /** - * @dev Emitted when a reserve interest strategy contract is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldStrategy The address of the old interest strategy contract - * @param newStrategy The address of the new interest strategy contract - */ - event ReserveInterestRateStrategyChanged( - address indexed asset, - address oldStrategy, - address newStrategy - ); - - /** - * @dev Emitted when the data of a reserve interest strategy contract is updated. - * @param asset The address of the underlying asset of the reserve - * @param data abi encoded data - */ - event ReserveInterestRateDataChanged(address indexed asset, address indexed strategy, bytes data); - - /** - * @dev Emitted when an aToken implementation is upgraded. - * @param asset The address of the underlying asset of the reserve - * @param proxy The aToken proxy address - * @param implementation The new aToken implementation - */ - event ATokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @dev Emitted when the implementation of a variable debt token is upgraded. - * @param asset The address of the underlying asset of the reserve - * @param proxy The variable debt token proxy address - * @param implementation The new aToken implementation - */ - event VariableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @dev Emitted when the debt ceiling of an asset is set. - * @param asset The address of the underlying asset of the reserve - * @param oldDebtCeiling The old debt ceiling - * @param newDebtCeiling The new debt ceiling - */ - event DebtCeilingChanged(address indexed asset, uint256 oldDebtCeiling, uint256 newDebtCeiling); - - /** - * @dev Emitted when the the siloed borrowing state for an asset is changed. - * @param asset The address of the underlying asset of the reserve - * @param oldState The old siloed borrowing state - * @param newState The new siloed borrowing state - */ - event SiloedBorrowingChanged(address indexed asset, bool oldState, bool newState); - - /** - * @dev Emitted when the bridge protocol fee is updated. - * @param oldBridgeProtocolFee The old protocol fee, expressed in bps - * @param newBridgeProtocolFee The new protocol fee, expressed in bps - */ - event BridgeProtocolFeeUpdated(uint256 oldBridgeProtocolFee, uint256 newBridgeProtocolFee); - - /** - * @dev Emitted when the total premium on flashloans is updated. - * @param oldFlashloanPremiumTotal The old premium, expressed in bps - * @param newFlashloanPremiumTotal The new premium, expressed in bps - */ - event FlashloanPremiumTotalUpdated( - uint128 oldFlashloanPremiumTotal, - uint128 newFlashloanPremiumTotal - ); - - /** - * @dev Emitted when the part of the premium that goes to protocol is updated. - * @param oldFlashloanPremiumToProtocol The old premium, expressed in bps - * @param newFlashloanPremiumToProtocol The new premium, expressed in bps - */ - event FlashloanPremiumToProtocolUpdated( - uint128 oldFlashloanPremiumToProtocol, - uint128 newFlashloanPremiumToProtocol - ); - - /** - * @dev Emitted when the reserve is set as borrowable/non borrowable in isolation mode. - * @param asset The address of the underlying asset of the reserve - * @param borrowable True if the reserve is borrowable in isolation, false otherwise - */ - event BorrowableInIsolationChanged(address asset, bool borrowable); - - /** - * @notice Initializes multiple reserves. - * @dev param useVirtualBalance of the input struct should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param input The array of initialization parameters - */ - function initReserves(ConfiguratorInputTypes.InitReserveInput[] calldata input) external; - - /** - * @dev Updates the aToken implementation for the reserve. - * @param input The aToken update parameters - */ - function updateAToken(ConfiguratorInputTypes.UpdateATokenInput calldata input) external; - - /** - * @notice Updates the variable debt token implementation for the asset. - * @param input The variableDebtToken update parameters - */ - function updateVariableDebtToken( - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external; - - /** - * @notice Configures borrowing on a reserve. - * @param asset The address of the underlying asset of the reserve - * @param enabled True if borrowing needs to be enabled, false otherwise - */ - function setReserveBorrowing(address asset, bool enabled) external; - - /** - * @notice Configures the reserve collateralization parameters. - * @dev All the values are expressed in bps. A value of 10000, results in 100.00% - * @dev The `liquidationBonus` is always above 100%. A value of 105% means the liquidator will receive a 5% bonus - * @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 - */ - function configureReserveAsCollateral( - address asset, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus - ) external; - - /** - * @notice Enable or disable flashloans on a reserve - * @param asset The address of the underlying asset of the reserve - * @param enabled True if flashloans need to be enabled, false otherwise - */ - function setReserveFlashLoaning(address asset, bool enabled) external; - - /** - * @notice Activate or deactivate a reserve - * @param asset The address of the underlying asset of the reserve - * @param active True if the reserve needs to be active, false otherwise - */ - function setReserveActive(address asset, bool active) external; - - /** - * @notice Freeze or unfreeze a reserve. A frozen reserve doesn't allow any new supply, borrow - * or rate swap but allows repayments, liquidations, rate rebalances and withdrawals. - * @param asset The address of the underlying asset of the reserve - * @param freeze True if the reserve needs to be frozen, false otherwise - */ - function setReserveFreeze(address asset, bool freeze) external; - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the - * borrowed amount will be accumulated in the isolated collateral's total debt exposure - * @dev Only assets of the same family (e.g. USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations - * @param asset The address of the underlying asset of the reserve - * @param borrowable True if the asset should be borrowable in isolation, false otherwise - */ - function setBorrowableInIsolation(address asset, bool borrowable) external; - - /** - * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, - * swap interest rate, liquidate, atoken transfers). - * @param asset The address of the underlying asset of the reserve - * @param paused True if pausing the reserve, false if unpausing - * @param gracePeriod Count of seconds after unpause during which liquidations will not be available - * - Only applicable whenever unpausing (`paused` as false) - * - Passing 0 means no grace period - * - Capped to maximum MAX_GRACE_PERIOD - */ - function setReservePause(address asset, bool paused, uint40 gracePeriod) external; - - /** - * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, - * swap interest rate, liquidate, atoken transfers). - * @dev Version with no grace period - * @param asset The address of the underlying asset of the reserve - * @param paused True if pausing the reserve, false if unpausing - */ - function setReservePause(address asset, bool paused) external; - - /** - * @notice Disables liquidation grace period for the asset. The liquidation grace period is set in the past - * so that liquidations are allowed for the asset. - * @param asset The address of the underlying asset of the reserve - */ - function disableLiquidationGracePeriod(address asset) external; - - /** - * @notice Updates the reserve factor of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newReserveFactor The new reserve factor of the reserve - */ - function setReserveFactor(address asset, uint256 newReserveFactor) external; - - /** - * @notice Sets the interest rate strategy of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newRateStrategyAddress The address of the new interest strategy contract - * @param rateData bytes-encoded rate data. In this format in order to allow the rate strategy contract - * to de-structure custom data - */ - function setReserveInterestRateStrategyAddress( - address asset, - address newRateStrategyAddress, - bytes calldata rateData - ) external; - - /** - * @notice Sets interest rate data for a reserve - * @param asset The address of the underlying asset of the reserve - * @param rateData bytes-encoded rate data. In this format in order to allow the rate strategy contract - * to de-structure custom data - */ - function setReserveInterestRateData(address asset, bytes calldata rateData) external; - - /** - * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions - * are suspended. - * @param paused True if protocol needs to be paused, false otherwise - * @param gracePeriod Count of seconds after unpause during which liquidations will not be available - * - Only applicable whenever unpausing (`paused` as false) - * - Passing 0 means no grace period - * - Capped to maximum MAX_GRACE_PERIOD - */ - function setPoolPause(bool paused, uint40 gracePeriod) external; - - /** - * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions - * are suspended. - * @dev Version with no grace period - * @param paused True if protocol needs to be paused, false otherwise - */ - function setPoolPause(bool paused) external; - - /** - * @notice Updates the borrow cap of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newBorrowCap The new borrow cap of the reserve - */ - function setBorrowCap(address asset, uint256 newBorrowCap) external; - - /** - * @notice Updates the supply cap of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newSupplyCap The new supply cap of the reserve - */ - function setSupplyCap(address asset, uint256 newSupplyCap) external; - - /** - * @notice Updates the liquidation protocol fee of reserve. - * @param asset The address of the underlying asset of the reserve - * @param newFee The new liquidation protocol fee of the reserve, expressed in bps - */ - function setLiquidationProtocolFee(address asset, uint256 newFee) external; - - /** - * @notice Updates the unbacked mint cap of reserve. - * @param asset The address of the underlying asset of the reserve - * @param newUnbackedMintCap The new unbacked mint cap of the reserve - */ - function setUnbackedMintCap(address asset, uint256 newUnbackedMintCap) external; - - /** - * @notice Enables/disables an asset to be borrowable in a selected eMode. - * - eMode.borrowable always has less priority then reserve.borrowable - * @param asset The address of the underlying asset of the reserve - * @param categoryId The eMode categoryId - * @param borrowable True if the asset should be borrowable in the given eMode category, false otherwise. - */ - function setAssetBorrowableInEMode(address asset, uint8 categoryId, bool borrowable) external; - - /** - * @notice Enables/disables an asset to be collateral in a selected eMode. - * @param asset The address of the underlying asset of the reserve - * @param categoryId The eMode categoryId - * @param collateral True if the asset should be collateral in the given eMode category, false otherwise. - */ - function setAssetCollateralInEMode(address asset, uint8 categoryId, bool collateral) external; - - /** - * @notice Adds a new efficiency mode (eMode) category or alters a existing one. - * @param categoryId The id of the category to be configured - * @param ltv The ltv associated with the category - * @param liquidationThreshold The liquidation threshold associated with the category - * @param liquidationBonus The liquidation bonus associated with the category - * @param label A label identifying the category - */ - function setEModeCategory( - uint8 categoryId, - uint16 ltv, - uint16 liquidationThreshold, - uint16 liquidationBonus, - string calldata label - ) external; - - /** - * @notice Drops a reserve entirely. - * @param asset The address of the reserve to drop - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the bridge fee collected by the protocol reserves. - * @param newBridgeProtocolFee The part of the fee sent to the protocol treasury, expressed in bps - */ - function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external; - - /** - * @notice Updates the total flash loan premium. - * Total flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra balance - * - A part is collected by the protocol reserves - * @dev Expressed in bps - * @dev The premium is calculated on the total amount borrowed - * @param newFlashloanPremiumTotal The total flashloan premium - */ - function updateFlashloanPremiumTotal(uint128 newFlashloanPremiumTotal) external; - - /** - * @notice Updates the flash loan premium collected by protocol reserves - * @dev Expressed in bps - * @dev The premium to protocol is calculated on the total flashloan premium - * @param newFlashloanPremiumToProtocol The part of the flashloan premium sent to the protocol treasury - */ - function updateFlashloanPremiumToProtocol(uint128 newFlashloanPremiumToProtocol) external; - - /** - * @notice Sets the debt ceiling for an asset. - * @param newDebtCeiling The new debt ceiling - */ - function setDebtCeiling(address asset, uint256 newDebtCeiling) external; - - /** - * @notice Sets siloed borrowing for an asset - * @param siloed The new siloed borrowing state - */ - function setSiloedBorrowing(address asset, bool siloed) external; - - /** - * @notice Gets pending ltv value - * @param asset The new siloed borrowing state - */ - function getPendingLtv(address asset) external view returns (uint256); - - /** - * @notice Gets the address of the external ConfiguratorLogic - */ - function getConfiguratorLogic() external view returns (address); - - /** - * @notice Gets the maximum liquidations grace period allowed, in seconds - */ - function MAX_GRACE_PERIOD() external view returns (uint40); -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol - -/** - * @title InitializableAdminUpgradeabilityProxy - * @author Aave - * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function - */ -contract InitializableImmutableAdminUpgradeabilityProxy is - BaseImmutableAdminUpgradeabilityProxy, - InitializableUpgradeabilityProxy -{ - /** - * @dev Constructor. - * @param admin The address of the admin - */ - constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { - // Intentionally left blank - } - - /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy - function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { - BaseImmutableAdminUpgradeabilityProxy._willFallback(); - } -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol - -/** - * @title ConfiguratorLogic library - * @author Aave - * @notice Implements the functions to initialize reserves and update aTokens and debtTokens - */ -library ConfiguratorLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPoolConfigurator` for descriptions - event ReserveInitialized( - address indexed asset, - address indexed aToken, - address stableDebtToken, - address variableDebtToken, - address interestRateStrategyAddress - ); - event ATokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - event VariableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @notice Initialize a reserve by creating and initializing aToken and variable debt token - * @dev Emits the `ReserveInitialized` event - * @param pool The Pool in which the reserve will be initialized - * @param input The needed parameters for the initialization - */ - function executeInitReserve( - IPool pool, - ConfiguratorInputTypes.InitReserveInput calldata input - ) external { - // It is an assumption that the asset listed is non-malicious, and the external call doesn't create re-entrancies - uint8 underlyingAssetDecimals = IERC20Detailed(input.underlyingAsset).decimals(); - require(underlyingAssetDecimals > 5, Errors.INVALID_DECIMALS); - - address aTokenProxyAddress = _initTokenWithProxy( - input.aTokenImpl, - abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - pool, - input.treasury, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.aTokenName, - input.aTokenSymbol, - input.params - ) - ); - - address variableDebtTokenProxyAddress = _initTokenWithProxy( - input.variableDebtTokenImpl, - abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - pool, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.variableDebtTokenName, - input.variableDebtTokenSymbol, - input.params - ) - ); - - pool.initReserve( - input.underlyingAsset, - aTokenProxyAddress, - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - - DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); - - currentConfig.setDecimals(underlyingAssetDecimals); - - currentConfig.setActive(true); - currentConfig.setPaused(false); - currentConfig.setFrozen(false); - currentConfig.setVirtualAccActive(input.useVirtualBalance); - - pool.setConfiguration(input.underlyingAsset, currentConfig); - - IReserveInterestRateStrategy(input.interestRateStrategyAddress).setInterestRateParams( - input.underlyingAsset, - input.interestRateData - ); - - emit ReserveInitialized( - input.underlyingAsset, - aTokenProxyAddress, - address(0), - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - } - - /** - * @notice Updates the aToken implementation and initializes it - * @dev Emits the `ATokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the aToken - * @param input The parameters needed for the initialize call - */ - function executeUpdateAToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateATokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - cachedPool, - input.treasury, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); - - emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); - } - - /** - * @notice Updates the variable debt token implementation and initializes it - * @dev Emits the `VariableDebtTokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the variable debt token - * @param input The parameters needed for the initialize call - */ - function executeUpdateVariableDebtToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - cachedPool, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation( - reserveData.variableDebtTokenAddress, - input.implementation, - encodedCall - ); - - emit VariableDebtTokenUpgraded( - input.asset, - reserveData.variableDebtTokenAddress, - input.implementation - ); - } - - /** - * @notice Creates a new proxy and initializes the implementation - * @param implementation The address of the implementation - * @param initParams The parameters that is passed to the implementation to initialize - * @return The address of initialized proxy - */ - function _initTokenWithProxy( - address implementation, - bytes memory initParams - ) internal returns (address) { - InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( - address(this) - ); - - proxy.initialize(implementation, initParams); - - return address(proxy); - } - - /** - * @notice Upgrades the implementation and makes call to the proxy - * @dev The call is used to initialize the new implementation. - * @param proxyAddress The address of the proxy - * @param implementation The address of the new implementation - * @param initParams The parameters to the call after the upgrade - */ - function _upgradeTokenImplementation( - address proxyAddress, - address implementation, - bytes memory initParams - ) internal { - InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( - payable(proxyAddress) - ); - - proxy.upgradeToAndCall(implementation, initParams); - } -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/pool/PoolConfigurator.sol - -/** - * @title PoolConfigurator - * @author Aave - * @dev Implements the configuration methods for the Aave protocol - */ -abstract contract PoolConfigurator is VersionedInitializable, IPoolConfigurator { - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - IPoolAddressesProvider internal _addressesProvider; - IPool internal _pool; - - mapping(address => uint256) internal _pendingLtv; - - uint40 public constant MAX_GRACE_PERIOD = 4 hours; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - _onlyPoolAdmin(); - _; - } - - /** - * @dev Only emergency or pool admin can call functions marked by this modifier. - */ - modifier onlyEmergencyOrPoolAdmin() { - _onlyPoolOrEmergencyAdmin(); - _; - } - - /** - * @dev Only asset listing or pool admin can call functions marked by this modifier. - */ - modifier onlyAssetListingOrPoolAdmins() { - _onlyAssetListingOrPoolAdmins(); - _; - } - - /** - * @dev Only risk or pool admin can call functions marked by this modifier. - */ - modifier onlyRiskOrPoolAdmins() { - _onlyRiskOrPoolAdmins(); - _; - } - - /** - * @dev Only risk, pool or emergency admin can call functions marked by this modifier. - */ - modifier onlyRiskOrPoolOrEmergencyAdmins() { - _onlyRiskOrPoolOrEmergencyAdmins(); - _; - } - - function initialize(IPoolAddressesProvider provider) public virtual; - - /// @inheritdoc IPoolConfigurator - function initReserves( - ConfiguratorInputTypes.InitReserveInput[] calldata input - ) external override onlyAssetListingOrPoolAdmins { - IPool cachedPool = _pool; - - for (uint256 i = 0; i < input.length; i++) { - ConfiguratorLogic.executeInitReserve(cachedPool, input[i]); - emit ReserveInterestRateDataChanged( - input[i].underlyingAsset, - input[i].interestRateStrategyAddress, - input[i].interestRateData - ); - } - } - - /// @inheritdoc IPoolConfigurator - function dropReserve(address asset) external override onlyPoolAdmin { - _pool.dropReserve(asset); - emit ReserveDropped(asset); - } - - /// @inheritdoc IPoolConfigurator - function updateAToken( - ConfiguratorInputTypes.UpdateATokenInput calldata input - ) external override onlyPoolAdmin { - ConfiguratorLogic.executeUpdateAToken(_pool, input); - } - - /// @inheritdoc IPoolConfigurator - function updateVariableDebtToken( - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external override onlyPoolAdmin { - ConfiguratorLogic.executeUpdateVariableDebtToken(_pool, input); - } - - /// @inheritdoc IPoolConfigurator - function setReserveBorrowing(address asset, bool enabled) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setBorrowingEnabled(enabled); - _pool.setConfiguration(asset, currentConfig); - emit ReserveBorrowing(asset, enabled); - } - - /// @inheritdoc IPoolConfigurator - function configureReserveAsCollateral( - address asset, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus - ) external override onlyRiskOrPoolAdmins { - //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_RESERVE_PARAMS); - - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - if (liquidationThreshold != 0) { - //liquidation bonus must be bigger than 100.00%, otherwise the liquidator would receive less - //collateral than needed to cover the debt - require(liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_PARAMS); - - //if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment - //a loan is taken there is enough collateral available to cover the liquidation bonus - require( - liquidationThreshold.percentMul(liquidationBonus) <= PercentageMath.PERCENTAGE_FACTOR, - Errors.INVALID_RESERVE_PARAMS - ); - } else { - require(liquidationBonus == 0, Errors.INVALID_RESERVE_PARAMS); - //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 supplied - _checkNoSuppliers(asset); - } - - uint256 newLtv = ltv; - - if (currentConfig.getFrozen()) { - _pendingLtv[asset] = ltv; - newLtv = 0; - - emit PendingLtvChanged(asset, ltv); - } else { - currentConfig.setLtv(ltv); - } - - currentConfig.setLiquidationThreshold(liquidationThreshold); - currentConfig.setLiquidationBonus(liquidationBonus); - - _pool.setConfiguration(asset, currentConfig); - - emit CollateralConfigurationChanged(asset, newLtv, liquidationThreshold, liquidationBonus); - } - - /// @inheritdoc IPoolConfigurator - function setReserveFlashLoaning( - address asset, - bool enabled - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - currentConfig.setFlashLoanEnabled(enabled); - _pool.setConfiguration(asset, currentConfig); - emit ReserveFlashLoaning(asset, enabled); - } - - /// @inheritdoc IPoolConfigurator - function setReserveActive(address asset, bool active) external override onlyPoolAdmin { - if (!active) _checkNoSuppliers(asset); - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setActive(active); - _pool.setConfiguration(asset, currentConfig); - emit ReserveActive(asset, active); - } - - /// @inheritdoc IPoolConfigurator - function setReserveFreeze( - address asset, - bool freeze - ) external override onlyRiskOrPoolOrEmergencyAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - require(freeze != currentConfig.getFrozen(), Errors.INVALID_FREEZE_STATE); - - currentConfig.setFrozen(freeze); - - uint256 ltvSet; - uint256 pendingLtvSet; - - if (freeze) { - pendingLtvSet = currentConfig.getLtv(); - _pendingLtv[asset] = pendingLtvSet; - currentConfig.setLtv(0); - } else { - ltvSet = _pendingLtv[asset]; - currentConfig.setLtv(ltvSet); - delete _pendingLtv[asset]; - } - - emit PendingLtvChanged(asset, pendingLtvSet); - emit CollateralConfigurationChanged( - asset, - ltvSet, - currentConfig.getLiquidationThreshold(), - currentConfig.getLiquidationBonus() - ); - - _pool.setConfiguration(asset, currentConfig); - emit ReserveFrozen(asset, freeze); - } - - /// @inheritdoc IPoolConfigurator - function setBorrowableInIsolation( - address asset, - bool borrowable - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setBorrowableInIsolation(borrowable); - _pool.setConfiguration(asset, currentConfig); - emit BorrowableInIsolationChanged(asset, borrowable); - } - - /// @inheritdoc IPoolConfigurator - function setReservePause( - address asset, - bool paused, - uint40 gracePeriod - ) public override onlyEmergencyOrPoolAdmin { - if (!paused && gracePeriod != 0) { - require(gracePeriod <= MAX_GRACE_PERIOD, Errors.INVALID_GRACE_PERIOD); - - uint40 until = uint40(block.timestamp) + gracePeriod; - _pool.setLiquidationGracePeriod(asset, until); - emit LiquidationGracePeriodChanged(asset, until); - } - - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setPaused(paused); - _pool.setConfiguration(asset, currentConfig); - emit ReservePaused(asset, paused); - } - - /// @inheritdoc IPoolConfigurator - function setReservePause(address asset, bool paused) external override onlyEmergencyOrPoolAdmin { - setReservePause(asset, paused, 0); - } - - /// @inheritdoc IPoolConfigurator - function disableLiquidationGracePeriod(address asset) external override onlyEmergencyOrPoolAdmin { - // set the liquidation grace period in the past to disable liquidation grace period - _pool.setLiquidationGracePeriod(asset, 0); - - emit LiquidationGracePeriodDisabled(asset); - } - - /// @inheritdoc IPoolConfigurator - function setReserveFactor( - address asset, - uint256 newReserveFactor - ) external override onlyRiskOrPoolAdmins { - require(newReserveFactor <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - _pool.syncIndexesState(asset); - - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldReserveFactor = currentConfig.getReserveFactor(); - currentConfig.setReserveFactor(newReserveFactor); - _pool.setConfiguration(asset, currentConfig); - emit ReserveFactorChanged(asset, oldReserveFactor, newReserveFactor); - - _pool.syncRatesState(asset); - } - - /// @inheritdoc IPoolConfigurator - function setDebtCeiling( - address asset, - uint256 newDebtCeiling - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - uint256 oldDebtCeiling = currentConfig.getDebtCeiling(); - if (currentConfig.getLiquidationThreshold() != 0 && oldDebtCeiling == 0) { - _checkNoSuppliers(asset); - } - currentConfig.setDebtCeiling(newDebtCeiling); - _pool.setConfiguration(asset, currentConfig); - - if (newDebtCeiling == 0) { - _pool.resetIsolationModeTotalDebt(asset); - } - - emit DebtCeilingChanged(asset, oldDebtCeiling, newDebtCeiling); - } - - /// @inheritdoc IPoolConfigurator - function setSiloedBorrowing( - address asset, - bool newSiloed - ) external override onlyRiskOrPoolAdmins { - if (newSiloed) { - _checkNoBorrowers(asset); - } - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - bool oldSiloed = currentConfig.getSiloedBorrowing(); - - currentConfig.setSiloedBorrowing(newSiloed); - - _pool.setConfiguration(asset, currentConfig); - - emit SiloedBorrowingChanged(asset, oldSiloed, newSiloed); - } - - /// @inheritdoc IPoolConfigurator - function setBorrowCap( - address asset, - uint256 newBorrowCap - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldBorrowCap = currentConfig.getBorrowCap(); - currentConfig.setBorrowCap(newBorrowCap); - _pool.setConfiguration(asset, currentConfig); - emit BorrowCapChanged(asset, oldBorrowCap, newBorrowCap); - } - - /// @inheritdoc IPoolConfigurator - function setSupplyCap( - address asset, - uint256 newSupplyCap - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldSupplyCap = currentConfig.getSupplyCap(); - currentConfig.setSupplyCap(newSupplyCap); - _pool.setConfiguration(asset, currentConfig); - emit SupplyCapChanged(asset, oldSupplyCap, newSupplyCap); - } - - /// @inheritdoc IPoolConfigurator - function setLiquidationProtocolFee( - address asset, - uint256 newFee - ) external override onlyRiskOrPoolAdmins { - require(newFee <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_LIQUIDATION_PROTOCOL_FEE); - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldFee = currentConfig.getLiquidationProtocolFee(); - currentConfig.setLiquidationProtocolFee(newFee); - _pool.setConfiguration(asset, currentConfig); - emit LiquidationProtocolFeeChanged(asset, oldFee, newFee); - } - - /// @inheritdoc IPoolConfigurator - function setEModeCategory( - uint8 categoryId, - uint16 ltv, - uint16 liquidationThreshold, - uint16 liquidationBonus, - string calldata label - ) external override onlyRiskOrPoolAdmins { - require(ltv != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); - require(liquidationThreshold != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); - - // 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_EMODE_CATEGORY_PARAMS); - require( - liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, - Errors.INVALID_EMODE_CATEGORY_PARAMS - ); - - // if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment - // a loan is taken there is enough collateral available to cover the liquidation bonus - require( - uint256(liquidationThreshold).percentMul(liquidationBonus) <= - PercentageMath.PERCENTAGE_FACTOR, - Errors.INVALID_EMODE_CATEGORY_PARAMS - ); - - DataTypes.EModeCategoryBaseConfiguration memory categoryData; - categoryData.ltv = ltv; - categoryData.liquidationThreshold = liquidationThreshold; - categoryData.liquidationBonus = liquidationBonus; - categoryData.label = label; - - _pool.configureEModeCategory(categoryId, categoryData); - emit EModeCategoryAdded( - categoryId, - ltv, - liquidationThreshold, - liquidationBonus, - address(0), - label - ); - } - - /// @inheritdoc IPoolConfigurator - function setAssetCollateralInEMode( - address asset, - uint8 categoryId, - bool allowed - ) external override onlyRiskOrPoolAdmins { - uint128 collateralBitmap = _pool.getEModeCategoryCollateralBitmap(categoryId); - DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); - require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED); - collateralBitmap = EModeConfiguration.setReserveBitmapBit( - collateralBitmap, - reserveData.id, - allowed - ); - _pool.configureEModeCategoryCollateralBitmap(categoryId, collateralBitmap); - emit AssetCollateralInEModeChanged(asset, categoryId, allowed); - } - - /// @inheritdoc IPoolConfigurator - function setAssetBorrowableInEMode( - address asset, - uint8 categoryId, - bool borrowable - ) external override onlyRiskOrPoolAdmins { - uint128 borrowableBitmap = _pool.getEModeCategoryBorrowableBitmap(categoryId); - DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); - require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED); - borrowableBitmap = EModeConfiguration.setReserveBitmapBit( - borrowableBitmap, - reserveData.id, - borrowable - ); - _pool.configureEModeCategoryBorrowableBitmap(categoryId, borrowableBitmap); - emit AssetBorrowableInEModeChanged(asset, categoryId, borrowable); - } - - /// @inheritdoc IPoolConfigurator - function setUnbackedMintCap( - address asset, - uint256 newUnbackedMintCap - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldUnbackedMintCap = currentConfig.getUnbackedMintCap(); - currentConfig.setUnbackedMintCap(newUnbackedMintCap); - _pool.setConfiguration(asset, currentConfig); - emit UnbackedMintCapChanged(asset, oldUnbackedMintCap, newUnbackedMintCap); - } - - /// @inheritdoc IPoolConfigurator - function setReserveInterestRateData( - address asset, - bytes calldata rateData - ) external onlyRiskOrPoolAdmins { - DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset); - _updateInterestRateStrategy(asset, reserve, reserve.interestRateStrategyAddress, rateData); - } - - /// @inheritdoc IPoolConfigurator - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress, - bytes calldata rateData - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset); - _updateInterestRateStrategy(asset, reserve, rateStrategyAddress, rateData); - } - - /// @inheritdoc IPoolConfigurator - function setPoolPause(bool paused, uint40 gracePeriod) public override onlyEmergencyOrPoolAdmin { - address[] memory reserves = _pool.getReservesList(); - - for (uint256 i = 0; i < reserves.length; i++) { - if (reserves[i] != address(0)) { - setReservePause(reserves[i], paused, gracePeriod); - } - } - } - - /// @inheritdoc IPoolConfigurator - function setPoolPause(bool paused) external override onlyEmergencyOrPoolAdmin { - setPoolPause(paused, 0); - } - - /// @inheritdoc IPoolConfigurator - function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external override onlyPoolAdmin { - require( - newBridgeProtocolFee <= PercentageMath.PERCENTAGE_FACTOR, - Errors.BRIDGE_PROTOCOL_FEE_INVALID - ); - uint256 oldBridgeProtocolFee = _pool.BRIDGE_PROTOCOL_FEE(); - _pool.updateBridgeProtocolFee(newBridgeProtocolFee); - emit BridgeProtocolFeeUpdated(oldBridgeProtocolFee, newBridgeProtocolFee); - } - - /// @inheritdoc IPoolConfigurator - function updateFlashloanPremiumTotal( - uint128 newFlashloanPremiumTotal - ) external override onlyPoolAdmin { - require( - newFlashloanPremiumTotal <= PercentageMath.PERCENTAGE_FACTOR, - Errors.FLASHLOAN_PREMIUM_INVALID - ); - uint128 oldFlashloanPremiumTotal = _pool.FLASHLOAN_PREMIUM_TOTAL(); - _pool.updateFlashloanPremiums(newFlashloanPremiumTotal, _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL()); - emit FlashloanPremiumTotalUpdated(oldFlashloanPremiumTotal, newFlashloanPremiumTotal); - } - - /// @inheritdoc IPoolConfigurator - function updateFlashloanPremiumToProtocol( - uint128 newFlashloanPremiumToProtocol - ) external override onlyPoolAdmin { - require( - newFlashloanPremiumToProtocol <= PercentageMath.PERCENTAGE_FACTOR, - Errors.FLASHLOAN_PREMIUM_INVALID - ); - uint128 oldFlashloanPremiumToProtocol = _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL(); - _pool.updateFlashloanPremiums(_pool.FLASHLOAN_PREMIUM_TOTAL(), newFlashloanPremiumToProtocol); - emit FlashloanPremiumToProtocolUpdated( - oldFlashloanPremiumToProtocol, - newFlashloanPremiumToProtocol - ); - } - - /// @inheritdoc IPoolConfigurator - function getPendingLtv(address asset) external view override returns (uint256) { - return _pendingLtv[asset]; - } - - /// @inheritdoc IPoolConfigurator - function getConfiguratorLogic() external pure returns (address) { - return address(ConfiguratorLogic); - } - - function _updateInterestRateStrategy( - address asset, - DataTypes.ReserveDataLegacy memory reserve, - address newRateStrategyAddress, - bytes calldata rateData - ) internal { - address oldRateStrategyAddress = reserve.interestRateStrategyAddress; - - _pool.syncIndexesState(asset); - - IDefaultInterestRateStrategyV2(newRateStrategyAddress).setInterestRateParams(asset, rateData); - emit ReserveInterestRateDataChanged(asset, newRateStrategyAddress, rateData); - - if (oldRateStrategyAddress != newRateStrategyAddress) { - _pool.setReserveInterestRateStrategyAddress(asset, newRateStrategyAddress); - emit ReserveInterestRateStrategyChanged( - asset, - oldRateStrategyAddress, - newRateStrategyAddress - ); - } - - _pool.syncRatesState(asset); - } - - function _checkNoSuppliers(address asset) internal view { - DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); - uint256 totalSupplied = IPoolDataProvider(_addressesProvider.getPoolDataProvider()) - .getATokenTotalSupply(asset); - - require( - totalSupplied == 0 && reserveData.accruedToTreasury == 0, - Errors.RESERVE_LIQUIDITY_NOT_ZERO - ); - } - - function _checkNoBorrowers(address asset) internal view { - uint256 totalDebt = IPoolDataProvider(_addressesProvider.getPoolDataProvider()).getTotalDebt( - asset - ); - require(totalDebt == 0, Errors.RESERVE_DEBT_NOT_ZERO); - } - - function _onlyPoolAdmin() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - } - - function _onlyPoolOrEmergencyAdmin() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isPoolAdmin(msg.sender) || aclManager.isEmergencyAdmin(msg.sender), - Errors.CALLER_NOT_POOL_OR_EMERGENCY_ADMIN - ); - } - - function _onlyAssetListingOrPoolAdmins() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), - Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN - ); - } - - function _onlyRiskOrPoolAdmins() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isRiskAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), - Errors.CALLER_NOT_RISK_OR_POOL_ADMIN - ); - } - - function _onlyRiskOrPoolOrEmergencyAdmins() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isRiskAdmin(msg.sender) || - aclManager.isPoolAdmin(msg.sender) || - aclManager.isEmergencyAdmin(msg.sender), - Errors.CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN - ); - } -} - -// downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/instances/PoolConfiguratorInstance.sol - -contract PoolConfiguratorInstance is PoolConfigurator { - uint256 public constant CONFIGURATOR_REVISION = 4; - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return CONFIGURATOR_REVISION; - } - - function initialize(IPoolAddressesProvider provider) public virtual override initializer { - _addressesProvider = provider; - _pool = IPool(_addressesProvider.getPool()); - } -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol deleted file mode 100644 index aec817cb..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import './Proxy.sol'; -import '../contracts/Address.sol'; - -/** - * @title BaseUpgradeabilityProxy - * @dev This contract implements a proxy that allows to change the - * implementation address to which it will delegate. - * Such a change is called an implementation upgrade. - */ -contract BaseUpgradeabilityProxy is Proxy { - /** - * @dev Emitted when the implementation is upgraded. - * @param implementation Address of the new implementation. - */ - event Upgraded(address indexed implementation); - - /** - * @dev Storage slot with the address of the current implementation. - * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant IMPLEMENTATION_SLOT = - 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /** - * @dev Returns the current implementation. - * @return impl Address of the current implementation - */ - function _implementation() internal view override returns (address impl) { - bytes32 slot = IMPLEMENTATION_SLOT; - //solium-disable-next-line - assembly { - impl := sload(slot) - } - } - - /** - * @dev Upgrades the proxy to a new implementation. - * @param newImplementation Address of the new implementation. - */ - function _upgradeTo(address newImplementation) internal { - _setImplementation(newImplementation); - emit Upgraded(newImplementation); - } - - /** - * @dev Sets the implementation address of the proxy. - * @param newImplementation Address of the new implementation. - */ - function _setImplementation(address newImplementation) internal { - require( - Address.isContract(newImplementation), - 'Cannot set a proxy implementation to a non-contract address' - ); - - bytes32 slot = IMPLEMENTATION_SLOT; - - //solium-disable-next-line - assembly { - sstore(slot, newImplementation) - } - } -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol deleted file mode 100644 index 4b43fa6a..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import './BaseUpgradeabilityProxy.sol'; - -/** - * @title InitializableUpgradeabilityProxy - * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing - * implementation and init data. - */ -contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { - /** - * @dev Contract initializer. - * @param _logic Address of the initial implementation. - * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. - */ - function initialize(address _logic, bytes memory _data) public payable { - require(_implementation() == address(0)); - assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); - _setImplementation(_logic); - if (_data.length > 0) { - (bool success, ) = _logic.delegatecall(_data); - require(success); - } - } -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol deleted file mode 100644 index 53589441..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol +++ /dev/null @@ -1,81 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title Proxy - * @dev Implements delegation of calls to other contracts, with proper - * forwarding of return values and bubbling of failures. - * It defines a fallback function that delegates all calls to the address - * returned by the abstract _implementation() internal function. - */ -abstract contract Proxy { - /** - * @dev Fallback function. - * Will run if no other function in the contract matches the call data. - * Implemented entirely in `_fallback`. - */ - fallback() external payable { - _fallback(); - } - - /** - * @dev Fallback function that will run if call data is empty. - * IMPORTANT. receive() on implementation contracts will be unreachable - */ - receive() external payable { - _fallback(); - } - - /** - * @return The Address of the implementation. - */ - function _implementation() internal view virtual returns (address); - - /** - * @dev Delegates execution to an implementation contract. - * This is a low level function that doesn't return to its internal call site. - * It will return to the external caller whatever the implementation returns. - * @param implementation Address to delegate. - */ - function _delegate(address implementation) internal { - //solium-disable-next-line - assembly { - // Copy msg.data. We take full control of memory in this inline assembly - // block because it will not return to Solidity code. We overwrite the - // Solidity scratch pad at memory position 0. - calldatacopy(0, 0, calldatasize()) - - // Call the implementation. - // out and outsize are 0 because we don't know the size yet. - let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) - - // Copy the returned data. - returndatacopy(0, 0, returndatasize()) - - switch result - // delegatecall returns 0 on error. - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } - } - } - - /** - * @dev Function that is run as the first thing in the fallback function. - * Can be redefined in derived contracts to add functionality. - * Redefinitions must call super._willFallback(). - */ - function _willFallback() internal virtual {} - - /** - * @dev fallback implementation. - * Extracted to enable manual triggering. - */ - function _fallback() internal { - _willFallback(); - _delegate(_implementation()); - } -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/instances/PoolConfiguratorInstance.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/instances/PoolConfiguratorInstance.sol deleted file mode 100644 index 8d2e4939..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/instances/PoolConfiguratorInstance.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {PoolConfigurator, IPoolAddressesProvider, IPool, VersionedInitializable} from '../protocol/pool/PoolConfigurator.sol'; - -contract PoolConfiguratorInstance is PoolConfigurator { - uint256 public constant CONFIGURATOR_REVISION = 4; - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return CONFIGURATOR_REVISION; - } - - function initialize(IPoolAddressesProvider provider) public virtual override initializer { - _addressesProvider = provider; - _pool = IPool(_addressesProvider.getPool()); - } -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol deleted file mode 100644 index 938e2d8f..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol +++ /dev/null @@ -1,161 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IReserveInterestRateStrategy} from './IReserveInterestRateStrategy.sol'; -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IDefaultInterestRateStrategyV2 - * @author BGD Labs - * @notice Interface of the default interest rate strategy used by the Aave protocol - */ -interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { - /** - * @notice Holds the interest rate data for a given reserve - * - * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This - * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. - * - * @param optimalUsageRatio The optimal usage ratio, in bps - * @param baseVariableBorrowRate The base variable borrow rate, in bps - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps - */ - struct InterestRateData { - uint16 optimalUsageRatio; - uint32 baseVariableBorrowRate; - uint32 variableRateSlope1; - uint32 variableRateSlope2; - } - - /** - * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, - * used in in-memory calculations. - * - * @param optimalUsageRatio The optimal usage ratio - * @param baseVariableBorrowRate The base variable borrow rate - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio - */ - struct InterestRateDataRay { - uint256 optimalUsageRatio; - uint256 baseVariableBorrowRate; - uint256 variableRateSlope1; - uint256 variableRateSlope2; - } - - /** - * @notice emitted when new interest rate data is set in a reserve - * - * @param reserve address of the reserve that has new interest rate data set - * @param optimalUsageRatio The optimal usage ratio, in bps - * @param baseVariableBorrowRate The base variable borrow rate, in bps - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps - */ - event RateDataUpdate( - address indexed reserve, - uint256 optimalUsageRatio, - uint256 baseVariableBorrowRate, - uint256 variableRateSlope1, - uint256 variableRateSlope2 - ); - - /** - * @notice Returns the address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the maximum value achievable for variable borrow rate, in bps - * @return The maximum rate - */ - function MAX_BORROW_RATE() external view returns (uint256); - - /** - * @notice Returns the minimum optimal point, in bps - * @return The optimal point - */ - function MIN_OPTIMAL_POINT() external view returns (uint256); - - /** - * @notice Returns the maximum optimal point, in bps - * @return The optimal point - */ - function MAX_OPTIMAL_POINT() external view returns (uint256); - - /** - * notice Returns the full InterestRateData object for the given reserve, in ray - * - * @param reserve The reserve to get the data of - * - * @return The InterestRateDataRay object for the given reserve - */ - function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); - - /** - * notice Returns the full InterestRateDataRay object for the given reserve, in bps - * - * @param reserve The reserve to get the data of - * - * @return The InterestRateData object for the given reserve - */ - function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); - - /** - * @notice Returns the optimal usage rate for the given reserve in ray - * - * @param reserve The reserve to get the optimal usage rate of - * - * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate - */ - function getOptimalUsageRatio(address reserve) external view returns (uint256); - - /** - * @notice Returns the variable rate slope below optimal usage ratio in ray - * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO - * - * @param reserve The reserve to get the variable rate slope 1 of - * - * @return The variable rate slope - */ - function getVariableRateSlope1(address reserve) external view returns (uint256); - - /** - * @notice Returns the variable rate slope above optimal usage ratio in ray - * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO - * - * @param reserve The reserve to get the variable rate slope 2 of - * - * @return The variable rate slope - */ - function getVariableRateSlope2(address reserve) external view returns (uint256); - - /** - * @notice Returns the base variable borrow rate, in ray - * - * @param reserve The reserve to get the base variable borrow rate of - * - * @return The base variable borrow rate - */ - function getBaseVariableBorrowRate(address reserve) external view returns (uint256); - - /** - * @notice Returns the maximum variable borrow rate, in ray - * - * @param reserve The reserve to get the maximum variable borrow rate of - * - * @return The maximum variable borrow rate - */ - function getMaxVariableBorrowRate(address reserve) external view returns (uint256); - - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The reserve interest rate data to apply to the given reserve - * Being specific to this custom implementation, with custom struct type, - * overloading the function on the generic interface - */ - function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolConfigurator.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolConfigurator.sol deleted file mode 100644 index 977d316e..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolConfigurator.sol +++ /dev/null @@ -1,551 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {ConfiguratorInputTypes} from '../protocol/libraries/types/ConfiguratorInputTypes.sol'; -import {IDefaultInterestRateStrategyV2} from './IDefaultInterestRateStrategyV2.sol'; - -/** - * @title IPoolConfigurator - * @author Aave - * @notice Defines the basic interface for a Pool configurator. - */ -interface IPoolConfigurator { - /** - * @dev Emitted when a reserve is initialized. - * @param asset The address of the underlying asset of the reserve - * @param aToken The address of the associated aToken contract - * @param stableDebtToken, DEPRECATED in v3.2.0 - * @param variableDebtToken The address of the associated variable rate debt token - * @param interestRateStrategyAddress The address of the interest rate strategy for the reserve - */ - event ReserveInitialized( - address indexed asset, - address indexed aToken, - address stableDebtToken, - address variableDebtToken, - address interestRateStrategyAddress - ); - - /** - * @dev Emitted when borrowing is enabled or disabled on a reserve. - * @param asset The address of the underlying asset of the reserve - * @param enabled True if borrowing is enabled, false otherwise - */ - event ReserveBorrowing(address indexed asset, bool enabled); - - /** - * @dev Emitted when flashloans are enabled or disabled on a reserve. - * @param asset The address of the underlying asset of the reserve - * @param enabled True if flashloans are enabled, false otherwise - */ - event ReserveFlashLoaning(address indexed asset, bool enabled); - - /** - * @dev Emitted when the ltv is set for the frozen asset. - * @param asset The address of the underlying asset of the reserve - * @param ltv The loan to value of the asset when used as collateral - */ - event PendingLtvChanged(address indexed asset, uint256 ltv); - - /** - * @dev Emitted when the collateralization risk parameters for the specified asset are updated. - * @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 - */ - event CollateralConfigurationChanged( - address indexed asset, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus - ); - - /** - * @dev Emitted when a reserve is activated or deactivated - * @param asset The address of the underlying asset of the reserve - * @param active True if reserve is active, false otherwise - */ - event ReserveActive(address indexed asset, bool active); - - /** - * @dev Emitted when a reserve is frozen or unfrozen - * @param asset The address of the underlying asset of the reserve - * @param frozen True if reserve is frozen, false otherwise - */ - event ReserveFrozen(address indexed asset, bool frozen); - - /** - * @dev Emitted when a reserve is paused or unpaused - * @param asset The address of the underlying asset of the reserve - * @param paused True if reserve is paused, false otherwise - */ - event ReservePaused(address indexed asset, bool paused); - - /** - * @dev Emitted when a reserve is dropped. - * @param asset The address of the underlying asset of the reserve - */ - event ReserveDropped(address indexed asset); - - /** - * @dev Emitted when a reserve factor is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldReserveFactor The old reserve factor, expressed in bps - * @param newReserveFactor The new reserve factor, expressed in bps - */ - event ReserveFactorChanged( - address indexed asset, - uint256 oldReserveFactor, - uint256 newReserveFactor - ); - - /** - * @dev Emitted when the borrow cap of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldBorrowCap The old borrow cap - * @param newBorrowCap The new borrow cap - */ - event BorrowCapChanged(address indexed asset, uint256 oldBorrowCap, uint256 newBorrowCap); - - /** - * @dev Emitted when the supply cap of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldSupplyCap The old supply cap - * @param newSupplyCap The new supply cap - */ - event SupplyCapChanged(address indexed asset, uint256 oldSupplyCap, uint256 newSupplyCap); - - /** - * @dev Emitted when the liquidation protocol fee of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldFee The old liquidation protocol fee, expressed in bps - * @param newFee The new liquidation protocol fee, expressed in bps - */ - event LiquidationProtocolFeeChanged(address indexed asset, uint256 oldFee, uint256 newFee); - - /** - * @dev Emitted when the liquidation grace period is updated. - * @param asset The address of the underlying asset of the reserve - * @param gracePeriodUntil Timestamp until when liquidations will not be allowed post-unpause - */ - event LiquidationGracePeriodChanged(address indexed asset, uint40 gracePeriodUntil); - - /** - * @dev Emitted when the liquidation grace period is disabled. - * @param asset The address of the underlying asset of the reserve - */ - event LiquidationGracePeriodDisabled(address indexed asset); - - /** - * @dev Emitted when the unbacked mint cap of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldUnbackedMintCap The old unbacked mint cap - * @param newUnbackedMintCap The new unbacked mint cap - */ - event UnbackedMintCapChanged( - address indexed asset, - uint256 oldUnbackedMintCap, - uint256 newUnbackedMintCap - ); - - /** - * @dev Emitted when an collateral configuration of an asset in an eMode is changed. - * @param asset The address of the underlying asset of the reserve - * @param categoryId The eMode category - * @param collateral True if the asset is enabled as collateral in the eMode, false otherwise. - */ - event AssetCollateralInEModeChanged(address indexed asset, uint8 categoryId, bool collateral); - - /** - * @dev Emitted when the borrowable configuration of an asset in an eMode changed. - * @param asset The address of the underlying asset of the reserve - * @param categoryId The eMode category - * @param borrowable True if the asset is enabled as borrowable in the eMode, false otherwise. - */ - event AssetBorrowableInEModeChanged(address indexed asset, uint8 categoryId, bool borrowable); - - /** - * @dev Emitted when a new eMode category is added or an existing category is altered. - * @param categoryId The new eMode category id - * @param ltv The ltv for the asset category in eMode - * @param liquidationThreshold The liquidationThreshold for the asset category in eMode - * @param liquidationBonus The liquidationBonus for the asset category in eMode - * @param oracle DEPRECATED in v3.2.0 - * @param label A human readable identifier for the category - */ - event EModeCategoryAdded( - uint8 indexed categoryId, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - address oracle, - string label - ); - - /** - * @dev Emitted when a reserve interest strategy contract is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldStrategy The address of the old interest strategy contract - * @param newStrategy The address of the new interest strategy contract - */ - event ReserveInterestRateStrategyChanged( - address indexed asset, - address oldStrategy, - address newStrategy - ); - - /** - * @dev Emitted when the data of a reserve interest strategy contract is updated. - * @param asset The address of the underlying asset of the reserve - * @param data abi encoded data - */ - event ReserveInterestRateDataChanged(address indexed asset, address indexed strategy, bytes data); - - /** - * @dev Emitted when an aToken implementation is upgraded. - * @param asset The address of the underlying asset of the reserve - * @param proxy The aToken proxy address - * @param implementation The new aToken implementation - */ - event ATokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @dev Emitted when the implementation of a variable debt token is upgraded. - * @param asset The address of the underlying asset of the reserve - * @param proxy The variable debt token proxy address - * @param implementation The new aToken implementation - */ - event VariableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @dev Emitted when the debt ceiling of an asset is set. - * @param asset The address of the underlying asset of the reserve - * @param oldDebtCeiling The old debt ceiling - * @param newDebtCeiling The new debt ceiling - */ - event DebtCeilingChanged(address indexed asset, uint256 oldDebtCeiling, uint256 newDebtCeiling); - - /** - * @dev Emitted when the the siloed borrowing state for an asset is changed. - * @param asset The address of the underlying asset of the reserve - * @param oldState The old siloed borrowing state - * @param newState The new siloed borrowing state - */ - event SiloedBorrowingChanged(address indexed asset, bool oldState, bool newState); - - /** - * @dev Emitted when the bridge protocol fee is updated. - * @param oldBridgeProtocolFee The old protocol fee, expressed in bps - * @param newBridgeProtocolFee The new protocol fee, expressed in bps - */ - event BridgeProtocolFeeUpdated(uint256 oldBridgeProtocolFee, uint256 newBridgeProtocolFee); - - /** - * @dev Emitted when the total premium on flashloans is updated. - * @param oldFlashloanPremiumTotal The old premium, expressed in bps - * @param newFlashloanPremiumTotal The new premium, expressed in bps - */ - event FlashloanPremiumTotalUpdated( - uint128 oldFlashloanPremiumTotal, - uint128 newFlashloanPremiumTotal - ); - - /** - * @dev Emitted when the part of the premium that goes to protocol is updated. - * @param oldFlashloanPremiumToProtocol The old premium, expressed in bps - * @param newFlashloanPremiumToProtocol The new premium, expressed in bps - */ - event FlashloanPremiumToProtocolUpdated( - uint128 oldFlashloanPremiumToProtocol, - uint128 newFlashloanPremiumToProtocol - ); - - /** - * @dev Emitted when the reserve is set as borrowable/non borrowable in isolation mode. - * @param asset The address of the underlying asset of the reserve - * @param borrowable True if the reserve is borrowable in isolation, false otherwise - */ - event BorrowableInIsolationChanged(address asset, bool borrowable); - - /** - * @notice Initializes multiple reserves. - * @dev param useVirtualBalance of the input struct should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param input The array of initialization parameters - */ - function initReserves(ConfiguratorInputTypes.InitReserveInput[] calldata input) external; - - /** - * @dev Updates the aToken implementation for the reserve. - * @param input The aToken update parameters - */ - function updateAToken(ConfiguratorInputTypes.UpdateATokenInput calldata input) external; - - /** - * @notice Updates the variable debt token implementation for the asset. - * @param input The variableDebtToken update parameters - */ - function updateVariableDebtToken( - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external; - - /** - * @notice Configures borrowing on a reserve. - * @param asset The address of the underlying asset of the reserve - * @param enabled True if borrowing needs to be enabled, false otherwise - */ - function setReserveBorrowing(address asset, bool enabled) external; - - /** - * @notice Configures the reserve collateralization parameters. - * @dev All the values are expressed in bps. A value of 10000, results in 100.00% - * @dev The `liquidationBonus` is always above 100%. A value of 105% means the liquidator will receive a 5% bonus - * @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 - */ - function configureReserveAsCollateral( - address asset, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus - ) external; - - /** - * @notice Enable or disable flashloans on a reserve - * @param asset The address of the underlying asset of the reserve - * @param enabled True if flashloans need to be enabled, false otherwise - */ - function setReserveFlashLoaning(address asset, bool enabled) external; - - /** - * @notice Activate or deactivate a reserve - * @param asset The address of the underlying asset of the reserve - * @param active True if the reserve needs to be active, false otherwise - */ - function setReserveActive(address asset, bool active) external; - - /** - * @notice Freeze or unfreeze a reserve. A frozen reserve doesn't allow any new supply, borrow - * or rate swap but allows repayments, liquidations, rate rebalances and withdrawals. - * @param asset The address of the underlying asset of the reserve - * @param freeze True if the reserve needs to be frozen, false otherwise - */ - function setReserveFreeze(address asset, bool freeze) external; - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the - * borrowed amount will be accumulated in the isolated collateral's total debt exposure - * @dev Only assets of the same family (e.g. USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations - * @param asset The address of the underlying asset of the reserve - * @param borrowable True if the asset should be borrowable in isolation, false otherwise - */ - function setBorrowableInIsolation(address asset, bool borrowable) external; - - /** - * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, - * swap interest rate, liquidate, atoken transfers). - * @param asset The address of the underlying asset of the reserve - * @param paused True if pausing the reserve, false if unpausing - * @param gracePeriod Count of seconds after unpause during which liquidations will not be available - * - Only applicable whenever unpausing (`paused` as false) - * - Passing 0 means no grace period - * - Capped to maximum MAX_GRACE_PERIOD - */ - function setReservePause(address asset, bool paused, uint40 gracePeriod) external; - - /** - * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, - * swap interest rate, liquidate, atoken transfers). - * @dev Version with no grace period - * @param asset The address of the underlying asset of the reserve - * @param paused True if pausing the reserve, false if unpausing - */ - function setReservePause(address asset, bool paused) external; - - /** - * @notice Disables liquidation grace period for the asset. The liquidation grace period is set in the past - * so that liquidations are allowed for the asset. - * @param asset The address of the underlying asset of the reserve - */ - function disableLiquidationGracePeriod(address asset) external; - - /** - * @notice Updates the reserve factor of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newReserveFactor The new reserve factor of the reserve - */ - function setReserveFactor(address asset, uint256 newReserveFactor) external; - - /** - * @notice Sets the interest rate strategy of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newRateStrategyAddress The address of the new interest strategy contract - * @param rateData bytes-encoded rate data. In this format in order to allow the rate strategy contract - * to de-structure custom data - */ - function setReserveInterestRateStrategyAddress( - address asset, - address newRateStrategyAddress, - bytes calldata rateData - ) external; - - /** - * @notice Sets interest rate data for a reserve - * @param asset The address of the underlying asset of the reserve - * @param rateData bytes-encoded rate data. In this format in order to allow the rate strategy contract - * to de-structure custom data - */ - function setReserveInterestRateData(address asset, bytes calldata rateData) external; - - /** - * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions - * are suspended. - * @param paused True if protocol needs to be paused, false otherwise - * @param gracePeriod Count of seconds after unpause during which liquidations will not be available - * - Only applicable whenever unpausing (`paused` as false) - * - Passing 0 means no grace period - * - Capped to maximum MAX_GRACE_PERIOD - */ - function setPoolPause(bool paused, uint40 gracePeriod) external; - - /** - * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions - * are suspended. - * @dev Version with no grace period - * @param paused True if protocol needs to be paused, false otherwise - */ - function setPoolPause(bool paused) external; - - /** - * @notice Updates the borrow cap of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newBorrowCap The new borrow cap of the reserve - */ - function setBorrowCap(address asset, uint256 newBorrowCap) external; - - /** - * @notice Updates the supply cap of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newSupplyCap The new supply cap of the reserve - */ - function setSupplyCap(address asset, uint256 newSupplyCap) external; - - /** - * @notice Updates the liquidation protocol fee of reserve. - * @param asset The address of the underlying asset of the reserve - * @param newFee The new liquidation protocol fee of the reserve, expressed in bps - */ - function setLiquidationProtocolFee(address asset, uint256 newFee) external; - - /** - * @notice Updates the unbacked mint cap of reserve. - * @param asset The address of the underlying asset of the reserve - * @param newUnbackedMintCap The new unbacked mint cap of the reserve - */ - function setUnbackedMintCap(address asset, uint256 newUnbackedMintCap) external; - - /** - * @notice Enables/disables an asset to be borrowable in a selected eMode. - * - eMode.borrowable always has less priority then reserve.borrowable - * @param asset The address of the underlying asset of the reserve - * @param categoryId The eMode categoryId - * @param borrowable True if the asset should be borrowable in the given eMode category, false otherwise. - */ - function setAssetBorrowableInEMode(address asset, uint8 categoryId, bool borrowable) external; - - /** - * @notice Enables/disables an asset to be collateral in a selected eMode. - * @param asset The address of the underlying asset of the reserve - * @param categoryId The eMode categoryId - * @param collateral True if the asset should be collateral in the given eMode category, false otherwise. - */ - function setAssetCollateralInEMode(address asset, uint8 categoryId, bool collateral) external; - - /** - * @notice Adds a new efficiency mode (eMode) category or alters a existing one. - * @param categoryId The id of the category to be configured - * @param ltv The ltv associated with the category - * @param liquidationThreshold The liquidation threshold associated with the category - * @param liquidationBonus The liquidation bonus associated with the category - * @param label A label identifying the category - */ - function setEModeCategory( - uint8 categoryId, - uint16 ltv, - uint16 liquidationThreshold, - uint16 liquidationBonus, - string calldata label - ) external; - - /** - * @notice Drops a reserve entirely. - * @param asset The address of the reserve to drop - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the bridge fee collected by the protocol reserves. - * @param newBridgeProtocolFee The part of the fee sent to the protocol treasury, expressed in bps - */ - function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external; - - /** - * @notice Updates the total flash loan premium. - * Total flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra balance - * - A part is collected by the protocol reserves - * @dev Expressed in bps - * @dev The premium is calculated on the total amount borrowed - * @param newFlashloanPremiumTotal The total flashloan premium - */ - function updateFlashloanPremiumTotal(uint128 newFlashloanPremiumTotal) external; - - /** - * @notice Updates the flash loan premium collected by protocol reserves - * @dev Expressed in bps - * @dev The premium to protocol is calculated on the total flashloan premium - * @param newFlashloanPremiumToProtocol The part of the flashloan premium sent to the protocol treasury - */ - function updateFlashloanPremiumToProtocol(uint128 newFlashloanPremiumToProtocol) external; - - /** - * @notice Sets the debt ceiling for an asset. - * @param newDebtCeiling The new debt ceiling - */ - function setDebtCeiling(address asset, uint256 newDebtCeiling) external; - - /** - * @notice Sets siloed borrowing for an asset - * @param siloed The new siloed borrowing state - */ - function setSiloedBorrowing(address asset, bool siloed) external; - - /** - * @notice Gets pending ltv value - * @param asset The new siloed borrowing state - */ - function getPendingLtv(address asset) external view returns (uint256); - - /** - * @notice Gets the address of the external ConfiguratorLogic - */ - function getConfiguratorLogic() external view returns (address); - - /** - * @notice Gets the maximum liquidations grace period allowed, in seconds - */ - function MAX_GRACE_PERIOD() external view returns (uint40); -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol deleted file mode 100644 index a9df8903..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolDataProvider.sol +++ /dev/null @@ -1,250 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPoolDataProvider - * @author Aave - * @notice Defines the basic interface of a PoolDataProvider - */ -interface IPoolDataProvider { - struct TokenData { - string symbol; - address tokenAddress; - } - - /** - * @notice Returns the address for the PoolAddressesProvider contract. - * @return The address for the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the list of the existing reserves in the pool. - * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. - * @return The list of reserves, pairs of symbols and addresses - */ - function getAllReservesTokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the list of the existing ATokens in the pool. - * @return The list of ATokens, pairs of symbols and addresses - */ - function getAllATokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the configuration data of the reserve - * @dev Not returning borrow and supply caps for compatibility, nor pause flag - * @param asset The address of the underlying asset of the reserve - * @return decimals The number of decimals of the reserve - * @return ltv The ltv of the reserve - * @return liquidationThreshold The liquidationThreshold of the reserve - * @return liquidationBonus The liquidationBonus of the reserve - * @return reserveFactor The reserveFactor of the reserve - * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise - * @return borrowingEnabled True if borrowing is enabled, false otherwise - * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise - * @return isActive True if it is active, false otherwise - * @return isFrozen True if it is frozen, false otherwise - */ - function getReserveConfigurationData( - address asset - ) - external - view - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ); - - /** - * @notice Returns the caps parameters of the reserve - * @param asset The address of the underlying asset of the reserve - * @return borrowCap The borrow cap of the reserve - * @return supplyCap The supply cap of the reserve - */ - function getReserveCaps( - address asset - ) external view returns (uint256 borrowCap, uint256 supplyCap); - - /** - * @notice Returns if the pool is paused - * @param asset The address of the underlying asset of the reserve - * @return isPaused True if the pool is paused, false otherwise - */ - function getPaused(address asset) external view returns (bool isPaused); - - /** - * @notice Returns the siloed borrowing flag - * @param asset The address of the underlying asset of the reserve - * @return True if the asset is siloed for borrowing - */ - function getSiloedBorrowing(address asset) external view returns (bool); - - /** - * @notice Returns the protocol fee on the liquidation bonus - * @param asset The address of the underlying asset of the reserve - * @return The protocol fee on liquidation - */ - function getLiquidationProtocolFee(address asset) external view returns (uint256); - - /** - * @notice Returns the unbacked mint cap of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The unbacked mint cap of the reserve - */ - function getUnbackedMintCap(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The debt ceiling of the reserve - */ - function getDebtCeiling(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling decimals - * @return The debt ceiling decimals - */ - function getDebtCeilingDecimals() external pure returns (uint256); - - /** - * @notice Returns the reserve data - * @param asset The address of the underlying asset of the reserve - * @return unbacked The amount of unbacked tokens - * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted - * @return totalAToken The total supply of the aToken - * @return totalStableDebt The total stable debt of the reserve - * @return totalVariableDebt The total variable debt of the reserve - * @return liquidityRate The liquidity rate of the reserve - * @return variableBorrowRate The variable borrow rate of the reserve - * @return stableBorrowRate The stable borrow rate of the reserve - * @return averageStableBorrowRate The average stable borrow rate of the reserve - * @return liquidityIndex The liquidity index of the reserve - * @return variableBorrowIndex The variable borrow index of the reserve - * @return lastUpdateTimestamp The timestamp of the last update of the reserve - */ - function getReserveData( - address asset - ) - external - view - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ); - - /** - * @notice Returns the total supply of aTokens for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total supply of the aToken - */ - function getATokenTotalSupply(address asset) external view returns (uint256); - - /** - * @notice Returns the total debt for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total debt for asset - */ - function getTotalDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the user data in a reserve - * @param asset The address of the underlying asset of the reserve - * @param user The address of the user - * @return currentATokenBalance The current AToken balance of the user - * @return currentStableDebt The current stable debt of the user - * @return currentVariableDebt The current variable debt of the user - * @return principalStableDebt The principal stable debt of the user - * @return scaledVariableDebt The scaled variable debt of the user - * @return stableBorrowRate The stable borrow rate of the user - * @return liquidityRate The liquidity rate of the reserve - * @return stableRateLastUpdated The timestamp of the last update of the user stable rate - * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false - * otherwise - */ - function getUserReserveData( - address asset, - address user - ) - external - view - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ); - - /** - * @notice Returns the token addresses of the reserve - * @param asset The address of the underlying asset of the reserve - * @return aTokenAddress The AToken address of the reserve - * @return stableDebtTokenAddress DEPRECATED in v3.2.0 - * @return variableDebtTokenAddress The VariableDebtToken address of the reserve - */ - function getReserveTokensAddresses( - address asset - ) - external - view - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ); - - /** - * @notice Returns the address of the Interest Rate strategy - * @param asset The address of the underlying asset of the reserve - * @return irStrategyAddress The address of the Interest Rate strategy - */ - function getInterestRateStrategyAddress( - address asset - ) external view returns (address irStrategyAddress); - - /** - * @notice Returns whether the reserve has FlashLoans enabled or disabled - * @param asset The address of the underlying asset of the reserve - * @return True if FlashLoans are enabled, false otherwise - */ - function getFlashLoanEnabled(address asset) external view returns (bool); - - /** - * @notice Returns whether virtual accounting is enabled/not for a reserve - * @param asset The address of the underlying asset of the reserve - * @return True if active, false otherwise - */ - function getIsVirtualAccActive(address asset) external view returns (bool); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol deleted file mode 100644 index 252b4a4b..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {BaseUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol'; - -/** - * @title BaseImmutableAdminUpgradeabilityProxy - * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern - * @notice This contract combines an upgradeability proxy with an authorization - * mechanism for administrative tasks. - * @dev The admin role is stored in an immutable, which helps saving transactions costs - * All external functions in this contract must be guarded by the - * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity - * feature proposal that would enable this to be done automatically. - */ -contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - address internal immutable _admin; - - /** - * @dev Constructor. - * @param admin_ The address of the admin - */ - constructor(address admin_) { - _admin = admin_; - } - - modifier ifAdmin() { - if (msg.sender == _admin) { - _; - } else { - _fallback(); - } - } - - /** - * @notice Return the admin address - * @return The address of the proxy admin. - */ - function admin() external ifAdmin returns (address) { - return _admin; - } - - /** - * @notice Return the implementation address - * @return The address of the implementation. - */ - function implementation() external ifAdmin returns (address) { - return _implementation(); - } - - /** - * @notice Upgrade the backing implementation of the proxy. - * @dev Only the admin can call this function. - * @param newImplementation The address of the new implementation. - */ - function upgradeTo(address newImplementation) external ifAdmin { - _upgradeTo(newImplementation); - } - - /** - * @notice Upgrade the backing implementation of the proxy and call a function - * on the new implementation. - * @dev This is useful to initialize the proxied contract. - * @param newImplementation The address of the new implementation. - * @param data Data to send as msg.data in the low level call. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - */ - function upgradeToAndCall( - address newImplementation, - bytes calldata data - ) external payable ifAdmin { - _upgradeTo(newImplementation); - (bool success, ) = newImplementation.delegatecall(data); - require(success); - } - - /** - * @notice Only fall back when the sender is not the admin. - */ - function _willFallback() internal virtual override { - require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); - super._willFallback(); - } -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol deleted file mode 100644 index 6913a19d..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {InitializableUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol'; -import {Proxy} from '../../dependencies/openzeppelin/upgradeability/Proxy.sol'; -import {BaseImmutableAdminUpgradeabilityProxy} from './BaseImmutableAdminUpgradeabilityProxy.sol'; - -/** - * @title InitializableAdminUpgradeabilityProxy - * @author Aave - * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function - */ -contract InitializableImmutableAdminUpgradeabilityProxy is - BaseImmutableAdminUpgradeabilityProxy, - InitializableUpgradeabilityProxy -{ - /** - * @dev Constructor. - * @param admin The address of the admin - */ - constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { - // Intentionally left blank - } - - /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy - function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { - BaseImmutableAdminUpgradeabilityProxy._willFallback(); - } -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol deleted file mode 100644 index 1070227a..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol deleted file mode 100644 index c6b08dcc..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol +++ /dev/null @@ -1,223 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IPool} from '../../../interfaces/IPool.sol'; -import {IInitializableAToken} from '../../../interfaces/IInitializableAToken.sol'; -import {IInitializableDebtToken} from '../../../interfaces/IInitializableDebtToken.sol'; -import {InitializableImmutableAdminUpgradeabilityProxy} from '../../../misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {ConfiguratorInputTypes} from '../types/ConfiguratorInputTypes.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; - -/** - * @title ConfiguratorLogic library - * @author Aave - * @notice Implements the functions to initialize reserves and update aTokens and debtTokens - */ -library ConfiguratorLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPoolConfigurator` for descriptions - event ReserveInitialized( - address indexed asset, - address indexed aToken, - address stableDebtToken, - address variableDebtToken, - address interestRateStrategyAddress - ); - event ATokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - event VariableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @notice Initialize a reserve by creating and initializing aToken and variable debt token - * @dev Emits the `ReserveInitialized` event - * @param pool The Pool in which the reserve will be initialized - * @param input The needed parameters for the initialization - */ - function executeInitReserve( - IPool pool, - ConfiguratorInputTypes.InitReserveInput calldata input - ) external { - // It is an assumption that the asset listed is non-malicious, and the external call doesn't create re-entrancies - uint8 underlyingAssetDecimals = IERC20Detailed(input.underlyingAsset).decimals(); - require(underlyingAssetDecimals > 5, Errors.INVALID_DECIMALS); - - address aTokenProxyAddress = _initTokenWithProxy( - input.aTokenImpl, - abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - pool, - input.treasury, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.aTokenName, - input.aTokenSymbol, - input.params - ) - ); - - address variableDebtTokenProxyAddress = _initTokenWithProxy( - input.variableDebtTokenImpl, - abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - pool, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.variableDebtTokenName, - input.variableDebtTokenSymbol, - input.params - ) - ); - - pool.initReserve( - input.underlyingAsset, - aTokenProxyAddress, - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - - DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); - - currentConfig.setDecimals(underlyingAssetDecimals); - - currentConfig.setActive(true); - currentConfig.setPaused(false); - currentConfig.setFrozen(false); - currentConfig.setVirtualAccActive(input.useVirtualBalance); - - pool.setConfiguration(input.underlyingAsset, currentConfig); - - IReserveInterestRateStrategy(input.interestRateStrategyAddress).setInterestRateParams( - input.underlyingAsset, - input.interestRateData - ); - - emit ReserveInitialized( - input.underlyingAsset, - aTokenProxyAddress, - address(0), - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - } - - /** - * @notice Updates the aToken implementation and initializes it - * @dev Emits the `ATokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the aToken - * @param input The parameters needed for the initialize call - */ - function executeUpdateAToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateATokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - cachedPool, - input.treasury, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); - - emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); - } - - /** - * @notice Updates the variable debt token implementation and initializes it - * @dev Emits the `VariableDebtTokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the variable debt token - * @param input The parameters needed for the initialize call - */ - function executeUpdateVariableDebtToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - cachedPool, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation( - reserveData.variableDebtTokenAddress, - input.implementation, - encodedCall - ); - - emit VariableDebtTokenUpgraded( - input.asset, - reserveData.variableDebtTokenAddress, - input.implementation - ); - } - - /** - * @notice Creates a new proxy and initializes the implementation - * @param implementation The address of the implementation - * @param initParams The parameters that is passed to the implementation to initialize - * @return The address of initialized proxy - */ - function _initTokenWithProxy( - address implementation, - bytes memory initParams - ) internal returns (address) { - InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( - address(this) - ); - - proxy.initialize(implementation, initParams); - - return address(proxy); - } - - /** - * @notice Upgrades the implementation and makes call to the proxy - * @dev The call is used to initialize the new implementation. - * @param proxyAddress The address of the proxy - * @param implementation The address of the new implementation - * @param initParams The parameters to the call after the upgrade - */ - function _upgradeTokenImplementation( - address proxyAddress, - address implementation, - bytes memory initParams - ) internal { - InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( - payable(proxyAddress) - ); - - proxy.upgradeToAndCall(implementation, initParams); - } -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol deleted file mode 100644 index 7894871b..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library ConfiguratorInputTypes { - struct InitReserveInput { - address aTokenImpl; - address variableDebtTokenImpl; - bool useVirtualBalance; - address interestRateStrategyAddress; - address underlyingAsset; - address treasury; - address incentivesController; - string aTokenName; - string aTokenSymbol; - string variableDebtTokenName; - string variableDebtTokenSymbol; - bytes params; - bytes interestRateData; - } - - struct UpdateATokenInput { - address asset; - address treasury; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } - - struct UpdateDebtTokenInput { - address asset; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/pool/PoolConfigurator.sol b/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/pool/PoolConfigurator.sol deleted file mode 100644 index 778ee79b..00000000 --- a/downloads/ARBITRUM/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/pool/PoolConfigurator.sol +++ /dev/null @@ -1,630 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '../../misc/aave-upgradeability/VersionedInitializable.sol'; -import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; -import {EModeConfiguration} from '../libraries/configuration/EModeConfiguration.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {IDefaultInterestRateStrategyV2} from '../../interfaces/IDefaultInterestRateStrategyV2.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; -import {PercentageMath} from '../libraries/math/PercentageMath.sol'; -import {DataTypes} from '../libraries/types/DataTypes.sol'; -import {ConfiguratorLogic} from '../libraries/logic/ConfiguratorLogic.sol'; -import {ConfiguratorInputTypes} from '../libraries/types/ConfiguratorInputTypes.sol'; -import {IPoolConfigurator} from '../../interfaces/IPoolConfigurator.sol'; -import {IPool} from '../../interfaces/IPool.sol'; -import {IACLManager} from '../../interfaces/IACLManager.sol'; -import {IPoolDataProvider} from '../../interfaces/IPoolDataProvider.sol'; -import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; - -/** - * @title PoolConfigurator - * @author Aave - * @dev Implements the configuration methods for the Aave protocol - */ -abstract contract PoolConfigurator is VersionedInitializable, IPoolConfigurator { - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - IPoolAddressesProvider internal _addressesProvider; - IPool internal _pool; - - mapping(address => uint256) internal _pendingLtv; - - uint40 public constant MAX_GRACE_PERIOD = 4 hours; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - _onlyPoolAdmin(); - _; - } - - /** - * @dev Only emergency or pool admin can call functions marked by this modifier. - */ - modifier onlyEmergencyOrPoolAdmin() { - _onlyPoolOrEmergencyAdmin(); - _; - } - - /** - * @dev Only asset listing or pool admin can call functions marked by this modifier. - */ - modifier onlyAssetListingOrPoolAdmins() { - _onlyAssetListingOrPoolAdmins(); - _; - } - - /** - * @dev Only risk or pool admin can call functions marked by this modifier. - */ - modifier onlyRiskOrPoolAdmins() { - _onlyRiskOrPoolAdmins(); - _; - } - - /** - * @dev Only risk, pool or emergency admin can call functions marked by this modifier. - */ - modifier onlyRiskOrPoolOrEmergencyAdmins() { - _onlyRiskOrPoolOrEmergencyAdmins(); - _; - } - - function initialize(IPoolAddressesProvider provider) public virtual; - - /// @inheritdoc IPoolConfigurator - function initReserves( - ConfiguratorInputTypes.InitReserveInput[] calldata input - ) external override onlyAssetListingOrPoolAdmins { - IPool cachedPool = _pool; - - for (uint256 i = 0; i < input.length; i++) { - ConfiguratorLogic.executeInitReserve(cachedPool, input[i]); - emit ReserveInterestRateDataChanged( - input[i].underlyingAsset, - input[i].interestRateStrategyAddress, - input[i].interestRateData - ); - } - } - - /// @inheritdoc IPoolConfigurator - function dropReserve(address asset) external override onlyPoolAdmin { - _pool.dropReserve(asset); - emit ReserveDropped(asset); - } - - /// @inheritdoc IPoolConfigurator - function updateAToken( - ConfiguratorInputTypes.UpdateATokenInput calldata input - ) external override onlyPoolAdmin { - ConfiguratorLogic.executeUpdateAToken(_pool, input); - } - - /// @inheritdoc IPoolConfigurator - function updateVariableDebtToken( - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external override onlyPoolAdmin { - ConfiguratorLogic.executeUpdateVariableDebtToken(_pool, input); - } - - /// @inheritdoc IPoolConfigurator - function setReserveBorrowing(address asset, bool enabled) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setBorrowingEnabled(enabled); - _pool.setConfiguration(asset, currentConfig); - emit ReserveBorrowing(asset, enabled); - } - - /// @inheritdoc IPoolConfigurator - function configureReserveAsCollateral( - address asset, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus - ) external override onlyRiskOrPoolAdmins { - //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_RESERVE_PARAMS); - - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - if (liquidationThreshold != 0) { - //liquidation bonus must be bigger than 100.00%, otherwise the liquidator would receive less - //collateral than needed to cover the debt - require(liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_PARAMS); - - //if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment - //a loan is taken there is enough collateral available to cover the liquidation bonus - require( - liquidationThreshold.percentMul(liquidationBonus) <= PercentageMath.PERCENTAGE_FACTOR, - Errors.INVALID_RESERVE_PARAMS - ); - } else { - require(liquidationBonus == 0, Errors.INVALID_RESERVE_PARAMS); - //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 supplied - _checkNoSuppliers(asset); - } - - uint256 newLtv = ltv; - - if (currentConfig.getFrozen()) { - _pendingLtv[asset] = ltv; - newLtv = 0; - - emit PendingLtvChanged(asset, ltv); - } else { - currentConfig.setLtv(ltv); - } - - currentConfig.setLiquidationThreshold(liquidationThreshold); - currentConfig.setLiquidationBonus(liquidationBonus); - - _pool.setConfiguration(asset, currentConfig); - - emit CollateralConfigurationChanged(asset, newLtv, liquidationThreshold, liquidationBonus); - } - - /// @inheritdoc IPoolConfigurator - function setReserveFlashLoaning( - address asset, - bool enabled - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - currentConfig.setFlashLoanEnabled(enabled); - _pool.setConfiguration(asset, currentConfig); - emit ReserveFlashLoaning(asset, enabled); - } - - /// @inheritdoc IPoolConfigurator - function setReserveActive(address asset, bool active) external override onlyPoolAdmin { - if (!active) _checkNoSuppliers(asset); - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setActive(active); - _pool.setConfiguration(asset, currentConfig); - emit ReserveActive(asset, active); - } - - /// @inheritdoc IPoolConfigurator - function setReserveFreeze( - address asset, - bool freeze - ) external override onlyRiskOrPoolOrEmergencyAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - require(freeze != currentConfig.getFrozen(), Errors.INVALID_FREEZE_STATE); - - currentConfig.setFrozen(freeze); - - uint256 ltvSet; - uint256 pendingLtvSet; - - if (freeze) { - pendingLtvSet = currentConfig.getLtv(); - _pendingLtv[asset] = pendingLtvSet; - currentConfig.setLtv(0); - } else { - ltvSet = _pendingLtv[asset]; - currentConfig.setLtv(ltvSet); - delete _pendingLtv[asset]; - } - - emit PendingLtvChanged(asset, pendingLtvSet); - emit CollateralConfigurationChanged( - asset, - ltvSet, - currentConfig.getLiquidationThreshold(), - currentConfig.getLiquidationBonus() - ); - - _pool.setConfiguration(asset, currentConfig); - emit ReserveFrozen(asset, freeze); - } - - /// @inheritdoc IPoolConfigurator - function setBorrowableInIsolation( - address asset, - bool borrowable - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setBorrowableInIsolation(borrowable); - _pool.setConfiguration(asset, currentConfig); - emit BorrowableInIsolationChanged(asset, borrowable); - } - - /// @inheritdoc IPoolConfigurator - function setReservePause( - address asset, - bool paused, - uint40 gracePeriod - ) public override onlyEmergencyOrPoolAdmin { - if (!paused && gracePeriod != 0) { - require(gracePeriod <= MAX_GRACE_PERIOD, Errors.INVALID_GRACE_PERIOD); - - uint40 until = uint40(block.timestamp) + gracePeriod; - _pool.setLiquidationGracePeriod(asset, until); - emit LiquidationGracePeriodChanged(asset, until); - } - - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setPaused(paused); - _pool.setConfiguration(asset, currentConfig); - emit ReservePaused(asset, paused); - } - - /// @inheritdoc IPoolConfigurator - function setReservePause(address asset, bool paused) external override onlyEmergencyOrPoolAdmin { - setReservePause(asset, paused, 0); - } - - /// @inheritdoc IPoolConfigurator - function disableLiquidationGracePeriod(address asset) external override onlyEmergencyOrPoolAdmin { - // set the liquidation grace period in the past to disable liquidation grace period - _pool.setLiquidationGracePeriod(asset, 0); - - emit LiquidationGracePeriodDisabled(asset); - } - - /// @inheritdoc IPoolConfigurator - function setReserveFactor( - address asset, - uint256 newReserveFactor - ) external override onlyRiskOrPoolAdmins { - require(newReserveFactor <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - _pool.syncIndexesState(asset); - - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldReserveFactor = currentConfig.getReserveFactor(); - currentConfig.setReserveFactor(newReserveFactor); - _pool.setConfiguration(asset, currentConfig); - emit ReserveFactorChanged(asset, oldReserveFactor, newReserveFactor); - - _pool.syncRatesState(asset); - } - - /// @inheritdoc IPoolConfigurator - function setDebtCeiling( - address asset, - uint256 newDebtCeiling - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - uint256 oldDebtCeiling = currentConfig.getDebtCeiling(); - if (currentConfig.getLiquidationThreshold() != 0 && oldDebtCeiling == 0) { - _checkNoSuppliers(asset); - } - currentConfig.setDebtCeiling(newDebtCeiling); - _pool.setConfiguration(asset, currentConfig); - - if (newDebtCeiling == 0) { - _pool.resetIsolationModeTotalDebt(asset); - } - - emit DebtCeilingChanged(asset, oldDebtCeiling, newDebtCeiling); - } - - /// @inheritdoc IPoolConfigurator - function setSiloedBorrowing( - address asset, - bool newSiloed - ) external override onlyRiskOrPoolAdmins { - if (newSiloed) { - _checkNoBorrowers(asset); - } - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - bool oldSiloed = currentConfig.getSiloedBorrowing(); - - currentConfig.setSiloedBorrowing(newSiloed); - - _pool.setConfiguration(asset, currentConfig); - - emit SiloedBorrowingChanged(asset, oldSiloed, newSiloed); - } - - /// @inheritdoc IPoolConfigurator - function setBorrowCap( - address asset, - uint256 newBorrowCap - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldBorrowCap = currentConfig.getBorrowCap(); - currentConfig.setBorrowCap(newBorrowCap); - _pool.setConfiguration(asset, currentConfig); - emit BorrowCapChanged(asset, oldBorrowCap, newBorrowCap); - } - - /// @inheritdoc IPoolConfigurator - function setSupplyCap( - address asset, - uint256 newSupplyCap - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldSupplyCap = currentConfig.getSupplyCap(); - currentConfig.setSupplyCap(newSupplyCap); - _pool.setConfiguration(asset, currentConfig); - emit SupplyCapChanged(asset, oldSupplyCap, newSupplyCap); - } - - /// @inheritdoc IPoolConfigurator - function setLiquidationProtocolFee( - address asset, - uint256 newFee - ) external override onlyRiskOrPoolAdmins { - require(newFee <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_LIQUIDATION_PROTOCOL_FEE); - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldFee = currentConfig.getLiquidationProtocolFee(); - currentConfig.setLiquidationProtocolFee(newFee); - _pool.setConfiguration(asset, currentConfig); - emit LiquidationProtocolFeeChanged(asset, oldFee, newFee); - } - - /// @inheritdoc IPoolConfigurator - function setEModeCategory( - uint8 categoryId, - uint16 ltv, - uint16 liquidationThreshold, - uint16 liquidationBonus, - string calldata label - ) external override onlyRiskOrPoolAdmins { - require(ltv != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); - require(liquidationThreshold != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); - - // 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_EMODE_CATEGORY_PARAMS); - require( - liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, - Errors.INVALID_EMODE_CATEGORY_PARAMS - ); - - // if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment - // a loan is taken there is enough collateral available to cover the liquidation bonus - require( - uint256(liquidationThreshold).percentMul(liquidationBonus) <= - PercentageMath.PERCENTAGE_FACTOR, - Errors.INVALID_EMODE_CATEGORY_PARAMS - ); - - DataTypes.EModeCategoryBaseConfiguration memory categoryData; - categoryData.ltv = ltv; - categoryData.liquidationThreshold = liquidationThreshold; - categoryData.liquidationBonus = liquidationBonus; - categoryData.label = label; - - _pool.configureEModeCategory(categoryId, categoryData); - emit EModeCategoryAdded( - categoryId, - ltv, - liquidationThreshold, - liquidationBonus, - address(0), - label - ); - } - - /// @inheritdoc IPoolConfigurator - function setAssetCollateralInEMode( - address asset, - uint8 categoryId, - bool allowed - ) external override onlyRiskOrPoolAdmins { - uint128 collateralBitmap = _pool.getEModeCategoryCollateralBitmap(categoryId); - DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); - require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED); - collateralBitmap = EModeConfiguration.setReserveBitmapBit( - collateralBitmap, - reserveData.id, - allowed - ); - _pool.configureEModeCategoryCollateralBitmap(categoryId, collateralBitmap); - emit AssetCollateralInEModeChanged(asset, categoryId, allowed); - } - - /// @inheritdoc IPoolConfigurator - function setAssetBorrowableInEMode( - address asset, - uint8 categoryId, - bool borrowable - ) external override onlyRiskOrPoolAdmins { - uint128 borrowableBitmap = _pool.getEModeCategoryBorrowableBitmap(categoryId); - DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); - require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED); - borrowableBitmap = EModeConfiguration.setReserveBitmapBit( - borrowableBitmap, - reserveData.id, - borrowable - ); - _pool.configureEModeCategoryBorrowableBitmap(categoryId, borrowableBitmap); - emit AssetBorrowableInEModeChanged(asset, categoryId, borrowable); - } - - /// @inheritdoc IPoolConfigurator - function setUnbackedMintCap( - address asset, - uint256 newUnbackedMintCap - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldUnbackedMintCap = currentConfig.getUnbackedMintCap(); - currentConfig.setUnbackedMintCap(newUnbackedMintCap); - _pool.setConfiguration(asset, currentConfig); - emit UnbackedMintCapChanged(asset, oldUnbackedMintCap, newUnbackedMintCap); - } - - /// @inheritdoc IPoolConfigurator - function setReserveInterestRateData( - address asset, - bytes calldata rateData - ) external onlyRiskOrPoolAdmins { - DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset); - _updateInterestRateStrategy(asset, reserve, reserve.interestRateStrategyAddress, rateData); - } - - /// @inheritdoc IPoolConfigurator - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress, - bytes calldata rateData - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset); - _updateInterestRateStrategy(asset, reserve, rateStrategyAddress, rateData); - } - - /// @inheritdoc IPoolConfigurator - function setPoolPause(bool paused, uint40 gracePeriod) public override onlyEmergencyOrPoolAdmin { - address[] memory reserves = _pool.getReservesList(); - - for (uint256 i = 0; i < reserves.length; i++) { - if (reserves[i] != address(0)) { - setReservePause(reserves[i], paused, gracePeriod); - } - } - } - - /// @inheritdoc IPoolConfigurator - function setPoolPause(bool paused) external override onlyEmergencyOrPoolAdmin { - setPoolPause(paused, 0); - } - - /// @inheritdoc IPoolConfigurator - function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external override onlyPoolAdmin { - require( - newBridgeProtocolFee <= PercentageMath.PERCENTAGE_FACTOR, - Errors.BRIDGE_PROTOCOL_FEE_INVALID - ); - uint256 oldBridgeProtocolFee = _pool.BRIDGE_PROTOCOL_FEE(); - _pool.updateBridgeProtocolFee(newBridgeProtocolFee); - emit BridgeProtocolFeeUpdated(oldBridgeProtocolFee, newBridgeProtocolFee); - } - - /// @inheritdoc IPoolConfigurator - function updateFlashloanPremiumTotal( - uint128 newFlashloanPremiumTotal - ) external override onlyPoolAdmin { - require( - newFlashloanPremiumTotal <= PercentageMath.PERCENTAGE_FACTOR, - Errors.FLASHLOAN_PREMIUM_INVALID - ); - uint128 oldFlashloanPremiumTotal = _pool.FLASHLOAN_PREMIUM_TOTAL(); - _pool.updateFlashloanPremiums(newFlashloanPremiumTotal, _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL()); - emit FlashloanPremiumTotalUpdated(oldFlashloanPremiumTotal, newFlashloanPremiumTotal); - } - - /// @inheritdoc IPoolConfigurator - function updateFlashloanPremiumToProtocol( - uint128 newFlashloanPremiumToProtocol - ) external override onlyPoolAdmin { - require( - newFlashloanPremiumToProtocol <= PercentageMath.PERCENTAGE_FACTOR, - Errors.FLASHLOAN_PREMIUM_INVALID - ); - uint128 oldFlashloanPremiumToProtocol = _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL(); - _pool.updateFlashloanPremiums(_pool.FLASHLOAN_PREMIUM_TOTAL(), newFlashloanPremiumToProtocol); - emit FlashloanPremiumToProtocolUpdated( - oldFlashloanPremiumToProtocol, - newFlashloanPremiumToProtocol - ); - } - - /// @inheritdoc IPoolConfigurator - function getPendingLtv(address asset) external view override returns (uint256) { - return _pendingLtv[asset]; - } - - /// @inheritdoc IPoolConfigurator - function getConfiguratorLogic() external pure returns (address) { - return address(ConfiguratorLogic); - } - - function _updateInterestRateStrategy( - address asset, - DataTypes.ReserveDataLegacy memory reserve, - address newRateStrategyAddress, - bytes calldata rateData - ) internal { - address oldRateStrategyAddress = reserve.interestRateStrategyAddress; - - _pool.syncIndexesState(asset); - - IDefaultInterestRateStrategyV2(newRateStrategyAddress).setInterestRateParams(asset, rateData); - emit ReserveInterestRateDataChanged(asset, newRateStrategyAddress, rateData); - - if (oldRateStrategyAddress != newRateStrategyAddress) { - _pool.setReserveInterestRateStrategyAddress(asset, newRateStrategyAddress); - emit ReserveInterestRateStrategyChanged( - asset, - oldRateStrategyAddress, - newRateStrategyAddress - ); - } - - _pool.syncRatesState(asset); - } - - function _checkNoSuppliers(address asset) internal view { - DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); - uint256 totalSupplied = IPoolDataProvider(_addressesProvider.getPoolDataProvider()) - .getATokenTotalSupply(asset); - - require( - totalSupplied == 0 && reserveData.accruedToTreasury == 0, - Errors.RESERVE_LIQUIDITY_NOT_ZERO - ); - } - - function _checkNoBorrowers(address asset) internal view { - uint256 totalDebt = IPoolDataProvider(_addressesProvider.getPoolDataProvider()).getTotalDebt( - asset - ); - require(totalDebt == 0, Errors.RESERVE_DEBT_NOT_ZERO); - } - - function _onlyPoolAdmin() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - } - - function _onlyPoolOrEmergencyAdmin() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isPoolAdmin(msg.sender) || aclManager.isEmergencyAdmin(msg.sender), - Errors.CALLER_NOT_POOL_OR_EMERGENCY_ADMIN - ); - } - - function _onlyAssetListingOrPoolAdmins() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), - Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN - ); - } - - function _onlyRiskOrPoolAdmins() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isRiskAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), - Errors.CALLER_NOT_RISK_OR_POOL_ADMIN - ); - } - - function _onlyRiskOrPoolOrEmergencyAdmins() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isRiskAdmin(msg.sender) || - aclManager.isPoolAdmin(msg.sender) || - aclManager.isEmergencyAdmin(msg.sender), - Errors.CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN - ); - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC.sol b/downloads/ARBITRUM/POOL_LOGIC.sol deleted file mode 100644 index a04f0bbb..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC.sol +++ /dev/null @@ -1,5723 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} - -// downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol - -/** - * @title PoolLogic library - * @author Aave - * @notice Implements the logic for Pool specific functions - */ -library PoolLogic { - using GPv2SafeERC20 for IERC20; - using WadRayMath for uint256; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice Initialize an asset reserve and add the reserve to the list of reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param params Additional parameters needed for initiation - * @return true if appended, false if inserted at existing empty spot - */ - function executeInitReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.InitReserveParams memory params - ) external returns (bool) { - require(Address.isContract(params.asset), Errors.NOT_CONTRACT); - reservesData[params.asset].init( - params.aTokenAddress, - params.variableDebtAddress, - params.interestRateStrategyAddress - ); - - bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || - reservesList[0] == params.asset; - require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); - - for (uint16 i = 0; i < params.reservesCount; i++) { - if (reservesList[i] == address(0)) { - reservesData[params.asset].id = i; - reservesList[i] = params.asset; - return false; - } - } - - require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); - reservesData[params.asset].id = params.reservesCount; - reservesList[params.reservesCount] = params.asset; - return true; - } - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function executeRescueTokens(address token, address to, uint256 amount) external { - IERC20(token).safeTransfer(to, amount); - } - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param reservesData The state of all the reserves - * @param assets The list of reserves for which the minting needs to be executed - */ - function executeMintToTreasury( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] calldata assets - ) external { - for (uint256 i = 0; i < assets.length; i++) { - address assetAddress = assets[i]; - - DataTypes.ReserveData storage reserve = reservesData[assetAddress]; - - // this cover both inactive reserves and invalid reserves since the flag will be 0 for both - if (!reserve.configuration.getActive()) { - continue; - } - - uint256 accruedToTreasury = reserve.accruedToTreasury; - - if (accruedToTreasury != 0) { - reserve.accruedToTreasury = 0; - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); - IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); - - emit MintedToTreasury(assetAddress, amountToMint); - } - } - } - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function executeResetIsolationModeTotalDebt( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset - ) external { - require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); - reservesData[asset].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(asset, 0); - } - - /** - * @notice Sets the liquidation grace period of the asset - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - */ - function executeSetLiquidationGracePeriod( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset, - uint40 until - ) external { - reservesData[asset].liquidationGracePeriodUntil = until; - } - - /** - * @notice Drop a reserve - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param asset The address of the underlying asset of the reserve - */ - function executeDropReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - address asset - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - ValidationLogic.validateDropReserve(reservesList, reserve, asset); - reservesList[reservesData[asset].id] = address(0); - delete reservesData[asset]; - } - - /** - * @notice Returns the user account data across all the reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the calculation - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function executeGetUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ) - { - ( - totalCollateralBase, - totalDebtBase, - ltv, - currentLiquidationThreshold, - healthFactor, - - ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); - - availableBorrowsBase = GenericLogic.calculateAvailableBorrows( - totalCollateralBase, - totalDebtBase, - ltv - ); - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 01e1bcaf..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,833 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index e7ba8f7a..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 43987f47..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,583 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index 647fc7e7..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index cd5b83c6..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol deleted file mode 100644 index 1558fe55..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol +++ /dev/null @@ -1,201 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; - -/** - * @title PoolLogic library - * @author Aave - * @notice Implements the logic for Pool specific functions - */ -library PoolLogic { - using GPv2SafeERC20 for IERC20; - using WadRayMath for uint256; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice Initialize an asset reserve and add the reserve to the list of reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param params Additional parameters needed for initiation - * @return true if appended, false if inserted at existing empty spot - */ - function executeInitReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.InitReserveParams memory params - ) external returns (bool) { - require(Address.isContract(params.asset), Errors.NOT_CONTRACT); - reservesData[params.asset].init( - params.aTokenAddress, - params.variableDebtAddress, - params.interestRateStrategyAddress - ); - - bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || - reservesList[0] == params.asset; - require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); - - for (uint16 i = 0; i < params.reservesCount; i++) { - if (reservesList[i] == address(0)) { - reservesData[params.asset].id = i; - reservesList[i] = params.asset; - return false; - } - } - - require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); - reservesData[params.asset].id = params.reservesCount; - reservesList[params.reservesCount] = params.asset; - return true; - } - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function executeRescueTokens(address token, address to, uint256 amount) external { - IERC20(token).safeTransfer(to, amount); - } - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param reservesData The state of all the reserves - * @param assets The list of reserves for which the minting needs to be executed - */ - function executeMintToTreasury( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] calldata assets - ) external { - for (uint256 i = 0; i < assets.length; i++) { - address assetAddress = assets[i]; - - DataTypes.ReserveData storage reserve = reservesData[assetAddress]; - - // this cover both inactive reserves and invalid reserves since the flag will be 0 for both - if (!reserve.configuration.getActive()) { - continue; - } - - uint256 accruedToTreasury = reserve.accruedToTreasury; - - if (accruedToTreasury != 0) { - reserve.accruedToTreasury = 0; - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); - IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); - - emit MintedToTreasury(assetAddress, amountToMint); - } - } - } - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function executeResetIsolationModeTotalDebt( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset - ) external { - require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); - reservesData[asset].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(asset, 0); - } - - /** - * @notice Sets the liquidation grace period of the asset - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - */ - function executeSetLiquidationGracePeriod( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset, - uint40 until - ) external { - reservesData[asset].liquidationGracePeriodUntil = until; - } - - /** - * @notice Drop a reserve - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param asset The address of the underlying asset of the reserve - */ - function executeDropReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - address asset - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - ValidationLogic.validateDropReserve(reservesList, reserve, asset); - reservesList[reservesData[asset].id] = address(0); - delete reservesData[asset]; - } - - /** - * @notice Returns the user account data across all the reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the calculation - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function executeGetUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ) - { - ( - totalCollateralBase, - totalDebtBase, - ltv, - currentLiquidationThreshold, - healthFactor, - - ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); - - availableBorrowsBase = GenericLogic.calculateAvailableBorrows( - totalCollateralBase, - totalDebtBase, - ltv - ); - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index dd5c637d..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index e08a30e8..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index 9adca939..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/ARBITRUM/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC.sol b/downloads/ARBITRUM/SUPPLY_LOGIC.sol deleted file mode 100644 index 99515df3..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC.sol +++ /dev/null @@ -1,5822 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} - -// downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol - -/** - * @title SupplyLogic library - * @author Aave - * @notice Implements the base logic for supply/withdraw - */ -library SupplyLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. - * @dev Emits the `Supply()` event. - * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as - * collateral. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the supply function - */ - function executeSupply( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSupplyParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, reserve, params.amount, params.onBehalfOf); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, params.amount, 0); - - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - params.onBehalfOf, - params.amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration, - reserveCache.aTokenAddress - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); - } - } - - emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); - } - - /** - * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset - * previously supplied in the Aave protocol. - * @dev Emits the `Withdraw()` event. - * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the withdraw function - * @return The actual amount withdrawn - */ - function executeWithdraw( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteWithdrawParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - require(params.to != reserveCache.aTokenAddress, Errors.WITHDRAW_TO_ATOKEN); - - reserve.updateState(reserveCache); - - uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( - reserveCache.nextLiquidityIndex - ); - - uint256 amountToWithdraw = params.amount; - - if (params.amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - - ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, amountToWithdraw); - - bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); - - if (isCollateral && amountToWithdraw == userBalance) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - params.to, - amountToWithdraw, - reserveCache.nextLiquidityIndex - ); - - if (isCollateral && userConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - params.asset, - msg.sender, - params.reservesCount, - params.oracle, - params.userEModeCategory - ); - } - - emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); - - return amountToWithdraw; - } - - /** - * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid - * collateralization constraints violation. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as - * collateral. - * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param params The additional parameters needed to execute the finalizeTransfer function - */ - function executeFinalizeTransfer( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.FinalizeTransferParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - - ValidationLogic.validateTransfer(reserve); - - uint256 reserveId = reserve.id; - uint256 scaledAmount = params.amount.rayDiv(reserve.getNormalizedIncome()); - - if (params.from != params.to && scaledAmount != 0) { - DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; - - if (fromConfig.isUsingAsCollateral(reserveId)) { - if (fromConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - usersConfig[params.from], - params.asset, - params.from, - params.reservesCount, - params.oracle, - params.fromEModeCategory - ); - } - if (params.balanceFromBefore == params.amount) { - fromConfig.setUsingAsCollateral(reserveId, false); - emit ReserveUsedAsCollateralDisabled(params.asset, params.from); - } - } - - if (params.balanceToBefore == 0) { - DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - toConfig, - reserve.configuration, - reserve.aTokenAddress - ) - ) { - toConfig.setUsingAsCollateral(reserveId, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.to); - } - } - } - } - - /** - * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as - * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor - * checks to ensure collateralization. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. - * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The users configuration mapping that track the supplied/borrowed assets - * @param asset The address of the asset being configured as collateral - * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise - * @param reservesCount The number of initialized reserves - * @param priceOracle The address of the price oracle - * @param userEModeCategory The eMode category chosen by the user - */ - function executeUseReserveAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - bool useAsCollateral, - uint256 reservesCount, - address priceOracle, - uint8 userEModeCategory - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); - - ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); - - if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; - - if (useAsCollateral) { - require( - ValidationLogic.validateUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration - ), - Errors.USER_IN_ISOLATION_MODE_OR_LTV_ZERO - ); - - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, msg.sender); - } else { - userConfig.setUsingAsCollateral(reserve.id, false); - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - asset, - msg.sender, - reservesCount, - priceOracle, - userEModeCategory - ); - - emit ReserveUsedAsCollateralDisabled(asset, msg.sender); - } - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 01e1bcaf..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,833 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index e7ba8f7a..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 43987f47..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,583 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index 647fc7e7..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index cd5b83c6..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index dd5c637d..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol deleted file mode 100644 index 727886e7..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol +++ /dev/null @@ -1,300 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; - -/** - * @title SupplyLogic library - * @author Aave - * @notice Implements the base logic for supply/withdraw - */ -library SupplyLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. - * @dev Emits the `Supply()` event. - * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as - * collateral. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the supply function - */ - function executeSupply( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSupplyParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, reserve, params.amount, params.onBehalfOf); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, params.amount, 0); - - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - params.onBehalfOf, - params.amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration, - reserveCache.aTokenAddress - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); - } - } - - emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); - } - - /** - * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset - * previously supplied in the Aave protocol. - * @dev Emits the `Withdraw()` event. - * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the withdraw function - * @return The actual amount withdrawn - */ - function executeWithdraw( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteWithdrawParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - require(params.to != reserveCache.aTokenAddress, Errors.WITHDRAW_TO_ATOKEN); - - reserve.updateState(reserveCache); - - uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( - reserveCache.nextLiquidityIndex - ); - - uint256 amountToWithdraw = params.amount; - - if (params.amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - - ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, amountToWithdraw); - - bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); - - if (isCollateral && amountToWithdraw == userBalance) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - params.to, - amountToWithdraw, - reserveCache.nextLiquidityIndex - ); - - if (isCollateral && userConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - params.asset, - msg.sender, - params.reservesCount, - params.oracle, - params.userEModeCategory - ); - } - - emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); - - return amountToWithdraw; - } - - /** - * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid - * collateralization constraints violation. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as - * collateral. - * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param params The additional parameters needed to execute the finalizeTransfer function - */ - function executeFinalizeTransfer( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.FinalizeTransferParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - - ValidationLogic.validateTransfer(reserve); - - uint256 reserveId = reserve.id; - uint256 scaledAmount = params.amount.rayDiv(reserve.getNormalizedIncome()); - - if (params.from != params.to && scaledAmount != 0) { - DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; - - if (fromConfig.isUsingAsCollateral(reserveId)) { - if (fromConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - usersConfig[params.from], - params.asset, - params.from, - params.reservesCount, - params.oracle, - params.fromEModeCategory - ); - } - if (params.balanceFromBefore == params.amount) { - fromConfig.setUsingAsCollateral(reserveId, false); - emit ReserveUsedAsCollateralDisabled(params.asset, params.from); - } - } - - if (params.balanceToBefore == 0) { - DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - toConfig, - reserve.configuration, - reserve.aTokenAddress - ) - ) { - toConfig.setUsingAsCollateral(reserveId, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.to); - } - } - } - } - - /** - * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as - * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor - * checks to ensure collateralization. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. - * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The users configuration mapping that track the supplied/borrowed assets - * @param asset The address of the asset being configured as collateral - * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise - * @param reservesCount The number of initialized reserves - * @param priceOracle The address of the price oracle - * @param userEModeCategory The eMode category chosen by the user - */ - function executeUseReserveAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - bool useAsCollateral, - uint256 reservesCount, - address priceOracle, - uint8 userEModeCategory - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); - - ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); - - if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; - - if (useAsCollateral) { - require( - ValidationLogic.validateUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration - ), - Errors.USER_IN_ISOLATION_MODE_OR_LTV_ZERO - ); - - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, msg.sender); - } else { - userConfig.setUsingAsCollateral(reserve.id, false); - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - asset, - msg.sender, - reservesCount, - priceOracle, - userEModeCategory - ); - - emit ReserveUsedAsCollateralDisabled(asset, msg.sender); - } - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index e08a30e8..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index 9adca939..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/ARBITRUM/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER.sol deleted file mode 100644 index d31e3f77..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER.sol +++ /dev/null @@ -1,4044 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol - -/** - * @title IRewardsDistributor - * @author Aave - * @notice Defines the basic interface for a Rewards Distributor. - */ -interface IRewardsDistributor { - /** - * @dev Emitted when the configuration of the rewards of an asset is updated. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param oldEmission The old emissions per second value of the reward distribution - * @param newEmission The new emissions per second value of the reward distribution - * @param oldDistributionEnd The old end timestamp of the reward distribution - * @param newDistributionEnd The new end timestamp of the reward distribution - * @param assetIndex The index of the asset distribution - */ - event AssetConfigUpdated( - address indexed asset, - address indexed reward, - uint256 oldEmission, - uint256 newEmission, - uint256 oldDistributionEnd, - uint256 newDistributionEnd, - uint256 assetIndex - ); - - /** - * @dev Emitted when rewards of an asset are accrued on behalf of a user. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param user The address of the user that rewards are accrued on behalf of - * @param assetIndex The index of the asset distribution - * @param userIndex The index of the asset distribution on behalf of the user - * @param rewardsAccrued The amount of rewards accrued - */ - event Accrued( - address indexed asset, - address indexed reward, - address indexed user, - uint256 assetIndex, - uint256 userIndex, - uint256 rewardsAccrued - ); - - /** - * @dev Sets the end date for the distribution - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Gets the end date for the distribution - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The timestamp with the end of the distribution, in unix time format - **/ - function getDistributionEnd(address asset, address reward) external view returns (uint256); - - /** - * @dev Returns the index of a user on a reward distribution - * @param user Address of the user - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The current user asset index, not including new distributions - **/ - function getUserAssetIndex( - address user, - address asset, - address reward - ) external view returns (uint256); - - /** - * @dev Returns the configuration of the distribution reward for a certain asset - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The index of the asset distribution - * @return The emission per second of the reward distribution - * @return The timestamp of the last update of the index - * @return The timestamp of the distribution end - **/ - function getRewardsData( - address asset, - address reward - ) external view returns (uint256, uint256, uint256, uint256); - - /** - * @dev Calculates the next value of an specific distribution index, with validations. - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The old index of the asset distribution - * @return The new index of the asset distribution - **/ - function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); - - /** - * @dev Returns the list of available reward token addresses of an incentivized asset - * @param asset The incentivized asset - * @return List of rewards addresses of the input asset - **/ - function getRewardsByAsset(address asset) external view returns (address[] memory); - - /** - * @dev Returns the list of available reward addresses - * @return List of rewards supported in this contract - **/ - function getRewardsList() external view returns (address[] memory); - - /** - * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. - * @param user The address of the user - * @param reward The address of the reward token - * @return Unclaimed rewards, not including new distributions - **/ - function getUserAccruedRewards(address user, address reward) external view returns (uint256); - - /** - * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @param reward The address of the reward token - * @return The rewards amount - **/ - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view returns (uint256); - - /** - * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @return The list of reward addresses - * @return The list of unclaimed amount of rewards - **/ - function getAllUserRewards( - address[] calldata assets, - address user - ) external view returns (address[] memory, uint256[] memory); - - /** - * @dev Returns the decimals of an asset to calculate the distribution delta - * @param asset The address to retrieve decimals - * @return The decimals of an underlying asset - */ - function getAssetDecimals(address asset) external view returns (uint8); - - /** - * @dev Returns the address of the emission manager - * @return The address of the EmissionManager - */ - function EMISSION_MANAGER() external view returns (address); - - /** - * @dev Returns the address of the emission manager. - * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. - * @return The address of the EmissionManager - */ - function getEmissionManager() external view returns (address); -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol - -interface ITransferStrategyBase { - event EmergencyWithdrawal( - address indexed caller, - address indexed token, - address indexed to, - uint256 amount - ); - - /** - * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation - * @param to Account to transfer rewards - * @param reward Address of the reward token - * @param amount Amount to transfer to the "to" address parameter - * @return Returns true bool if transfer logic succeeds - */ - function performTransfer(address to, address reward, uint256 amount) external returns (bool); - - /** - * @return Returns the address of the Incentives Controller - */ - function getIncentivesController() external view returns (address); - - /** - * @return Returns the address of the Rewards admin - */ - function getRewardsAdmin() external view returns (address); - - /** - * @dev Perform an emergency token withdrawal only callable by the Rewards admin - * @param token Address of the token to withdraw funds from this contract - * @param to Address of the recipient of the withdrawal - * @param amount Amount of the withdrawal - */ - function emergencyWithdrawal(address token, address to, uint256 amount) external; -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol - -interface IUiIncentiveDataProviderV3 { - struct AggregatedReserveIncentiveData { - address underlyingAsset; - IncentiveData aIncentiveData; - IncentiveData vIncentiveData; - } - - struct IncentiveData { - address tokenAddress; - address incentiveControllerAddress; - RewardInfo[] rewardsTokenInformation; - } - - struct RewardInfo { - string rewardTokenSymbol; - address rewardTokenAddress; - address rewardOracleAddress; - uint256 emissionPerSecond; - uint256 incentivesLastUpdateTimestamp; - uint256 tokenIncentivesIndex; - uint256 emissionEndTimestamp; - int256 rewardPriceFeed; - uint8 rewardTokenDecimals; - uint8 precision; - uint8 priceFeedDecimals; - } - - struct UserReserveIncentiveData { - address underlyingAsset; - UserIncentiveData aTokenIncentivesUserData; - UserIncentiveData vTokenIncentivesUserData; - } - - struct UserIncentiveData { - address tokenAddress; - address incentiveControllerAddress; - UserRewardInfo[] userRewardsInformation; - } - - struct UserRewardInfo { - string rewardTokenSymbol; - address rewardOracleAddress; - address rewardTokenAddress; - uint256 userUnclaimedRewards; - uint256 tokenIncentivesUserIndex; - int256 rewardPriceFeed; - uint8 priceFeedDecimals; - uint8 rewardTokenDecimals; - } - - function getReservesIncentivesData( - IPoolAddressesProvider provider - ) external view returns (AggregatedReserveIncentiveData[] memory); - - function getUserReservesIncentivesData( - IPoolAddressesProvider provider, - address user - ) external view returns (UserReserveIncentiveData[] memory); - - // generic method with full data - function getFullReservesIncentiveData( - IPoolAddressesProvider provider, - address user - ) - external - view - returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory); -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol - -library RewardsDataTypes { - struct RewardsConfigInput { - uint88 emissionPerSecond; - uint256 totalSupply; - uint32 distributionEnd; - address asset; - address reward; - ITransferStrategyBase transferStrategy; - IEACAggregatorProxy rewardOracle; - } - - struct UserAssetBalance { - address asset; - uint256 userBalance; - uint256 totalSupply; - } - - struct UserData { - // Liquidity index of the reward distribution for the user - uint104 index; - // Amount of accrued rewards for the user since last user index update - uint128 accrued; - } - - struct RewardData { - // Liquidity index of the reward distribution - uint104 index; - // Amount of reward tokens distributed per second - uint88 emissionPerSecond; - // Timestamp of the last reward index update - uint32 lastUpdateTimestamp; - // The end of the distribution of rewards (in seconds) - uint32 distributionEnd; - // Map of user addresses and their rewards data (userAddress => userData) - mapping(address => UserData) usersData; - } - - struct AssetData { - // Map of reward token addresses and their data (rewardTokenAddress => rewardData) - mapping(address => RewardData) rewards; - // List of reward token addresses for the asset - mapping(uint128 => address) availableRewards; - // Count of reward tokens for the asset - uint128 availableRewardsCount; - // Number of decimals of the asset - uint8 decimals; - } -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol - -/** - * @title IRewardsController - * @author Aave - * @notice Defines the basic interface for a Rewards Controller. - */ -interface IRewardsController is IRewardsDistributor { - /** - * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user - * @param user The address of the user - * @param claimer The address of the claimer - */ - event ClaimerSet(address indexed user, address indexed claimer); - - /** - * @dev Emitted when rewards are claimed - * @param user The address of the user rewards has been claimed on behalf of - * @param reward The address of the token reward is claimed - * @param to The address of the receiver of the rewards - * @param claimer The address of the claimer - * @param amount The amount of rewards claimed - */ - event RewardsClaimed( - address indexed user, - address indexed reward, - address indexed to, - address claimer, - uint256 amount - ); - - /** - * @dev Emitted when a transfer strategy is installed for the reward distribution - * @param reward The address of the token reward - * @param transferStrategy The address of TransferStrategy contract - */ - event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); - - /** - * @dev Emitted when the reward oracle is updated - * @param reward The address of the token reward - * @param rewardOracle The address of oracle - */ - event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Get the price aggregator oracle address - * @param reward The address of the reward - * @return The price oracle of the reward - */ - function getRewardOracle(address reward) external view returns (address); - - /** - * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) - * @param user The address of the user - * @return The claimer address - */ - function getClaimer(address user) external view returns (address); - - /** - * @dev Returns the Transfer Strategy implementation contract address being used for a reward address - * @param reward The address of the reward - * @return The address of the TransferStrategy contract - */ - function getTransferStrategy(address reward) external view returns (address); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - **/ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - - /** - * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The - * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external returns (uint256); - - /** - * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" - **/ - function claimAllRewards( - address[] calldata assets, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must - * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsToSelf( - address[] calldata assets - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol - -contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { - using UserConfiguration for DataTypes.UserConfigurationMap; - - function getFullReservesIncentiveData( - IPoolAddressesProvider provider, - address user - ) - external - view - override - returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory) - { - return (_getReservesIncentivesData(provider), _getUserReservesIncentivesData(provider, user)); - } - - function getReservesIncentivesData( - IPoolAddressesProvider provider - ) external view override returns (AggregatedReserveIncentiveData[] memory) { - return _getReservesIncentivesData(provider); - } - - function _getReservesIncentivesData( - IPoolAddressesProvider provider - ) private view returns (AggregatedReserveIncentiveData[] memory) { - IPool pool = IPool(provider.getPool()); - address[] memory reserves = pool.getReservesList(); - AggregatedReserveIncentiveData[] - memory reservesIncentiveData = new AggregatedReserveIncentiveData[](reserves.length); - // Iterate through the reserves to get all the information from the (a/s/v) Tokens - for (uint256 i = 0; i < reserves.length; i++) { - AggregatedReserveIncentiveData memory reserveIncentiveData = reservesIncentiveData[i]; - reserveIncentiveData.underlyingAsset = reserves[i]; - - DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); - - // Get aTokens rewards information - IRewardsController aTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) - ); - RewardInfo[] memory aRewardsInformation; - if (address(aTokenIncentiveController) != address(0)) { - address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( - baseData.aTokenAddress - ); - - aRewardsInformation = new RewardInfo[](aTokenRewardAddresses.length); - for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { - RewardInfo memory rewardInformation; - rewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; - - ( - rewardInformation.tokenIncentivesIndex, - rewardInformation.emissionPerSecond, - rewardInformation.incentivesLastUpdateTimestamp, - rewardInformation.emissionEndTimestamp - ) = aTokenIncentiveController.getRewardsData( - baseData.aTokenAddress, - rewardInformation.rewardTokenAddress - ); - - rewardInformation.precision = aTokenIncentiveController.getAssetDecimals( - baseData.aTokenAddress - ); - rewardInformation.rewardTokenDecimals = IERC20Detailed( - rewardInformation.rewardTokenAddress - ).decimals(); - rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) - .symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - rewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( - rewardInformation.rewardTokenAddress - ); - rewardInformation.priceFeedDecimals = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).decimals(); - rewardInformation.rewardPriceFeed = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).latestAnswer(); - - aRewardsInformation[j] = rewardInformation; - } - } - - reserveIncentiveData.aIncentiveData = IncentiveData( - baseData.aTokenAddress, - address(aTokenIncentiveController), - aRewardsInformation - ); - - // Get vTokens rewards information - IRewardsController vTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) - ); - RewardInfo[] memory vRewardsInformation; - if (address(vTokenIncentiveController) != address(0)) { - address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( - baseData.variableDebtTokenAddress - ); - vRewardsInformation = new RewardInfo[](vTokenRewardAddresses.length); - for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { - RewardInfo memory rewardInformation; - rewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; - - ( - rewardInformation.tokenIncentivesIndex, - rewardInformation.emissionPerSecond, - rewardInformation.incentivesLastUpdateTimestamp, - rewardInformation.emissionEndTimestamp - ) = vTokenIncentiveController.getRewardsData( - baseData.variableDebtTokenAddress, - rewardInformation.rewardTokenAddress - ); - - rewardInformation.precision = vTokenIncentiveController.getAssetDecimals( - baseData.variableDebtTokenAddress - ); - rewardInformation.rewardTokenDecimals = IERC20Detailed( - rewardInformation.rewardTokenAddress - ).decimals(); - rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) - .symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - rewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( - rewardInformation.rewardTokenAddress - ); - rewardInformation.priceFeedDecimals = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).decimals(); - rewardInformation.rewardPriceFeed = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).latestAnswer(); - - vRewardsInformation[j] = rewardInformation; - } - } - - reserveIncentiveData.vIncentiveData = IncentiveData( - baseData.variableDebtTokenAddress, - address(vTokenIncentiveController), - vRewardsInformation - ); - } - - return (reservesIncentiveData); - } - - function getUserReservesIncentivesData( - IPoolAddressesProvider provider, - address user - ) external view override returns (UserReserveIncentiveData[] memory) { - return _getUserReservesIncentivesData(provider, user); - } - - function _getUserReservesIncentivesData( - IPoolAddressesProvider provider, - address user - ) private view returns (UserReserveIncentiveData[] memory) { - IPool pool = IPool(provider.getPool()); - address[] memory reserves = pool.getReservesList(); - - UserReserveIncentiveData[] memory userReservesIncentivesData = new UserReserveIncentiveData[]( - user != address(0) ? reserves.length : 0 - ); - - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); - - // user reserve data - userReservesIncentivesData[i].underlyingAsset = reserves[i]; - - IRewardsController aTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) - ); - if (address(aTokenIncentiveController) != address(0)) { - // get all rewards information from the asset - address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( - baseData.aTokenAddress - ); - UserRewardInfo[] memory aUserRewardsInformation = new UserRewardInfo[]( - aTokenRewardAddresses.length - ); - for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { - UserRewardInfo memory userRewardInformation; - userRewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; - - userRewardInformation.tokenIncentivesUserIndex = aTokenIncentiveController - .getUserAssetIndex( - user, - baseData.aTokenAddress, - userRewardInformation.rewardTokenAddress - ); - - userRewardInformation.userUnclaimedRewards = aTokenIncentiveController - .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); - userRewardInformation.rewardTokenDecimals = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).decimals(); - userRewardInformation.rewardTokenSymbol = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - userRewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( - userRewardInformation.rewardTokenAddress - ); - userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).decimals(); - userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).latestAnswer(); - - aUserRewardsInformation[j] = userRewardInformation; - } - - userReservesIncentivesData[i].aTokenIncentivesUserData = UserIncentiveData( - baseData.aTokenAddress, - address(aTokenIncentiveController), - aUserRewardsInformation - ); - } - - // variable debt token - IRewardsController vTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) - ); - if (address(vTokenIncentiveController) != address(0)) { - // get all rewards information from the asset - address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( - baseData.variableDebtTokenAddress - ); - UserRewardInfo[] memory vUserRewardsInformation = new UserRewardInfo[]( - vTokenRewardAddresses.length - ); - for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { - UserRewardInfo memory userRewardInformation; - userRewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; - - userRewardInformation.tokenIncentivesUserIndex = vTokenIncentiveController - .getUserAssetIndex( - user, - baseData.variableDebtTokenAddress, - userRewardInformation.rewardTokenAddress - ); - - userRewardInformation.userUnclaimedRewards = vTokenIncentiveController - .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); - userRewardInformation.rewardTokenDecimals = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).decimals(); - userRewardInformation.rewardTokenSymbol = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - userRewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( - userRewardInformation.rewardTokenAddress - ); - userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).decimals(); - userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).latestAnswer(); - - vUserRewardsInformation[j] = userRewardInformation; - } - - userReservesIncentivesData[i].vTokenIncentivesUserData = UserIncentiveData( - baseData.variableDebtTokenAddress, - address(aTokenIncentiveController), - vUserRewardsInformation - ); - } - } - - return (userReservesIncentivesData); - } -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol deleted file mode 100644 index 79a1829d..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol +++ /dev/null @@ -1,294 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../interfaces/IPool.sol'; -import {IncentivizedERC20} from '../protocol/tokenization/base/IncentivizedERC20.sol'; -import {UserConfiguration} from '../../contracts/protocol/libraries/configuration/UserConfiguration.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; -import {IRewardsController} from '../rewards/interfaces/IRewardsController.sol'; -import {IEACAggregatorProxy} from './interfaces/IEACAggregatorProxy.sol'; -import {IUiIncentiveDataProviderV3} from './interfaces/IUiIncentiveDataProviderV3.sol'; - -contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { - using UserConfiguration for DataTypes.UserConfigurationMap; - - function getFullReservesIncentiveData( - IPoolAddressesProvider provider, - address user - ) - external - view - override - returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory) - { - return (_getReservesIncentivesData(provider), _getUserReservesIncentivesData(provider, user)); - } - - function getReservesIncentivesData( - IPoolAddressesProvider provider - ) external view override returns (AggregatedReserveIncentiveData[] memory) { - return _getReservesIncentivesData(provider); - } - - function _getReservesIncentivesData( - IPoolAddressesProvider provider - ) private view returns (AggregatedReserveIncentiveData[] memory) { - IPool pool = IPool(provider.getPool()); - address[] memory reserves = pool.getReservesList(); - AggregatedReserveIncentiveData[] - memory reservesIncentiveData = new AggregatedReserveIncentiveData[](reserves.length); - // Iterate through the reserves to get all the information from the (a/s/v) Tokens - for (uint256 i = 0; i < reserves.length; i++) { - AggregatedReserveIncentiveData memory reserveIncentiveData = reservesIncentiveData[i]; - reserveIncentiveData.underlyingAsset = reserves[i]; - - DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); - - // Get aTokens rewards information - IRewardsController aTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) - ); - RewardInfo[] memory aRewardsInformation; - if (address(aTokenIncentiveController) != address(0)) { - address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( - baseData.aTokenAddress - ); - - aRewardsInformation = new RewardInfo[](aTokenRewardAddresses.length); - for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { - RewardInfo memory rewardInformation; - rewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; - - ( - rewardInformation.tokenIncentivesIndex, - rewardInformation.emissionPerSecond, - rewardInformation.incentivesLastUpdateTimestamp, - rewardInformation.emissionEndTimestamp - ) = aTokenIncentiveController.getRewardsData( - baseData.aTokenAddress, - rewardInformation.rewardTokenAddress - ); - - rewardInformation.precision = aTokenIncentiveController.getAssetDecimals( - baseData.aTokenAddress - ); - rewardInformation.rewardTokenDecimals = IERC20Detailed( - rewardInformation.rewardTokenAddress - ).decimals(); - rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) - .symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - rewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( - rewardInformation.rewardTokenAddress - ); - rewardInformation.priceFeedDecimals = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).decimals(); - rewardInformation.rewardPriceFeed = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).latestAnswer(); - - aRewardsInformation[j] = rewardInformation; - } - } - - reserveIncentiveData.aIncentiveData = IncentiveData( - baseData.aTokenAddress, - address(aTokenIncentiveController), - aRewardsInformation - ); - - // Get vTokens rewards information - IRewardsController vTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) - ); - RewardInfo[] memory vRewardsInformation; - if (address(vTokenIncentiveController) != address(0)) { - address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( - baseData.variableDebtTokenAddress - ); - vRewardsInformation = new RewardInfo[](vTokenRewardAddresses.length); - for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { - RewardInfo memory rewardInformation; - rewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; - - ( - rewardInformation.tokenIncentivesIndex, - rewardInformation.emissionPerSecond, - rewardInformation.incentivesLastUpdateTimestamp, - rewardInformation.emissionEndTimestamp - ) = vTokenIncentiveController.getRewardsData( - baseData.variableDebtTokenAddress, - rewardInformation.rewardTokenAddress - ); - - rewardInformation.precision = vTokenIncentiveController.getAssetDecimals( - baseData.variableDebtTokenAddress - ); - rewardInformation.rewardTokenDecimals = IERC20Detailed( - rewardInformation.rewardTokenAddress - ).decimals(); - rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) - .symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - rewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( - rewardInformation.rewardTokenAddress - ); - rewardInformation.priceFeedDecimals = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).decimals(); - rewardInformation.rewardPriceFeed = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).latestAnswer(); - - vRewardsInformation[j] = rewardInformation; - } - } - - reserveIncentiveData.vIncentiveData = IncentiveData( - baseData.variableDebtTokenAddress, - address(vTokenIncentiveController), - vRewardsInformation - ); - } - - return (reservesIncentiveData); - } - - function getUserReservesIncentivesData( - IPoolAddressesProvider provider, - address user - ) external view override returns (UserReserveIncentiveData[] memory) { - return _getUserReservesIncentivesData(provider, user); - } - - function _getUserReservesIncentivesData( - IPoolAddressesProvider provider, - address user - ) private view returns (UserReserveIncentiveData[] memory) { - IPool pool = IPool(provider.getPool()); - address[] memory reserves = pool.getReservesList(); - - UserReserveIncentiveData[] memory userReservesIncentivesData = new UserReserveIncentiveData[]( - user != address(0) ? reserves.length : 0 - ); - - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); - - // user reserve data - userReservesIncentivesData[i].underlyingAsset = reserves[i]; - - IRewardsController aTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) - ); - if (address(aTokenIncentiveController) != address(0)) { - // get all rewards information from the asset - address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( - baseData.aTokenAddress - ); - UserRewardInfo[] memory aUserRewardsInformation = new UserRewardInfo[]( - aTokenRewardAddresses.length - ); - for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { - UserRewardInfo memory userRewardInformation; - userRewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; - - userRewardInformation.tokenIncentivesUserIndex = aTokenIncentiveController - .getUserAssetIndex( - user, - baseData.aTokenAddress, - userRewardInformation.rewardTokenAddress - ); - - userRewardInformation.userUnclaimedRewards = aTokenIncentiveController - .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); - userRewardInformation.rewardTokenDecimals = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).decimals(); - userRewardInformation.rewardTokenSymbol = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - userRewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( - userRewardInformation.rewardTokenAddress - ); - userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).decimals(); - userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).latestAnswer(); - - aUserRewardsInformation[j] = userRewardInformation; - } - - userReservesIncentivesData[i].aTokenIncentivesUserData = UserIncentiveData( - baseData.aTokenAddress, - address(aTokenIncentiveController), - aUserRewardsInformation - ); - } - - // variable debt token - IRewardsController vTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) - ); - if (address(vTokenIncentiveController) != address(0)) { - // get all rewards information from the asset - address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( - baseData.variableDebtTokenAddress - ); - UserRewardInfo[] memory vUserRewardsInformation = new UserRewardInfo[]( - vTokenRewardAddresses.length - ); - for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { - UserRewardInfo memory userRewardInformation; - userRewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; - - userRewardInformation.tokenIncentivesUserIndex = vTokenIncentiveController - .getUserAssetIndex( - user, - baseData.variableDebtTokenAddress, - userRewardInformation.rewardTokenAddress - ); - - userRewardInformation.userUnclaimedRewards = vTokenIncentiveController - .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); - userRewardInformation.rewardTokenDecimals = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).decimals(); - userRewardInformation.rewardTokenSymbol = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - userRewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( - userRewardInformation.rewardTokenAddress - ); - userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).decimals(); - userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).latestAnswer(); - - vUserRewardsInformation[j] = userRewardInformation; - } - - userReservesIncentivesData[i].vTokenIncentivesUserData = UserIncentiveData( - baseData.variableDebtTokenAddress, - address(aTokenIncentiveController), - vUserRewardsInformation - ); - } - } - - return (userReservesIncentivesData); - } -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol deleted file mode 100644 index c89baee6..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol deleted file mode 100644 index 3402953f..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; - -interface IUiIncentiveDataProviderV3 { - struct AggregatedReserveIncentiveData { - address underlyingAsset; - IncentiveData aIncentiveData; - IncentiveData vIncentiveData; - } - - struct IncentiveData { - address tokenAddress; - address incentiveControllerAddress; - RewardInfo[] rewardsTokenInformation; - } - - struct RewardInfo { - string rewardTokenSymbol; - address rewardTokenAddress; - address rewardOracleAddress; - uint256 emissionPerSecond; - uint256 incentivesLastUpdateTimestamp; - uint256 tokenIncentivesIndex; - uint256 emissionEndTimestamp; - int256 rewardPriceFeed; - uint8 rewardTokenDecimals; - uint8 precision; - uint8 priceFeedDecimals; - } - - struct UserReserveIncentiveData { - address underlyingAsset; - UserIncentiveData aTokenIncentivesUserData; - UserIncentiveData vTokenIncentivesUserData; - } - - struct UserIncentiveData { - address tokenAddress; - address incentiveControllerAddress; - UserRewardInfo[] userRewardsInformation; - } - - struct UserRewardInfo { - string rewardTokenSymbol; - address rewardOracleAddress; - address rewardTokenAddress; - uint256 userUnclaimedRewards; - uint256 tokenIncentivesUserIndex; - int256 rewardPriceFeed; - uint8 priceFeedDecimals; - uint8 rewardTokenDecimals; - } - - function getReservesIncentivesData( - IPoolAddressesProvider provider - ) external view returns (AggregatedReserveIncentiveData[] memory); - - function getUserReservesIncentivesData( - IPoolAddressesProvider provider, - address user - ) external view returns (UserReserveIncentiveData[] memory); - - // generic method with full data - function getFullReservesIncentiveData( - IPoolAddressesProvider provider, - address user - ) - external - view - returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory); -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol deleted file mode 100644 index cdb2ac29..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol +++ /dev/null @@ -1,203 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IRewardsDistributor} from './IRewardsDistributor.sol'; -import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; -import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; - -/** - * @title IRewardsController - * @author Aave - * @notice Defines the basic interface for a Rewards Controller. - */ -interface IRewardsController is IRewardsDistributor { - /** - * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user - * @param user The address of the user - * @param claimer The address of the claimer - */ - event ClaimerSet(address indexed user, address indexed claimer); - - /** - * @dev Emitted when rewards are claimed - * @param user The address of the user rewards has been claimed on behalf of - * @param reward The address of the token reward is claimed - * @param to The address of the receiver of the rewards - * @param claimer The address of the claimer - * @param amount The amount of rewards claimed - */ - event RewardsClaimed( - address indexed user, - address indexed reward, - address indexed to, - address claimer, - uint256 amount - ); - - /** - * @dev Emitted when a transfer strategy is installed for the reward distribution - * @param reward The address of the token reward - * @param transferStrategy The address of TransferStrategy contract - */ - event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); - - /** - * @dev Emitted when the reward oracle is updated - * @param reward The address of the token reward - * @param rewardOracle The address of oracle - */ - event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Get the price aggregator oracle address - * @param reward The address of the reward - * @return The price oracle of the reward - */ - function getRewardOracle(address reward) external view returns (address); - - /** - * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) - * @param user The address of the user - * @return The claimer address - */ - function getClaimer(address user) external view returns (address); - - /** - * @dev Returns the Transfer Strategy implementation contract address being used for a reward address - * @param reward The address of the reward - * @return The address of the TransferStrategy contract - */ - function getTransferStrategy(address reward) external view returns (address); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - **/ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - - /** - * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The - * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external returns (uint256); - - /** - * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" - **/ - function claimAllRewards( - address[] calldata assets, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must - * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsToSelf( - address[] calldata assets - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol deleted file mode 100644 index 5cb58856..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol +++ /dev/null @@ -1,177 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title IRewardsDistributor - * @author Aave - * @notice Defines the basic interface for a Rewards Distributor. - */ -interface IRewardsDistributor { - /** - * @dev Emitted when the configuration of the rewards of an asset is updated. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param oldEmission The old emissions per second value of the reward distribution - * @param newEmission The new emissions per second value of the reward distribution - * @param oldDistributionEnd The old end timestamp of the reward distribution - * @param newDistributionEnd The new end timestamp of the reward distribution - * @param assetIndex The index of the asset distribution - */ - event AssetConfigUpdated( - address indexed asset, - address indexed reward, - uint256 oldEmission, - uint256 newEmission, - uint256 oldDistributionEnd, - uint256 newDistributionEnd, - uint256 assetIndex - ); - - /** - * @dev Emitted when rewards of an asset are accrued on behalf of a user. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param user The address of the user that rewards are accrued on behalf of - * @param assetIndex The index of the asset distribution - * @param userIndex The index of the asset distribution on behalf of the user - * @param rewardsAccrued The amount of rewards accrued - */ - event Accrued( - address indexed asset, - address indexed reward, - address indexed user, - uint256 assetIndex, - uint256 userIndex, - uint256 rewardsAccrued - ); - - /** - * @dev Sets the end date for the distribution - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Gets the end date for the distribution - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The timestamp with the end of the distribution, in unix time format - **/ - function getDistributionEnd(address asset, address reward) external view returns (uint256); - - /** - * @dev Returns the index of a user on a reward distribution - * @param user Address of the user - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The current user asset index, not including new distributions - **/ - function getUserAssetIndex( - address user, - address asset, - address reward - ) external view returns (uint256); - - /** - * @dev Returns the configuration of the distribution reward for a certain asset - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The index of the asset distribution - * @return The emission per second of the reward distribution - * @return The timestamp of the last update of the index - * @return The timestamp of the distribution end - **/ - function getRewardsData( - address asset, - address reward - ) external view returns (uint256, uint256, uint256, uint256); - - /** - * @dev Calculates the next value of an specific distribution index, with validations. - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The old index of the asset distribution - * @return The new index of the asset distribution - **/ - function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); - - /** - * @dev Returns the list of available reward token addresses of an incentivized asset - * @param asset The incentivized asset - * @return List of rewards addresses of the input asset - **/ - function getRewardsByAsset(address asset) external view returns (address[] memory); - - /** - * @dev Returns the list of available reward addresses - * @return List of rewards supported in this contract - **/ - function getRewardsList() external view returns (address[] memory); - - /** - * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. - * @param user The address of the user - * @param reward The address of the reward token - * @return Unclaimed rewards, not including new distributions - **/ - function getUserAccruedRewards(address user, address reward) external view returns (uint256); - - /** - * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @param reward The address of the reward token - * @return The rewards amount - **/ - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view returns (uint256); - - /** - * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @return The list of reward addresses - * @return The list of unclaimed amount of rewards - **/ - function getAllUserRewards( - address[] calldata assets, - address user - ) external view returns (address[] memory, uint256[] memory); - - /** - * @dev Returns the decimals of an asset to calculate the distribution delta - * @param asset The address to retrieve decimals - * @return The decimals of an underlying asset - */ - function getAssetDecimals(address asset) external view returns (uint8); - - /** - * @dev Returns the address of the emission manager - * @return The address of the EmissionManager - */ - function EMISSION_MANAGER() external view returns (address); - - /** - * @dev Returns the address of the emission manager. - * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. - * @return The address of the EmissionManager - */ - function getEmissionManager() external view returns (address); -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol deleted file mode 100644 index d2848fef..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -interface ITransferStrategyBase { - event EmergencyWithdrawal( - address indexed caller, - address indexed token, - address indexed to, - uint256 amount - ); - - /** - * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation - * @param to Account to transfer rewards - * @param reward Address of the reward token - * @param amount Amount to transfer to the "to" address parameter - * @return Returns true bool if transfer logic succeeds - */ - function performTransfer(address to, address reward, uint256 amount) external returns (bool); - - /** - * @return Returns the address of the Incentives Controller - */ - function getIncentivesController() external view returns (address); - - /** - * @return Returns the address of the Rewards admin - */ - function getRewardsAdmin() external view returns (address); - - /** - * @dev Perform an emergency token withdrawal only callable by the Rewards admin - * @param token Address of the token to withdraw funds from this contract - * @param to Address of the recipient of the withdrawal - * @param amount Amount of the withdrawal - */ - function emergencyWithdrawal(address token, address to, uint256 amount) external; -} diff --git a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol b/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol deleted file mode 100644 index 38fe87c5..00000000 --- a/downloads/ARBITRUM/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; - -library RewardsDataTypes { - struct RewardsConfigInput { - uint88 emissionPerSecond; - uint256 totalSupply; - uint32 distributionEnd; - address asset; - address reward; - ITransferStrategyBase transferStrategy; - IEACAggregatorProxy rewardOracle; - } - - struct UserAssetBalance { - address asset; - uint256 userBalance; - uint256 totalSupply; - } - - struct UserData { - // Liquidity index of the reward distribution for the user - uint104 index; - // Amount of accrued rewards for the user since last user index update - uint128 accrued; - } - - struct RewardData { - // Liquidity index of the reward distribution - uint104 index; - // Amount of reward tokens distributed per second - uint88 emissionPerSecond; - // Timestamp of the last reward index update - uint32 lastUpdateTimestamp; - // The end of the distribution of rewards (in seconds) - uint32 distributionEnd; - // Map of user addresses and their rewards data (userAddress => userData) - mapping(address => UserData) usersData; - } - - struct AssetData { - // Map of reward token addresses and their data (rewardTokenAddress => rewardData) - mapping(address => RewardData) rewards; - // List of reward token addresses for the asset - mapping(uint128 => address) availableRewards; - // Count of reward tokens for the asset - uint128 availableRewardsCount; - // Number of decimals of the asset - uint8 decimals; - } -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER.sol deleted file mode 100644 index 1457bcc5..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER.sol +++ /dev/null @@ -1,4068 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol - -interface IERC20DetailedBytes is IERC20 { - function name() external view returns (bytes32); - - function symbol() external view returns (bytes32); - - function decimals() external view returns (uint8); -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol - -/** - * @title IPoolDataProvider - * @author Aave - * @notice Defines the basic interface of a PoolDataProvider - */ -interface IPoolDataProvider { - struct TokenData { - string symbol; - address tokenAddress; - } - - /** - * @notice Returns the address for the PoolAddressesProvider contract. - * @return The address for the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the list of the existing reserves in the pool. - * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. - * @return The list of reserves, pairs of symbols and addresses - */ - function getAllReservesTokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the list of the existing ATokens in the pool. - * @return The list of ATokens, pairs of symbols and addresses - */ - function getAllATokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the configuration data of the reserve - * @dev Not returning borrow and supply caps for compatibility, nor pause flag - * @param asset The address of the underlying asset of the reserve - * @return decimals The number of decimals of the reserve - * @return ltv The ltv of the reserve - * @return liquidationThreshold The liquidationThreshold of the reserve - * @return liquidationBonus The liquidationBonus of the reserve - * @return reserveFactor The reserveFactor of the reserve - * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise - * @return borrowingEnabled True if borrowing is enabled, false otherwise - * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise - * @return isActive True if it is active, false otherwise - * @return isFrozen True if it is frozen, false otherwise - */ - function getReserveConfigurationData( - address asset - ) - external - view - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ); - - /** - * @notice Returns the caps parameters of the reserve - * @param asset The address of the underlying asset of the reserve - * @return borrowCap The borrow cap of the reserve - * @return supplyCap The supply cap of the reserve - */ - function getReserveCaps( - address asset - ) external view returns (uint256 borrowCap, uint256 supplyCap); - - /** - * @notice Returns if the pool is paused - * @param asset The address of the underlying asset of the reserve - * @return isPaused True if the pool is paused, false otherwise - */ - function getPaused(address asset) external view returns (bool isPaused); - - /** - * @notice Returns the siloed borrowing flag - * @param asset The address of the underlying asset of the reserve - * @return True if the asset is siloed for borrowing - */ - function getSiloedBorrowing(address asset) external view returns (bool); - - /** - * @notice Returns the protocol fee on the liquidation bonus - * @param asset The address of the underlying asset of the reserve - * @return The protocol fee on liquidation - */ - function getLiquidationProtocolFee(address asset) external view returns (uint256); - - /** - * @notice Returns the unbacked mint cap of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The unbacked mint cap of the reserve - */ - function getUnbackedMintCap(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The debt ceiling of the reserve - */ - function getDebtCeiling(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling decimals - * @return The debt ceiling decimals - */ - function getDebtCeilingDecimals() external pure returns (uint256); - - /** - * @notice Returns the reserve data - * @param asset The address of the underlying asset of the reserve - * @return unbacked The amount of unbacked tokens - * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted - * @return totalAToken The total supply of the aToken - * @return totalStableDebt The total stable debt of the reserve - * @return totalVariableDebt The total variable debt of the reserve - * @return liquidityRate The liquidity rate of the reserve - * @return variableBorrowRate The variable borrow rate of the reserve - * @return stableBorrowRate The stable borrow rate of the reserve - * @return averageStableBorrowRate The average stable borrow rate of the reserve - * @return liquidityIndex The liquidity index of the reserve - * @return variableBorrowIndex The variable borrow index of the reserve - * @return lastUpdateTimestamp The timestamp of the last update of the reserve - */ - function getReserveData( - address asset - ) - external - view - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ); - - /** - * @notice Returns the total supply of aTokens for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total supply of the aToken - */ - function getATokenTotalSupply(address asset) external view returns (uint256); - - /** - * @notice Returns the total debt for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total debt for asset - */ - function getTotalDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the user data in a reserve - * @param asset The address of the underlying asset of the reserve - * @param user The address of the user - * @return currentATokenBalance The current AToken balance of the user - * @return currentStableDebt The current stable debt of the user - * @return currentVariableDebt The current variable debt of the user - * @return principalStableDebt The principal stable debt of the user - * @return scaledVariableDebt The scaled variable debt of the user - * @return stableBorrowRate The stable borrow rate of the user - * @return liquidityRate The liquidity rate of the reserve - * @return stableRateLastUpdated The timestamp of the last update of the user stable rate - * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false - * otherwise - */ - function getUserReserveData( - address asset, - address user - ) - external - view - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ); - - /** - * @notice Returns the token addresses of the reserve - * @param asset The address of the underlying asset of the reserve - * @return aTokenAddress The AToken address of the reserve - * @return stableDebtTokenAddress DEPRECATED in v3.2.0 - * @return variableDebtTokenAddress The VariableDebtToken address of the reserve - */ - function getReserveTokensAddresses( - address asset - ) - external - view - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ); - - /** - * @notice Returns the address of the Interest Rate strategy - * @param asset The address of the underlying asset of the reserve - * @return irStrategyAddress The address of the Interest Rate strategy - */ - function getInterestRateStrategyAddress( - address asset - ) external view returns (address irStrategyAddress); - - /** - * @notice Returns whether the reserve has FlashLoans enabled or disabled - * @param asset The address of the underlying asset of the reserve - * @return True if FlashLoans are enabled, false otherwise - */ - function getFlashLoanEnabled(address asset) external view returns (bool); - - /** - * @notice Returns whether virtual accounting is enabled/not for a reserve - * @param asset The address of the underlying asset of the reserve - * @return True if active, false otherwise - */ - function getIsVirtualAccActive(address asset) external view returns (bool); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint256); -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol - -interface IUiPoolDataProviderV3 { - struct AggregatedReserveData { - address underlyingAsset; - string name; - string symbol; - uint256 decimals; - uint256 baseLTVasCollateral; - uint256 reserveLiquidationThreshold; - uint256 reserveLiquidationBonus; - uint256 reserveFactor; - bool usageAsCollateralEnabled; - bool borrowingEnabled; - bool isActive; - bool isFrozen; - // base data - uint128 liquidityIndex; - uint128 variableBorrowIndex; - uint128 liquidityRate; - uint128 variableBorrowRate; - uint40 lastUpdateTimestamp; - address aTokenAddress; - address variableDebtTokenAddress; - address interestRateStrategyAddress; - // - uint256 availableLiquidity; - uint256 totalScaledVariableDebt; - uint256 priceInMarketReferenceCurrency; - address priceOracle; - uint256 variableRateSlope1; - uint256 variableRateSlope2; - uint256 baseVariableBorrowRate; - uint256 optimalUsageRatio; - // v3 only - bool isPaused; - bool isSiloedBorrowing; - uint128 accruedToTreasury; - uint128 unbacked; - uint128 isolationModeTotalDebt; - bool flashLoanEnabled; - // - uint256 debtCeiling; - uint256 debtCeilingDecimals; - uint256 borrowCap; - uint256 supplyCap; - bool borrowableInIsolation; - // v3.1 - bool virtualAccActive; - uint128 virtualUnderlyingBalance; - } - - struct UserReserveData { - address underlyingAsset; - uint256 scaledATokenBalance; - bool usageAsCollateralEnabledOnUser; - uint256 scaledVariableDebt; - } - - struct BaseCurrencyInfo { - uint256 marketReferenceCurrencyUnit; - int256 marketReferenceCurrencyPriceInUsd; - int256 networkBaseTokenPriceInUsd; - uint8 networkBaseTokenPriceDecimals; - } - - struct Emode { - uint8 id; - DataTypes.EModeCategory eMode; - } - - function getReservesList( - IPoolAddressesProvider provider - ) external view returns (address[] memory); - - function getReservesData( - IPoolAddressesProvider provider - ) external view returns (AggregatedReserveData[] memory, BaseCurrencyInfo memory); - - function getUserReservesData( - IPoolAddressesProvider provider, - address user - ) external view returns (UserReserveData[] memory, uint8); - - /** - * @dev Iterates the eModes mapping and returns all eModes found - * @notice The method assumes for id gaps <= 2 within the eMode definitions - * @return an array of eModes that were found in the eMode mapping - */ - function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory); -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol - -/** - * @title IAaveOracle - * @author Aave - * @notice Defines the basic interface for the Aave Oracle - */ -interface IAaveOracle is IPriceOracleGetter { - /** - * @dev Emitted after the base currency is set - * @param baseCurrency The base currency of used for price quotes - * @param baseCurrencyUnit The unit of the base currency - */ - event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); - - /** - * @dev Emitted after the price source of an asset is updated - * @param asset The address of the asset - * @param source The price source of the asset - */ - event AssetSourceUpdated(address indexed asset, address indexed source); - - /** - * @dev Emitted after the address of fallback oracle is updated - * @param fallbackOracle The address of the fallback oracle - */ - event FallbackOracleUpdated(address indexed fallbackOracle); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Sets or replaces price sources of assets - * @param assets The addresses of the assets - * @param sources The addresses of the price sources - */ - function setAssetSources(address[] calldata assets, address[] calldata sources) external; - - /** - * @notice Sets the fallback oracle - * @param fallbackOracle The address of the fallback oracle - */ - function setFallbackOracle(address fallbackOracle) external; - - /** - * @notice Returns a list of prices from a list of assets addresses - * @param assets The list of assets addresses - * @return The prices of the given assets - */ - function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); - - /** - * @notice Returns the address of the source for an asset address - * @param asset The address of the asset - * @return The address of the source - */ - function getSourceOfAsset(address asset) external view returns (address); - - /** - * @notice Returns the address of the fallback oracle - * @return The address of the fallback oracle - */ - function getFallbackOracle() external view returns (address); -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol - -/** - * @title IDefaultInterestRateStrategyV2 - * @author BGD Labs - * @notice Interface of the default interest rate strategy used by the Aave protocol - */ -interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { - /** - * @notice Holds the interest rate data for a given reserve - * - * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This - * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. - * - * @param optimalUsageRatio The optimal usage ratio, in bps - * @param baseVariableBorrowRate The base variable borrow rate, in bps - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps - */ - struct InterestRateData { - uint16 optimalUsageRatio; - uint32 baseVariableBorrowRate; - uint32 variableRateSlope1; - uint32 variableRateSlope2; - } - - /** - * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, - * used in in-memory calculations. - * - * @param optimalUsageRatio The optimal usage ratio - * @param baseVariableBorrowRate The base variable borrow rate - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio - */ - struct InterestRateDataRay { - uint256 optimalUsageRatio; - uint256 baseVariableBorrowRate; - uint256 variableRateSlope1; - uint256 variableRateSlope2; - } - - /** - * @notice emitted when new interest rate data is set in a reserve - * - * @param reserve address of the reserve that has new interest rate data set - * @param optimalUsageRatio The optimal usage ratio, in bps - * @param baseVariableBorrowRate The base variable borrow rate, in bps - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps - */ - event RateDataUpdate( - address indexed reserve, - uint256 optimalUsageRatio, - uint256 baseVariableBorrowRate, - uint256 variableRateSlope1, - uint256 variableRateSlope2 - ); - - /** - * @notice Returns the address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the maximum value achievable for variable borrow rate, in bps - * @return The maximum rate - */ - function MAX_BORROW_RATE() external view returns (uint256); - - /** - * @notice Returns the minimum optimal point, in bps - * @return The optimal point - */ - function MIN_OPTIMAL_POINT() external view returns (uint256); - - /** - * @notice Returns the maximum optimal point, in bps - * @return The optimal point - */ - function MAX_OPTIMAL_POINT() external view returns (uint256); - - /** - * notice Returns the full InterestRateData object for the given reserve, in ray - * - * @param reserve The reserve to get the data of - * - * @return The InterestRateDataRay object for the given reserve - */ - function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); - - /** - * notice Returns the full InterestRateDataRay object for the given reserve, in bps - * - * @param reserve The reserve to get the data of - * - * @return The InterestRateData object for the given reserve - */ - function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); - - /** - * @notice Returns the optimal usage rate for the given reserve in ray - * - * @param reserve The reserve to get the optimal usage rate of - * - * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate - */ - function getOptimalUsageRatio(address reserve) external view returns (uint256); - - /** - * @notice Returns the variable rate slope below optimal usage ratio in ray - * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO - * - * @param reserve The reserve to get the variable rate slope 1 of - * - * @return The variable rate slope - */ - function getVariableRateSlope1(address reserve) external view returns (uint256); - - /** - * @notice Returns the variable rate slope above optimal usage ratio in ray - * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO - * - * @param reserve The reserve to get the variable rate slope 2 of - * - * @return The variable rate slope - */ - function getVariableRateSlope2(address reserve) external view returns (uint256); - - /** - * @notice Returns the base variable borrow rate, in ray - * - * @param reserve The reserve to get the base variable borrow rate of - * - * @return The base variable borrow rate - */ - function getBaseVariableBorrowRate(address reserve) external view returns (uint256); - - /** - * @notice Returns the maximum variable borrow rate, in ray - * - * @param reserve The reserve to get the maximum variable borrow rate of - * - * @return The maximum variable borrow rate - */ - function getMaxVariableBorrowRate(address reserve) external view returns (uint256); - - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The reserve interest rate data to apply to the given reserve - * Being specific to this custom implementation, with custom struct type, - * overloading the function on the generic interface - */ - function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol - -/** - * @title AaveProtocolDataProvider - * @author Aave - * @notice Peripheral contract to collect and pre-process information from the Pool. - */ -contract AaveProtocolDataProvider is IPoolDataProvider { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - - address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; - address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /// @inheritdoc IPoolDataProvider - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @notice Constructor - * @param addressesProvider The address of the PoolAddressesProvider contract - */ - constructor(IPoolAddressesProvider addressesProvider) { - ADDRESSES_PROVIDER = addressesProvider; - } - - /// @inheritdoc IPoolDataProvider - function getAllReservesTokens() external view override returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory reservesTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - if (reserves[i] == MKR) { - reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); - continue; - } - if (reserves[i] == ETH) { - reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); - continue; - } - reservesTokens[i] = TokenData({ - symbol: IERC20Detailed(reserves[i]).symbol(), - tokenAddress: reserves[i] - }); - } - return reservesTokens; - } - - /// @inheritdoc IPoolDataProvider - function getAllATokens() external view override returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory aTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveDataLegacy memory reserveData = pool.getReserveData(reserves[i]); - aTokens[i] = TokenData({ - symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), - tokenAddress: reserveData.aTokenAddress - }); - } - return aTokens; - } - - /// @inheritdoc IPoolDataProvider - function getReserveConfigurationData( - address asset - ) - external - view - override - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ) - { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration - .getParams(); - - (isActive, isFrozen, borrowingEnabled, ) = configuration.getFlags(); - - // @notice all stable debt related parameters deprecated in v3.2.0 - stableBorrowRateEnabled = false; - - usageAsCollateralEnabled = liquidationThreshold != 0; - } - - /// @inheritdoc IPoolDataProvider - function getReserveCaps( - address asset - ) external view override returns (uint256 borrowCap, uint256 supplyCap) { - (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); - } - - /// @inheritdoc IPoolDataProvider - function getPaused(address asset) external view override returns (bool isPaused) { - (, , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); - } - - /// @inheritdoc IPoolDataProvider - function getSiloedBorrowing(address asset) external view override returns (bool) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); - } - - /// @inheritdoc IPoolDataProvider - function getLiquidationProtocolFee(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); - } - - /// @inheritdoc IPoolDataProvider - function getUnbackedMintCap(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); - } - - /// @inheritdoc IPoolDataProvider - function getDebtCeiling(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); - } - - /// @inheritdoc IPoolDataProvider - function getDebtCeilingDecimals() external pure override returns (uint256) { - return ReserveConfiguration.DEBT_CEILING_DECIMALS; - } - - /// @inheritdoc IPoolDataProvider - function getReserveData( - address asset - ) - external - view - override - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - // @notice all stable debt related parameters deprecated in v3.2.0 - return ( - reserve.unbacked, - reserve.accruedToTreasury, - IERC20Detailed(reserve.aTokenAddress).totalSupply(), - 0, - IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), - reserve.currentLiquidityRate, - reserve.currentVariableBorrowRate, - 0, - 0, - reserve.liquidityIndex, - reserve.variableBorrowIndex, - reserve.lastUpdateTimestamp - ); - } - - /// @inheritdoc IPoolDataProvider - function getATokenTotalSupply(address asset) external view override returns (uint256) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.aTokenAddress).totalSupply(); - } - - /// @inheritdoc IPoolDataProvider - function getTotalDebt(address asset) external view override returns (uint256) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); - } - - /// @inheritdoc IPoolDataProvider - function getUserReserveData( - address asset, - address user - ) - external - view - override - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) - .getUserConfiguration(user); - - currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); - currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); - - // @notice all stable debt related parameters deprecated in v3.2.0 - currentStableDebt = principalStableDebt = stableBorrowRate = stableRateLastUpdated = 0; - - scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); - liquidityRate = reserve.currentLiquidityRate; - usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); - } - - /// @inheritdoc IPoolDataProvider - function getReserveTokensAddresses( - address asset - ) - external - view - override - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - // @notice all stable debt related parameters deprecated in v3.2.0 - return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); - } - - /// @inheritdoc IPoolDataProvider - function getInterestRateStrategyAddress( - address asset - ) external view override returns (address irStrategyAddress) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - return (reserve.interestRateStrategyAddress); - } - - /// @inheritdoc IPoolDataProvider - function getFlashLoanEnabled(address asset) external view override returns (bool) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - return configuration.getFlashLoanEnabled(); - } - - /// @inheritdoc IPoolDataProvider - function getIsVirtualAccActive(address asset) external view override returns (bool) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - return configuration.getIsVirtualAccActive(); - } - - /// @inheritdoc IPoolDataProvider - function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); - } -} - -// downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol - -contract UiPoolDataProviderV3 is IUiPoolDataProviderV3 { - using WadRayMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - IEACAggregatorProxy public immutable networkBaseTokenPriceInUsdProxyAggregator; - IEACAggregatorProxy public immutable marketReferenceCurrencyPriceInUsdProxyAggregator; - uint256 public constant ETH_CURRENCY_UNIT = 1 ether; - address public constant MKR_ADDRESS = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; - - constructor( - IEACAggregatorProxy _networkBaseTokenPriceInUsdProxyAggregator, - IEACAggregatorProxy _marketReferenceCurrencyPriceInUsdProxyAggregator - ) { - networkBaseTokenPriceInUsdProxyAggregator = _networkBaseTokenPriceInUsdProxyAggregator; - marketReferenceCurrencyPriceInUsdProxyAggregator = _marketReferenceCurrencyPriceInUsdProxyAggregator; - } - - function getReservesList( - IPoolAddressesProvider provider - ) external view override returns (address[] memory) { - IPool pool = IPool(provider.getPool()); - return pool.getReservesList(); - } - - function getReservesData( - IPoolAddressesProvider provider - ) external view override returns (AggregatedReserveData[] memory, BaseCurrencyInfo memory) { - IAaveOracle oracle = IAaveOracle(provider.getPriceOracle()); - IPool pool = IPool(provider.getPool()); - AaveProtocolDataProvider poolDataProvider = AaveProtocolDataProvider( - provider.getPoolDataProvider() - ); - - address[] memory reserves = pool.getReservesList(); - AggregatedReserveData[] memory reservesData = new AggregatedReserveData[](reserves.length); - - for (uint256 i = 0; i < reserves.length; i++) { - AggregatedReserveData memory reserveData = reservesData[i]; - reserveData.underlyingAsset = reserves[i]; - - // reserve current state - DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData( - reserveData.underlyingAsset - ); - //the liquidity index. Expressed in ray - reserveData.liquidityIndex = baseData.liquidityIndex; - //variable borrow index. Expressed in ray - reserveData.variableBorrowIndex = baseData.variableBorrowIndex; - //the current supply rate. Expressed in ray - reserveData.liquidityRate = baseData.currentLiquidityRate; - //the current variable borrow rate. Expressed in ray - reserveData.variableBorrowRate = baseData.currentVariableBorrowRate; - reserveData.lastUpdateTimestamp = baseData.lastUpdateTimestamp; - reserveData.aTokenAddress = baseData.aTokenAddress; - reserveData.variableDebtTokenAddress = baseData.variableDebtTokenAddress; - //address of the interest rate strategy - reserveData.interestRateStrategyAddress = baseData.interestRateStrategyAddress; - reserveData.priceInMarketReferenceCurrency = oracle.getAssetPrice( - reserveData.underlyingAsset - ); - reserveData.priceOracle = oracle.getSourceOfAsset(reserveData.underlyingAsset); - reserveData.availableLiquidity = IERC20Detailed(reserveData.underlyingAsset).balanceOf( - reserveData.aTokenAddress - ); - reserveData.totalScaledVariableDebt = IVariableDebtToken(reserveData.variableDebtTokenAddress) - .scaledTotalSupply(); - - // Due we take the symbol from underlying token we need a special case for $MKR as symbol() returns bytes32 - if (address(reserveData.underlyingAsset) == address(MKR_ADDRESS)) { - bytes32 symbol = IERC20DetailedBytes(reserveData.underlyingAsset).symbol(); - bytes32 name = IERC20DetailedBytes(reserveData.underlyingAsset).name(); - reserveData.symbol = bytes32ToString(symbol); - reserveData.name = bytes32ToString(name); - } else { - reserveData.symbol = IERC20Detailed(reserveData.underlyingAsset).symbol(); - reserveData.name = IERC20Detailed(reserveData.underlyingAsset).name(); - } - - //stores the reserve configuration - DataTypes.ReserveConfigurationMap memory reserveConfigurationMap = baseData.configuration; - ( - reserveData.baseLTVasCollateral, - reserveData.reserveLiquidationThreshold, - reserveData.reserveLiquidationBonus, - reserveData.decimals, - reserveData.reserveFactor - ) = reserveConfigurationMap.getParams(); - reserveData.usageAsCollateralEnabled = reserveData.baseLTVasCollateral != 0; - - ( - reserveData.isActive, - reserveData.isFrozen, - reserveData.borrowingEnabled, - reserveData.isPaused - ) = reserveConfigurationMap.getFlags(); - - // interest rates - try - IDefaultInterestRateStrategyV2(reserveData.interestRateStrategyAddress).getInterestRateData( - reserveData.underlyingAsset - ) - returns (IDefaultInterestRateStrategyV2.InterestRateDataRay memory res) { - reserveData.baseVariableBorrowRate = res.baseVariableBorrowRate; - reserveData.variableRateSlope1 = res.variableRateSlope1; - reserveData.variableRateSlope2 = res.variableRateSlope2; - reserveData.optimalUsageRatio = res.optimalUsageRatio; - } catch {} - - // v3 only - reserveData.debtCeiling = reserveConfigurationMap.getDebtCeiling(); - reserveData.debtCeilingDecimals = poolDataProvider.getDebtCeilingDecimals(); - (reserveData.borrowCap, reserveData.supplyCap) = reserveConfigurationMap.getCaps(); - - try poolDataProvider.getFlashLoanEnabled(reserveData.underlyingAsset) returns ( - bool flashLoanEnabled - ) { - reserveData.flashLoanEnabled = flashLoanEnabled; - } catch (bytes memory) { - reserveData.flashLoanEnabled = true; - } - - reserveData.isSiloedBorrowing = reserveConfigurationMap.getSiloedBorrowing(); - reserveData.unbacked = baseData.unbacked; - reserveData.isolationModeTotalDebt = baseData.isolationModeTotalDebt; - reserveData.accruedToTreasury = baseData.accruedToTreasury; - - reserveData.borrowableInIsolation = reserveConfigurationMap.getBorrowableInIsolation(); - - try poolDataProvider.getIsVirtualAccActive(reserveData.underlyingAsset) returns ( - bool virtualAccActive - ) { - reserveData.virtualAccActive = virtualAccActive; - } catch (bytes memory) { - reserveData.virtualAccActive = false; - } - - try pool.getVirtualUnderlyingBalance(reserveData.underlyingAsset) returns ( - uint128 virtualUnderlyingBalance - ) { - reserveData.virtualUnderlyingBalance = virtualUnderlyingBalance; - } catch (bytes memory) { - reserveData.virtualUnderlyingBalance = 0; - } - } - - BaseCurrencyInfo memory baseCurrencyInfo; - baseCurrencyInfo.networkBaseTokenPriceInUsd = networkBaseTokenPriceInUsdProxyAggregator - .latestAnswer(); - baseCurrencyInfo.networkBaseTokenPriceDecimals = networkBaseTokenPriceInUsdProxyAggregator - .decimals(); - - try oracle.BASE_CURRENCY_UNIT() returns (uint256 baseCurrencyUnit) { - baseCurrencyInfo.marketReferenceCurrencyUnit = baseCurrencyUnit; - baseCurrencyInfo.marketReferenceCurrencyPriceInUsd = int256(baseCurrencyUnit); - } catch (bytes memory /*lowLevelData*/) { - baseCurrencyInfo.marketReferenceCurrencyUnit = ETH_CURRENCY_UNIT; - baseCurrencyInfo - .marketReferenceCurrencyPriceInUsd = marketReferenceCurrencyPriceInUsdProxyAggregator - .latestAnswer(); - } - - return (reservesData, baseCurrencyInfo); - } - - /// @inheritdoc IUiPoolDataProviderV3 - function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory) { - IPool pool = IPool(provider.getPool()); - Emode[] memory tempCategories = new Emode[](256); - uint8 eModesFound = 0; - uint8 missCounter = 0; - for (uint8 i = 1; i < 256; i++) { - DataTypes.CollateralConfig memory cfg = pool.getEModeCategoryCollateralConfig(i); - if (cfg.liquidationThreshold != 0) { - tempCategories[eModesFound] = Emode({ - eMode: DataTypes.EModeCategory({ - ltv: cfg.ltv, - liquidationThreshold: cfg.liquidationThreshold, - liquidationBonus: cfg.liquidationBonus, - label: pool.getEModeCategoryLabel(i), - collateralBitmap: pool.getEModeCategoryCollateralBitmap(i), - borrowableBitmap: pool.getEModeCategoryBorrowableBitmap(i) - }), - id: i - }); - ++eModesFound; - missCounter = 0; - } else { - ++missCounter; - } - // assumes there will never be a gap > 2 when setting eModes - if (missCounter > 2) break; - } - Emode[] memory categories = new Emode[](eModesFound); - for (uint8 i = 0; i < eModesFound; i++) { - categories[i] = tempCategories[i]; - } - return categories; - } - - function getUserReservesData( - IPoolAddressesProvider provider, - address user - ) external view override returns (UserReserveData[] memory, uint8) { - IPool pool = IPool(provider.getPool()); - address[] memory reserves = pool.getReservesList(); - DataTypes.UserConfigurationMap memory userConfig = pool.getUserConfiguration(user); - - uint8 userEmodeCategoryId = uint8(pool.getUserEMode(user)); - - UserReserveData[] memory userReservesData = new UserReserveData[]( - user != address(0) ? reserves.length : 0 - ); - - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); - - // user reserve data - userReservesData[i].underlyingAsset = reserves[i]; - userReservesData[i].scaledATokenBalance = IAToken(baseData.aTokenAddress).scaledBalanceOf( - user - ); - userReservesData[i].usageAsCollateralEnabledOnUser = userConfig.isUsingAsCollateral(i); - - if (userConfig.isBorrowing(i)) { - userReservesData[i].scaledVariableDebt = IVariableDebtToken( - baseData.variableDebtTokenAddress - ).scaledBalanceOf(user); - } - } - - return (userReservesData, userEmodeCategoryId); - } - - function bytes32ToString(bytes32 _bytes32) public pure returns (string memory) { - uint8 i = 0; - while (i < 32 && _bytes32[i] != 0) { - i++; - } - bytes memory bytesArray = new bytes(i); - for (i = 0; i < 32 && _bytes32[i] != 0; i++) { - bytesArray[i] = _bytes32[i]; - } - return string(bytesArray); - } -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol deleted file mode 100644 index 671b658b..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol +++ /dev/null @@ -1,295 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; -import {WadRayMath} from '../protocol/libraries/math/WadRayMath.sol'; -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {IVariableDebtToken} from '../interfaces/IVariableDebtToken.sol'; -import {IPool} from '../interfaces/IPool.sol'; -import {IPoolDataProvider} from '../interfaces/IPoolDataProvider.sol'; - -/** - * @title AaveProtocolDataProvider - * @author Aave - * @notice Peripheral contract to collect and pre-process information from the Pool. - */ -contract AaveProtocolDataProvider is IPoolDataProvider { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - - address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; - address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /// @inheritdoc IPoolDataProvider - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @notice Constructor - * @param addressesProvider The address of the PoolAddressesProvider contract - */ - constructor(IPoolAddressesProvider addressesProvider) { - ADDRESSES_PROVIDER = addressesProvider; - } - - /// @inheritdoc IPoolDataProvider - function getAllReservesTokens() external view override returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory reservesTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - if (reserves[i] == MKR) { - reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); - continue; - } - if (reserves[i] == ETH) { - reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); - continue; - } - reservesTokens[i] = TokenData({ - symbol: IERC20Detailed(reserves[i]).symbol(), - tokenAddress: reserves[i] - }); - } - return reservesTokens; - } - - /// @inheritdoc IPoolDataProvider - function getAllATokens() external view override returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory aTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveDataLegacy memory reserveData = pool.getReserveData(reserves[i]); - aTokens[i] = TokenData({ - symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), - tokenAddress: reserveData.aTokenAddress - }); - } - return aTokens; - } - - /// @inheritdoc IPoolDataProvider - function getReserveConfigurationData( - address asset - ) - external - view - override - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ) - { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration - .getParams(); - - (isActive, isFrozen, borrowingEnabled, ) = configuration.getFlags(); - - // @notice all stable debt related parameters deprecated in v3.2.0 - stableBorrowRateEnabled = false; - - usageAsCollateralEnabled = liquidationThreshold != 0; - } - - /// @inheritdoc IPoolDataProvider - function getReserveCaps( - address asset - ) external view override returns (uint256 borrowCap, uint256 supplyCap) { - (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); - } - - /// @inheritdoc IPoolDataProvider - function getPaused(address asset) external view override returns (bool isPaused) { - (, , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); - } - - /// @inheritdoc IPoolDataProvider - function getSiloedBorrowing(address asset) external view override returns (bool) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); - } - - /// @inheritdoc IPoolDataProvider - function getLiquidationProtocolFee(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); - } - - /// @inheritdoc IPoolDataProvider - function getUnbackedMintCap(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); - } - - /// @inheritdoc IPoolDataProvider - function getDebtCeiling(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); - } - - /// @inheritdoc IPoolDataProvider - function getDebtCeilingDecimals() external pure override returns (uint256) { - return ReserveConfiguration.DEBT_CEILING_DECIMALS; - } - - /// @inheritdoc IPoolDataProvider - function getReserveData( - address asset - ) - external - view - override - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - // @notice all stable debt related parameters deprecated in v3.2.0 - return ( - reserve.unbacked, - reserve.accruedToTreasury, - IERC20Detailed(reserve.aTokenAddress).totalSupply(), - 0, - IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), - reserve.currentLiquidityRate, - reserve.currentVariableBorrowRate, - 0, - 0, - reserve.liquidityIndex, - reserve.variableBorrowIndex, - reserve.lastUpdateTimestamp - ); - } - - /// @inheritdoc IPoolDataProvider - function getATokenTotalSupply(address asset) external view override returns (uint256) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.aTokenAddress).totalSupply(); - } - - /// @inheritdoc IPoolDataProvider - function getTotalDebt(address asset) external view override returns (uint256) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); - } - - /// @inheritdoc IPoolDataProvider - function getUserReserveData( - address asset, - address user - ) - external - view - override - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) - .getUserConfiguration(user); - - currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); - currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); - - // @notice all stable debt related parameters deprecated in v3.2.0 - currentStableDebt = principalStableDebt = stableBorrowRate = stableRateLastUpdated = 0; - - scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); - liquidityRate = reserve.currentLiquidityRate; - usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); - } - - /// @inheritdoc IPoolDataProvider - function getReserveTokensAddresses( - address asset - ) - external - view - override - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - // @notice all stable debt related parameters deprecated in v3.2.0 - return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); - } - - /// @inheritdoc IPoolDataProvider - function getInterestRateStrategyAddress( - address asset - ) external view override returns (address irStrategyAddress) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - return (reserve.interestRateStrategyAddress); - } - - /// @inheritdoc IPoolDataProvider - function getFlashLoanEnabled(address asset) external view override returns (bool) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - return configuration.getFlashLoanEnabled(); - } - - /// @inheritdoc IPoolDataProvider - function getIsVirtualAccActive(address asset) external view override returns (bool) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - return configuration.getIsVirtualAccActive(); - } - - /// @inheritdoc IPoolDataProvider - function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); - } -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol deleted file mode 100644 index b079d2dd..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol +++ /dev/null @@ -1,265 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../interfaces/IPool.sol'; -import {IAaveOracle} from '../interfaces/IAaveOracle.sol'; -import {IAToken} from '../interfaces/IAToken.sol'; -import {IVariableDebtToken} from '../interfaces/IVariableDebtToken.sol'; -import {IDefaultInterestRateStrategyV2} from '../interfaces/IDefaultInterestRateStrategyV2.sol'; -import {AaveProtocolDataProvider} from './AaveProtocolDataProvider.sol'; -import {WadRayMath} from '../protocol/libraries/math/WadRayMath.sol'; -import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; -import {IEACAggregatorProxy} from './interfaces/IEACAggregatorProxy.sol'; -import {IERC20DetailedBytes} from './interfaces/IERC20DetailedBytes.sol'; -import {IUiPoolDataProviderV3} from './interfaces/IUiPoolDataProviderV3.sol'; - -contract UiPoolDataProviderV3 is IUiPoolDataProviderV3 { - using WadRayMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - IEACAggregatorProxy public immutable networkBaseTokenPriceInUsdProxyAggregator; - IEACAggregatorProxy public immutable marketReferenceCurrencyPriceInUsdProxyAggregator; - uint256 public constant ETH_CURRENCY_UNIT = 1 ether; - address public constant MKR_ADDRESS = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; - - constructor( - IEACAggregatorProxy _networkBaseTokenPriceInUsdProxyAggregator, - IEACAggregatorProxy _marketReferenceCurrencyPriceInUsdProxyAggregator - ) { - networkBaseTokenPriceInUsdProxyAggregator = _networkBaseTokenPriceInUsdProxyAggregator; - marketReferenceCurrencyPriceInUsdProxyAggregator = _marketReferenceCurrencyPriceInUsdProxyAggregator; - } - - function getReservesList( - IPoolAddressesProvider provider - ) external view override returns (address[] memory) { - IPool pool = IPool(provider.getPool()); - return pool.getReservesList(); - } - - function getReservesData( - IPoolAddressesProvider provider - ) external view override returns (AggregatedReserveData[] memory, BaseCurrencyInfo memory) { - IAaveOracle oracle = IAaveOracle(provider.getPriceOracle()); - IPool pool = IPool(provider.getPool()); - AaveProtocolDataProvider poolDataProvider = AaveProtocolDataProvider( - provider.getPoolDataProvider() - ); - - address[] memory reserves = pool.getReservesList(); - AggregatedReserveData[] memory reservesData = new AggregatedReserveData[](reserves.length); - - for (uint256 i = 0; i < reserves.length; i++) { - AggregatedReserveData memory reserveData = reservesData[i]; - reserveData.underlyingAsset = reserves[i]; - - // reserve current state - DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData( - reserveData.underlyingAsset - ); - //the liquidity index. Expressed in ray - reserveData.liquidityIndex = baseData.liquidityIndex; - //variable borrow index. Expressed in ray - reserveData.variableBorrowIndex = baseData.variableBorrowIndex; - //the current supply rate. Expressed in ray - reserveData.liquidityRate = baseData.currentLiquidityRate; - //the current variable borrow rate. Expressed in ray - reserveData.variableBorrowRate = baseData.currentVariableBorrowRate; - reserveData.lastUpdateTimestamp = baseData.lastUpdateTimestamp; - reserveData.aTokenAddress = baseData.aTokenAddress; - reserveData.variableDebtTokenAddress = baseData.variableDebtTokenAddress; - //address of the interest rate strategy - reserveData.interestRateStrategyAddress = baseData.interestRateStrategyAddress; - reserveData.priceInMarketReferenceCurrency = oracle.getAssetPrice( - reserveData.underlyingAsset - ); - reserveData.priceOracle = oracle.getSourceOfAsset(reserveData.underlyingAsset); - reserveData.availableLiquidity = IERC20Detailed(reserveData.underlyingAsset).balanceOf( - reserveData.aTokenAddress - ); - reserveData.totalScaledVariableDebt = IVariableDebtToken(reserveData.variableDebtTokenAddress) - .scaledTotalSupply(); - - // Due we take the symbol from underlying token we need a special case for $MKR as symbol() returns bytes32 - if (address(reserveData.underlyingAsset) == address(MKR_ADDRESS)) { - bytes32 symbol = IERC20DetailedBytes(reserveData.underlyingAsset).symbol(); - bytes32 name = IERC20DetailedBytes(reserveData.underlyingAsset).name(); - reserveData.symbol = bytes32ToString(symbol); - reserveData.name = bytes32ToString(name); - } else { - reserveData.symbol = IERC20Detailed(reserveData.underlyingAsset).symbol(); - reserveData.name = IERC20Detailed(reserveData.underlyingAsset).name(); - } - - //stores the reserve configuration - DataTypes.ReserveConfigurationMap memory reserveConfigurationMap = baseData.configuration; - ( - reserveData.baseLTVasCollateral, - reserveData.reserveLiquidationThreshold, - reserveData.reserveLiquidationBonus, - reserveData.decimals, - reserveData.reserveFactor - ) = reserveConfigurationMap.getParams(); - reserveData.usageAsCollateralEnabled = reserveData.baseLTVasCollateral != 0; - - ( - reserveData.isActive, - reserveData.isFrozen, - reserveData.borrowingEnabled, - reserveData.isPaused - ) = reserveConfigurationMap.getFlags(); - - // interest rates - try - IDefaultInterestRateStrategyV2(reserveData.interestRateStrategyAddress).getInterestRateData( - reserveData.underlyingAsset - ) - returns (IDefaultInterestRateStrategyV2.InterestRateDataRay memory res) { - reserveData.baseVariableBorrowRate = res.baseVariableBorrowRate; - reserveData.variableRateSlope1 = res.variableRateSlope1; - reserveData.variableRateSlope2 = res.variableRateSlope2; - reserveData.optimalUsageRatio = res.optimalUsageRatio; - } catch {} - - // v3 only - reserveData.debtCeiling = reserveConfigurationMap.getDebtCeiling(); - reserveData.debtCeilingDecimals = poolDataProvider.getDebtCeilingDecimals(); - (reserveData.borrowCap, reserveData.supplyCap) = reserveConfigurationMap.getCaps(); - - try poolDataProvider.getFlashLoanEnabled(reserveData.underlyingAsset) returns ( - bool flashLoanEnabled - ) { - reserveData.flashLoanEnabled = flashLoanEnabled; - } catch (bytes memory) { - reserveData.flashLoanEnabled = true; - } - - reserveData.isSiloedBorrowing = reserveConfigurationMap.getSiloedBorrowing(); - reserveData.unbacked = baseData.unbacked; - reserveData.isolationModeTotalDebt = baseData.isolationModeTotalDebt; - reserveData.accruedToTreasury = baseData.accruedToTreasury; - - reserveData.borrowableInIsolation = reserveConfigurationMap.getBorrowableInIsolation(); - - try poolDataProvider.getIsVirtualAccActive(reserveData.underlyingAsset) returns ( - bool virtualAccActive - ) { - reserveData.virtualAccActive = virtualAccActive; - } catch (bytes memory) { - reserveData.virtualAccActive = false; - } - - try pool.getVirtualUnderlyingBalance(reserveData.underlyingAsset) returns ( - uint128 virtualUnderlyingBalance - ) { - reserveData.virtualUnderlyingBalance = virtualUnderlyingBalance; - } catch (bytes memory) { - reserveData.virtualUnderlyingBalance = 0; - } - } - - BaseCurrencyInfo memory baseCurrencyInfo; - baseCurrencyInfo.networkBaseTokenPriceInUsd = networkBaseTokenPriceInUsdProxyAggregator - .latestAnswer(); - baseCurrencyInfo.networkBaseTokenPriceDecimals = networkBaseTokenPriceInUsdProxyAggregator - .decimals(); - - try oracle.BASE_CURRENCY_UNIT() returns (uint256 baseCurrencyUnit) { - baseCurrencyInfo.marketReferenceCurrencyUnit = baseCurrencyUnit; - baseCurrencyInfo.marketReferenceCurrencyPriceInUsd = int256(baseCurrencyUnit); - } catch (bytes memory /*lowLevelData*/) { - baseCurrencyInfo.marketReferenceCurrencyUnit = ETH_CURRENCY_UNIT; - baseCurrencyInfo - .marketReferenceCurrencyPriceInUsd = marketReferenceCurrencyPriceInUsdProxyAggregator - .latestAnswer(); - } - - return (reservesData, baseCurrencyInfo); - } - - /// @inheritdoc IUiPoolDataProviderV3 - function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory) { - IPool pool = IPool(provider.getPool()); - Emode[] memory tempCategories = new Emode[](256); - uint8 eModesFound = 0; - uint8 missCounter = 0; - for (uint8 i = 1; i < 256; i++) { - DataTypes.CollateralConfig memory cfg = pool.getEModeCategoryCollateralConfig(i); - if (cfg.liquidationThreshold != 0) { - tempCategories[eModesFound] = Emode({ - eMode: DataTypes.EModeCategory({ - ltv: cfg.ltv, - liquidationThreshold: cfg.liquidationThreshold, - liquidationBonus: cfg.liquidationBonus, - label: pool.getEModeCategoryLabel(i), - collateralBitmap: pool.getEModeCategoryCollateralBitmap(i), - borrowableBitmap: pool.getEModeCategoryBorrowableBitmap(i) - }), - id: i - }); - ++eModesFound; - missCounter = 0; - } else { - ++missCounter; - } - // assumes there will never be a gap > 2 when setting eModes - if (missCounter > 2) break; - } - Emode[] memory categories = new Emode[](eModesFound); - for (uint8 i = 0; i < eModesFound; i++) { - categories[i] = tempCategories[i]; - } - return categories; - } - - function getUserReservesData( - IPoolAddressesProvider provider, - address user - ) external view override returns (UserReserveData[] memory, uint8) { - IPool pool = IPool(provider.getPool()); - address[] memory reserves = pool.getReservesList(); - DataTypes.UserConfigurationMap memory userConfig = pool.getUserConfiguration(user); - - uint8 userEmodeCategoryId = uint8(pool.getUserEMode(user)); - - UserReserveData[] memory userReservesData = new UserReserveData[]( - user != address(0) ? reserves.length : 0 - ); - - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); - - // user reserve data - userReservesData[i].underlyingAsset = reserves[i]; - userReservesData[i].scaledATokenBalance = IAToken(baseData.aTokenAddress).scaledBalanceOf( - user - ); - userReservesData[i].usageAsCollateralEnabledOnUser = userConfig.isUsingAsCollateral(i); - - if (userConfig.isBorrowing(i)) { - userReservesData[i].scaledVariableDebt = IVariableDebtToken( - baseData.variableDebtTokenAddress - ).scaledBalanceOf(user); - } - } - - return (userReservesData, userEmodeCategoryId); - } - - function bytes32ToString(bytes32 _bytes32) public pure returns (string memory) { - uint8 i = 0; - while (i < 32 && _bytes32[i] != 0) { - i++; - } - bytes memory bytesArray = new bytes(i); - for (i = 0; i < 32 && _bytes32[i] != 0; i++) { - bytesArray[i] = _bytes32[i]; - } - return string(bytesArray); - } -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol deleted file mode 100644 index c89baee6..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol deleted file mode 100644 index 0541f0da..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; - -interface IERC20DetailedBytes is IERC20 { - function name() external view returns (bytes32); - - function symbol() external view returns (bytes32); - - function decimals() external view returns (uint8); -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol deleted file mode 100644 index 3280d75b..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol +++ /dev/null @@ -1,95 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {DataTypes} from '../../protocol/libraries/types/DataTypes.sol'; - -interface IUiPoolDataProviderV3 { - struct AggregatedReserveData { - address underlyingAsset; - string name; - string symbol; - uint256 decimals; - uint256 baseLTVasCollateral; - uint256 reserveLiquidationThreshold; - uint256 reserveLiquidationBonus; - uint256 reserveFactor; - bool usageAsCollateralEnabled; - bool borrowingEnabled; - bool isActive; - bool isFrozen; - // base data - uint128 liquidityIndex; - uint128 variableBorrowIndex; - uint128 liquidityRate; - uint128 variableBorrowRate; - uint40 lastUpdateTimestamp; - address aTokenAddress; - address variableDebtTokenAddress; - address interestRateStrategyAddress; - // - uint256 availableLiquidity; - uint256 totalScaledVariableDebt; - uint256 priceInMarketReferenceCurrency; - address priceOracle; - uint256 variableRateSlope1; - uint256 variableRateSlope2; - uint256 baseVariableBorrowRate; - uint256 optimalUsageRatio; - // v3 only - bool isPaused; - bool isSiloedBorrowing; - uint128 accruedToTreasury; - uint128 unbacked; - uint128 isolationModeTotalDebt; - bool flashLoanEnabled; - // - uint256 debtCeiling; - uint256 debtCeilingDecimals; - uint256 borrowCap; - uint256 supplyCap; - bool borrowableInIsolation; - // v3.1 - bool virtualAccActive; - uint128 virtualUnderlyingBalance; - } - - struct UserReserveData { - address underlyingAsset; - uint256 scaledATokenBalance; - bool usageAsCollateralEnabledOnUser; - uint256 scaledVariableDebt; - } - - struct BaseCurrencyInfo { - uint256 marketReferenceCurrencyUnit; - int256 marketReferenceCurrencyPriceInUsd; - int256 networkBaseTokenPriceInUsd; - uint8 networkBaseTokenPriceDecimals; - } - - struct Emode { - uint8 id; - DataTypes.EModeCategory eMode; - } - - function getReservesList( - IPoolAddressesProvider provider - ) external view returns (address[] memory); - - function getReservesData( - IPoolAddressesProvider provider - ) external view returns (AggregatedReserveData[] memory, BaseCurrencyInfo memory); - - function getUserReservesData( - IPoolAddressesProvider provider, - address user - ) external view returns (UserReserveData[] memory, uint8); - - /** - * @dev Iterates the eModes mapping and returns all eModes found - * @notice The method assumes for id gaps <= 2 within the eMode definitions - * @return an array of eModes that were found in the eMode mapping - */ - function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory); -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol deleted file mode 100644 index 265d2560..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPriceOracleGetter} from './IPriceOracleGetter.sol'; -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IAaveOracle - * @author Aave - * @notice Defines the basic interface for the Aave Oracle - */ -interface IAaveOracle is IPriceOracleGetter { - /** - * @dev Emitted after the base currency is set - * @param baseCurrency The base currency of used for price quotes - * @param baseCurrencyUnit The unit of the base currency - */ - event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); - - /** - * @dev Emitted after the price source of an asset is updated - * @param asset The address of the asset - * @param source The price source of the asset - */ - event AssetSourceUpdated(address indexed asset, address indexed source); - - /** - * @dev Emitted after the address of fallback oracle is updated - * @param fallbackOracle The address of the fallback oracle - */ - event FallbackOracleUpdated(address indexed fallbackOracle); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Sets or replaces price sources of assets - * @param assets The addresses of the assets - * @param sources The addresses of the price sources - */ - function setAssetSources(address[] calldata assets, address[] calldata sources) external; - - /** - * @notice Sets the fallback oracle - * @param fallbackOracle The address of the fallback oracle - */ - function setFallbackOracle(address fallbackOracle) external; - - /** - * @notice Returns a list of prices from a list of assets addresses - * @param assets The list of assets addresses - * @return The prices of the given assets - */ - function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); - - /** - * @notice Returns the address of the source for an asset address - * @param asset The address of the asset - * @return The address of the source - */ - function getSourceOfAsset(address asset) external view returns (address); - - /** - * @notice Returns the address of the fallback oracle - * @return The address of the fallback oracle - */ - function getFallbackOracle() external view returns (address); -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol deleted file mode 100644 index 938e2d8f..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol +++ /dev/null @@ -1,161 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IReserveInterestRateStrategy} from './IReserveInterestRateStrategy.sol'; -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IDefaultInterestRateStrategyV2 - * @author BGD Labs - * @notice Interface of the default interest rate strategy used by the Aave protocol - */ -interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { - /** - * @notice Holds the interest rate data for a given reserve - * - * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This - * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. - * - * @param optimalUsageRatio The optimal usage ratio, in bps - * @param baseVariableBorrowRate The base variable borrow rate, in bps - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps - */ - struct InterestRateData { - uint16 optimalUsageRatio; - uint32 baseVariableBorrowRate; - uint32 variableRateSlope1; - uint32 variableRateSlope2; - } - - /** - * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, - * used in in-memory calculations. - * - * @param optimalUsageRatio The optimal usage ratio - * @param baseVariableBorrowRate The base variable borrow rate - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio - */ - struct InterestRateDataRay { - uint256 optimalUsageRatio; - uint256 baseVariableBorrowRate; - uint256 variableRateSlope1; - uint256 variableRateSlope2; - } - - /** - * @notice emitted when new interest rate data is set in a reserve - * - * @param reserve address of the reserve that has new interest rate data set - * @param optimalUsageRatio The optimal usage ratio, in bps - * @param baseVariableBorrowRate The base variable borrow rate, in bps - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps - */ - event RateDataUpdate( - address indexed reserve, - uint256 optimalUsageRatio, - uint256 baseVariableBorrowRate, - uint256 variableRateSlope1, - uint256 variableRateSlope2 - ); - - /** - * @notice Returns the address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the maximum value achievable for variable borrow rate, in bps - * @return The maximum rate - */ - function MAX_BORROW_RATE() external view returns (uint256); - - /** - * @notice Returns the minimum optimal point, in bps - * @return The optimal point - */ - function MIN_OPTIMAL_POINT() external view returns (uint256); - - /** - * @notice Returns the maximum optimal point, in bps - * @return The optimal point - */ - function MAX_OPTIMAL_POINT() external view returns (uint256); - - /** - * notice Returns the full InterestRateData object for the given reserve, in ray - * - * @param reserve The reserve to get the data of - * - * @return The InterestRateDataRay object for the given reserve - */ - function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); - - /** - * notice Returns the full InterestRateDataRay object for the given reserve, in bps - * - * @param reserve The reserve to get the data of - * - * @return The InterestRateData object for the given reserve - */ - function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); - - /** - * @notice Returns the optimal usage rate for the given reserve in ray - * - * @param reserve The reserve to get the optimal usage rate of - * - * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate - */ - function getOptimalUsageRatio(address reserve) external view returns (uint256); - - /** - * @notice Returns the variable rate slope below optimal usage ratio in ray - * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO - * - * @param reserve The reserve to get the variable rate slope 1 of - * - * @return The variable rate slope - */ - function getVariableRateSlope1(address reserve) external view returns (uint256); - - /** - * @notice Returns the variable rate slope above optimal usage ratio in ray - * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO - * - * @param reserve The reserve to get the variable rate slope 2 of - * - * @return The variable rate slope - */ - function getVariableRateSlope2(address reserve) external view returns (uint256); - - /** - * @notice Returns the base variable borrow rate, in ray - * - * @param reserve The reserve to get the base variable borrow rate of - * - * @return The base variable borrow rate - */ - function getBaseVariableBorrowRate(address reserve) external view returns (uint256); - - /** - * @notice Returns the maximum variable borrow rate, in ray - * - * @param reserve The reserve to get the maximum variable borrow rate of - * - * @return The maximum variable borrow rate - */ - function getMaxVariableBorrowRate(address reserve) external view returns (uint256); - - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The reserve interest rate data to apply to the given reserve - * Being specific to this custom implementation, with custom struct type, - * overloading the function on the generic interface - */ - function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol deleted file mode 100644 index a9df8903..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol +++ /dev/null @@ -1,250 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPoolDataProvider - * @author Aave - * @notice Defines the basic interface of a PoolDataProvider - */ -interface IPoolDataProvider { - struct TokenData { - string symbol; - address tokenAddress; - } - - /** - * @notice Returns the address for the PoolAddressesProvider contract. - * @return The address for the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the list of the existing reserves in the pool. - * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. - * @return The list of reserves, pairs of symbols and addresses - */ - function getAllReservesTokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the list of the existing ATokens in the pool. - * @return The list of ATokens, pairs of symbols and addresses - */ - function getAllATokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the configuration data of the reserve - * @dev Not returning borrow and supply caps for compatibility, nor pause flag - * @param asset The address of the underlying asset of the reserve - * @return decimals The number of decimals of the reserve - * @return ltv The ltv of the reserve - * @return liquidationThreshold The liquidationThreshold of the reserve - * @return liquidationBonus The liquidationBonus of the reserve - * @return reserveFactor The reserveFactor of the reserve - * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise - * @return borrowingEnabled True if borrowing is enabled, false otherwise - * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise - * @return isActive True if it is active, false otherwise - * @return isFrozen True if it is frozen, false otherwise - */ - function getReserveConfigurationData( - address asset - ) - external - view - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ); - - /** - * @notice Returns the caps parameters of the reserve - * @param asset The address of the underlying asset of the reserve - * @return borrowCap The borrow cap of the reserve - * @return supplyCap The supply cap of the reserve - */ - function getReserveCaps( - address asset - ) external view returns (uint256 borrowCap, uint256 supplyCap); - - /** - * @notice Returns if the pool is paused - * @param asset The address of the underlying asset of the reserve - * @return isPaused True if the pool is paused, false otherwise - */ - function getPaused(address asset) external view returns (bool isPaused); - - /** - * @notice Returns the siloed borrowing flag - * @param asset The address of the underlying asset of the reserve - * @return True if the asset is siloed for borrowing - */ - function getSiloedBorrowing(address asset) external view returns (bool); - - /** - * @notice Returns the protocol fee on the liquidation bonus - * @param asset The address of the underlying asset of the reserve - * @return The protocol fee on liquidation - */ - function getLiquidationProtocolFee(address asset) external view returns (uint256); - - /** - * @notice Returns the unbacked mint cap of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The unbacked mint cap of the reserve - */ - function getUnbackedMintCap(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The debt ceiling of the reserve - */ - function getDebtCeiling(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling decimals - * @return The debt ceiling decimals - */ - function getDebtCeilingDecimals() external pure returns (uint256); - - /** - * @notice Returns the reserve data - * @param asset The address of the underlying asset of the reserve - * @return unbacked The amount of unbacked tokens - * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted - * @return totalAToken The total supply of the aToken - * @return totalStableDebt The total stable debt of the reserve - * @return totalVariableDebt The total variable debt of the reserve - * @return liquidityRate The liquidity rate of the reserve - * @return variableBorrowRate The variable borrow rate of the reserve - * @return stableBorrowRate The stable borrow rate of the reserve - * @return averageStableBorrowRate The average stable borrow rate of the reserve - * @return liquidityIndex The liquidity index of the reserve - * @return variableBorrowIndex The variable borrow index of the reserve - * @return lastUpdateTimestamp The timestamp of the last update of the reserve - */ - function getReserveData( - address asset - ) - external - view - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ); - - /** - * @notice Returns the total supply of aTokens for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total supply of the aToken - */ - function getATokenTotalSupply(address asset) external view returns (uint256); - - /** - * @notice Returns the total debt for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total debt for asset - */ - function getTotalDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the user data in a reserve - * @param asset The address of the underlying asset of the reserve - * @param user The address of the user - * @return currentATokenBalance The current AToken balance of the user - * @return currentStableDebt The current stable debt of the user - * @return currentVariableDebt The current variable debt of the user - * @return principalStableDebt The principal stable debt of the user - * @return scaledVariableDebt The scaled variable debt of the user - * @return stableBorrowRate The stable borrow rate of the user - * @return liquidityRate The liquidity rate of the reserve - * @return stableRateLastUpdated The timestamp of the last update of the user stable rate - * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false - * otherwise - */ - function getUserReserveData( - address asset, - address user - ) - external - view - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ); - - /** - * @notice Returns the token addresses of the reserve - * @param asset The address of the underlying asset of the reserve - * @return aTokenAddress The AToken address of the reserve - * @return stableDebtTokenAddress DEPRECATED in v3.2.0 - * @return variableDebtTokenAddress The VariableDebtToken address of the reserve - */ - function getReserveTokensAddresses( - address asset - ) - external - view - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ); - - /** - * @notice Returns the address of the Interest Rate strategy - * @param asset The address of the underlying asset of the reserve - * @return irStrategyAddress The address of the Interest Rate strategy - */ - function getInterestRateStrategyAddress( - address asset - ) external view returns (address irStrategyAddress); - - /** - * @notice Returns whether the reserve has FlashLoans enabled or disabled - * @param asset The address of the underlying asset of the reserve - * @return True if FlashLoans are enabled, false otherwise - */ - function getFlashLoanEnabled(address asset) external view returns (bool); - - /** - * @notice Returns whether virtual accounting is enabled/not for a reserve - * @param asset The address of the underlying asset of the reserve - * @return True if active, false otherwise - */ - function getIsVirtualAccActive(address asset) external view returns (bool); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/ARBITRUM/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER.sol deleted file mode 100644 index 0195ac02..00000000 --- a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER.sol +++ /dev/null @@ -1,2255 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity =0.8.10; - -// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // According to EIP-1052, 0x0 is the value returned for not-yet created accounts - // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned - // for accounts without code, i.e. `keccak256('')` - bytes32 codehash; - bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; - // solhint-disable-next-line no-inline-assembly - assembly { - codehash := extcodehash(account) - } - return (codehash != accountHash && codehash != 0x0); - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - // solhint-disable-next-line avoid-low-level-calls, avoid-call-value - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } -} - -// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - **/ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - **/ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - **/ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - **/ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - **/ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - **/ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - **/ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - **/ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - **/ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' - string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 -} - -// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - //the current stable borrow rate. Expressed in ray - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - //stableDebtToken address - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62-63: reserved - //bit 64-79: reserve factor - //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167 liquidation protocol fee - //bit 168-175 eMode category - //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // each eMode category may or may not have a custom oracle to override the individual assets price oracles - address priceSource; - string label; - } - - enum InterestRateMode { - NONE, - STABLE, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currPrincipalStableDebt; - uint256 currAvgStableBorrowRate; - uint256 currTotalStableDebt; - uint256 nextAvgStableBorrowRate; - uint256 nextTotalStableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address stableDebtTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - uint40 stableDebtLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address addressesProvider; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 maxStableLoanPercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalStableDebt; - uint256 totalVariableDebt; - uint256 averageStableBorrowRate; - uint256 reserveFactor; - address reserve; - address aToken; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address stableDebtAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - **/ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - **/ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - **/ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - **/ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - **/ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - **/ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - **/ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on swapBorrowRateMode() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user swapping his rate mode - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - **/ - event SwapBorrowRateMode( - address indexed reserve, - address indexed user, - DataTypes.InterestRateMode interestRateMode - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - **/ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - **/ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - **/ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on rebalanceStableBorrowRate() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user for which the rebalance has been executed - **/ - event RebalanceStableBorrowRate(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt - * @param premium The fee flash borrowed - * @param referralCode The referral code used - **/ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - **/ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - **/ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - **/ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @dev Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @dev Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - **/ - function backUnbacked(address asset, uint256 amount, uint256 fee) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - **/ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - **/ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the - * corresponding debt token (StableDebtToken or VariableDebtToken) - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 stable/variable debt tokens, depending on the `interestRateMode` - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - **/ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - **/ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - **/ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @return The final amount repaid - **/ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa - * @param asset The address of the underlying asset borrowed - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - **/ - function swapBorrowRateMode(address asset, uint256 interestRateMode) external; - - /** - * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. - * - Users can be rebalanced if the following conditions are satisfied: - * 1. Usage ratio is above 95% - * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too - * much has been borrowed at a stable rate and suppliers are not earning enough - * @param asset The address of the underlying asset borrowed - * @param user The address of the user to be rebalanced - **/ - function rebalanceStableBorrowRate(address asset, address user) external; - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - **/ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - **/ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://developers.aave.com - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://developers.aave.com - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - **/ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - **/ - function initReserve( - address asset, - address aTokenAddress, - address stableDebtAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - **/ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - **/ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - **/ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - **/ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - **/ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - **/ - function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - **/ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - **/ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - **/ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new category for the eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; - - /** - * @notice Returns the data of an eMode category - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate - * @return The percentage of available liquidity to borrow, expressed in bps - */ - function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - **/ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; -} - -// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant STABLE_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant EMODE_CATEGORY_MASK = 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant STABLE_BORROWING_ENABLED_START_BIT_POSITION = 59; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - /// @dev bit 63 reserved - - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - uint256 internal constant EMODE_CATEGORY_START_BIT_POSITION = 168; - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_EMODE_CATEGORY = 255; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - **/ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - **/ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - **/ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - **/ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - **/ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - **/ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - **/ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - **/ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - **/ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - **/ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - **/ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - **/ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - **/ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - **/ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - **/ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - **/ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - **/ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - **/ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - **/ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - **/ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables stable rate borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the stable rate borrowing needs to be enabled, false otherwise - **/ - function setStableRateBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & STABLE_BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << STABLE_BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the stable rate borrowing state of the reserve - * @param self The reserve configuration - * @return The stable rate borrowing state - **/ - function getStableRateBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~STABLE_BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - **/ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - **/ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - **/ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - **/ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - **/ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - **/ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - **/ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - **/ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - **/ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - **/ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - **/ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - **/ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the eMode asset category - * @param self The reserve configuration - * @param category The asset category when the user selects the eMode - **/ - function setEModeCategory( - DataTypes.ReserveConfigurationMap memory self, - uint256 category - ) internal pure { - require(category <= MAX_VALID_EMODE_CATEGORY, Errors.INVALID_EMODE_CATEGORY); - - self.data = (self.data & EMODE_CATEGORY_MASK) | (category << EMODE_CATEGORY_START_BIT_POSITION); - } - - /** - * @dev Gets the eMode asset category - * @param self The reserve configuration - * @return The eMode category for the asset - **/ - function getEModeCategory( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing stableRateBorrowing enabled - * @return The state flag representing paused - **/ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~STABLE_BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - * @return The state param representing eMode category - **/ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION, - (dataLocal & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - **/ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol - -/** - * @title WalletBalanceProvider contract - * @author Aave, influenced by https://github.com/wbobeirne/eth-balance-checker/blob/master/contracts/BalanceChecker.sol - * @notice Implements a logic of getting multiple tokens balance for one user address - * @dev NOTE: THIS CONTRACT IS NOT USED WITHIN THE AAVE PROTOCOL. It's an accessory contract used to reduce the number of calls - * towards the blockchain from the Aave backend. - **/ -contract WalletBalanceProvider { - using Address for address payable; - using Address for address; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - address constant MOCK_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /** - @dev Fallback function, don't accept any ETH - **/ - receive() external payable { - //only contracts can send ETH to the core - require(msg.sender.isContract(), '22'); - } - - /** - @dev Check the token balance of a wallet in a token contract - - Returns the balance of the token for user. Avoids possible errors: - - return 0 on non-contract address - **/ - function balanceOf(address user, address token) public view returns (uint256) { - if (token == MOCK_ETH_ADDRESS) { - return user.balance; // ETH balance - // check if token is actually a contract - } else if (token.isContract()) { - return IERC20(token).balanceOf(user); - } - revert('INVALID_TOKEN'); - } - - /** - * @notice Fetches, for a list of _users and _tokens (ETH included with mock address), the balances - * @param users The list of users - * @param tokens The list of tokens - * @return And array with the concatenation of, for each user, his/her balances - **/ - function batchBalanceOf( - address[] calldata users, - address[] calldata tokens - ) external view returns (uint256[] memory) { - uint256[] memory balances = new uint256[](users.length * tokens.length); - - for (uint256 i = 0; i < users.length; i++) { - for (uint256 j = 0; j < tokens.length; j++) { - balances[i * tokens.length + j] = balanceOf(users[i], tokens[j]); - } - } - - return balances; - } - - /** - @dev provides balances of user wallet for all reserves available on the pool - */ - function getUserWalletBalances( - address provider, - address user - ) external view returns (address[] memory, uint256[] memory) { - IPool pool = IPool(IPoolAddressesProvider(provider).getPool()); - - address[] memory reserves = pool.getReservesList(); - address[] memory reservesWithEth = new address[](reserves.length + 1); - for (uint256 i = 0; i < reserves.length; i++) { - reservesWithEth[i] = reserves[i]; - } - reservesWithEth[reserves.length] = MOCK_ETH_ADDRESS; - - uint256[] memory balances = new uint256[](reservesWithEth.length); - - for (uint256 j = 0; j < reserves.length; j++) { - DataTypes.ReserveConfigurationMap memory configuration = pool.getConfiguration( - reservesWithEth[j] - ); - - (bool isActive, , , , ) = configuration.getFlags(); - - if (!isActive) { - balances[j] = 0; - continue; - } - balances[j] = balanceOf(user, reservesWithEth[j]); - } - balances[reserves.length] = balanceOf(user, MOCK_ETH_ADDRESS); - - return (reservesWithEth, balances); - } -} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index 7c3a99d7..00000000 --- a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,124 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity 0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer( - IERC20 token, - address to, - uint256 value - ) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom( - IERC20 token, - address from, - address to, - uint256 value - ) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index c6dcfda7..00000000 --- a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // According to EIP-1052, 0x0 is the value returned for not-yet created accounts - // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned - // for accounts without code, i.e. `keccak256('')` - bytes32 codehash; - bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; - // solhint-disable-next-line no-inline-assembly - assembly { - codehash := extcodehash(account) - } - return (codehash != accountHash && codehash != 0x0); - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - // solhint-disable-next-line avoid-low-level-calls, avoid-call-value - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } -} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 7dc55938..00000000 --- a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,80 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPool.sol deleted file mode 100644 index 7f64b4ab..00000000 --- a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,747 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - **/ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - **/ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - **/ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - **/ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - **/ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 1 for Stable, 2 for Variable - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - **/ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - **/ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on swapBorrowRateMode() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user swapping his rate mode - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - **/ - event SwapBorrowRateMode( - address indexed reserve, - address indexed user, - DataTypes.InterestRateMode interestRateMode - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - **/ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - **/ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - **/ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on rebalanceStableBorrowRate() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user for which the rebalance has been executed - **/ - event RebalanceStableBorrowRate(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt - * @param premium The fee flash borrowed - * @param referralCode The referral code used - **/ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - **/ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - **/ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - **/ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @dev Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @dev Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - **/ - function backUnbacked( - address asset, - uint256 amount, - uint256 fee - ) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function supply( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - **/ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - **/ - function withdraw( - address asset, - uint256 amount, - address to - ) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the - * corresponding debt token (StableDebtToken or VariableDebtToken) - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 stable/variable debt tokens, depending on the `interestRateMode` - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - **/ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - **/ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - **/ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable - * @return The final amount repaid - **/ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa - * @param asset The address of the underlying asset borrowed - * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable - **/ - function swapBorrowRateMode(address asset, uint256 interestRateMode) external; - - /** - * @notice Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. - * - Users can be rebalanced if the following conditions are satisfied: - * 1. Usage ratio is above 95% - * 2. the current supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too - * much has been borrowed at a stable rate and suppliers are not earning enough - * @param asset The address of the underlying asset borrowed - * @param user The address of the user to be rebalanced - **/ - function rebalanceStableBorrowRate(address asset, address user) external; - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - **/ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - **/ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://developers.aave.com - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://developers.aave.com - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - **/ - function getUserAccountData(address user) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - **/ - function initReserve( - address asset, - address aTokenAddress, - address stableDebtAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - **/ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - **/ - function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress) - external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - **/ - function setConfiguration(address asset, DataTypes.ReserveConfigurationMap calldata configuration) - external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - **/ - function getConfiguration(address asset) - external - view - returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - **/ - function getUserConfiguration(address user) - external - view - returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - **/ - function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - **/ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - **/ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - **/ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new category for the eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; - - /** - * @notice Returns the data of an eMode category - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate - * @return The percentage of available liquidity to borrow, expressed in bps - */ - function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - **/ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens( - address token, - address to, - uint256 amount - ) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - **/ - function deposit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; -} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index 01a126bd..00000000 --- a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.10; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - **/ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - **/ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - **/ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - **/ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - **/ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - **/ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - **/ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - **/ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - **/ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index ed38c5c3..00000000 --- a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,633 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant STABLE_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant EMODE_CATEGORY_MASK = 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant STABLE_BORROWING_ENABLED_START_BIT_POSITION = 59; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - /// @dev bit 63 reserved - - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - uint256 internal constant EMODE_CATEGORY_START_BIT_POSITION = 168; - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_EMODE_CATEGORY = 255; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - **/ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - **/ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - **/ - function setLiquidationThreshold(DataTypes.ReserveConfigurationMap memory self, uint256 threshold) - internal - pure - { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - **/ - function getLiquidationThreshold(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - **/ - function setLiquidationBonus(DataTypes.ReserveConfigurationMap memory self, uint256 bonus) - internal - pure - { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - **/ - function getLiquidationBonus(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - **/ - function setDecimals(DataTypes.ReserveConfigurationMap memory self, uint256 decimals) - internal - pure - { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - **/ - function getDecimals(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - **/ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - **/ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - **/ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - **/ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - **/ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - **/ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - **/ - function setBorrowableInIsolation(DataTypes.ReserveConfigurationMap memory self, bool borrowable) - internal - pure - { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - **/ - function getBorrowableInIsolation(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (bool) - { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - **/ - function setSiloedBorrowing(DataTypes.ReserveConfigurationMap memory self, bool siloed) - internal - pure - { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - **/ - function getSiloedBorrowing(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (bool) - { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - **/ - function setBorrowingEnabled(DataTypes.ReserveConfigurationMap memory self, bool enabled) - internal - pure - { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - **/ - function getBorrowingEnabled(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (bool) - { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables stable rate borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the stable rate borrowing needs to be enabled, false otherwise - **/ - function setStableRateBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & STABLE_BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << STABLE_BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the stable rate borrowing state of the reserve - * @param self The reserve configuration - * @return The stable rate borrowing state - **/ - function getStableRateBorrowingEnabled(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (bool) - { - return (self.data & ~STABLE_BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - **/ - function setReserveFactor(DataTypes.ReserveConfigurationMap memory self, uint256 reserveFactor) - internal - pure - { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - **/ - function getReserveFactor(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - **/ - function setBorrowCap(DataTypes.ReserveConfigurationMap memory self, uint256 borrowCap) - internal - pure - { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - **/ - function getBorrowCap(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - **/ - function setSupplyCap(DataTypes.ReserveConfigurationMap memory self, uint256 supplyCap) - internal - pure - { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - **/ - function getSupplyCap(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - **/ - function setDebtCeiling(DataTypes.ReserveConfigurationMap memory self, uint256 ceiling) - internal - pure - { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - **/ - function getDebtCeiling(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - **/ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - **/ - function getLiquidationProtocolFee(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - **/ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - **/ - function getUnbackedMintCap(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the eMode asset category - * @param self The reserve configuration - * @param category The asset category when the user selects the eMode - **/ - function setEModeCategory(DataTypes.ReserveConfigurationMap memory self, uint256 category) - internal - pure - { - require(category <= MAX_VALID_EMODE_CATEGORY, Errors.INVALID_EMODE_CATEGORY); - - self.data = (self.data & EMODE_CATEGORY_MASK) | (category << EMODE_CATEGORY_START_BIT_POSITION); - } - - /** - * @dev Gets the eMode asset category - * @param self The reserve configuration - * @return The eMode category for the asset - **/ - function getEModeCategory(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256) - { - return (self.data & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing stableRateBorrowing enabled - * @return The state flag representing paused - **/ - function getFlags(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns ( - bool, - bool, - bool, - bool, - bool - ) - { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~STABLE_BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - * @return The state param representing eMode category - **/ - function getParams(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns ( - uint256, - uint256, - uint256, - uint256, - uint256, - uint256 - ) - { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION, - (dataLocal & ~EMODE_CATEGORY_MASK) >> EMODE_CATEGORY_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - **/ - function getCaps(DataTypes.ReserveConfigurationMap memory self) - internal - pure - returns (uint256, uint256) - { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index 640e4632..00000000 --- a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant STABLE_BORROWING_NOT_ENABLED = '31'; // 'Stable borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '38'; // 'The requested amount is greater than the max loan size in stable rate mode' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_STABLE_DEBT = '41'; // 'User does not have outstanding stable rate debt on this reserve' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant SAME_BLOCK_BORROW_REPAY = '48'; // 'Borrow and repay in same block is not allowed' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant ATOKEN_SUPPLY_NOT_ZERO = '54'; // 'AToken supply is not zero' - string public constant STABLE_DEBT_NOT_ZERO = '55'; // 'Stable debt supply is not zero' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE = '62'; // 'User is in isolation mode' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = '84'; // 'Invalid optimal stable to total debt ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant STABLE_BORROWING_ENABLED = '88'; // 'Stable borrowing is enabled' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 -} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 7113a0a5..00000000 --- a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/core-v3/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,268 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.10; - -library DataTypes { - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - //the current stable borrow rate. Expressed in ray - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - //stableDebtToken address - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62-63: reserved - //bit 64-79: reserve factor - //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167 liquidation protocol fee - //bit 168-175 eMode category - //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // each eMode category may or may not have a custom oracle to override the individual assets price oracles - address priceSource; - string label; - } - - enum InterestRateMode { - NONE, - STABLE, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currPrincipalStableDebt; - uint256 currAvgStableBorrowRate; - uint256 currTotalStableDebt; - uint256 nextAvgStableBorrowRate; - uint256 nextTotalStableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address stableDebtTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - uint40 stableDebtLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 maxStableRateBorrowSizePercent; - uint256 reservesCount; - address addressesProvider; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 maxStableLoanPercent; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalStableDebt; - uint256 totalVariableDebt; - uint256 averageStableBorrowRate; - uint256 reserveFactor; - address reserve; - address aToken; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address stableDebtAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol b/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol deleted file mode 100644 index 54ef4c14..00000000 --- a/downloads/ARBITRUM/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/@aave/periphery-v3/contracts/misc/WalletBalanceProvider.sol +++ /dev/null @@ -1,110 +0,0 @@ -// SPDX-License-Identifier: agpl-3.0 -pragma solidity 0.8.10; - -import {Address} from '../../../core-v3/contracts/dependencies/openzeppelin/contracts/Address.sol'; -import {IERC20} from '../../../core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; - -import {IPoolAddressesProvider} from '../../../core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../core-v3/contracts/interfaces/IPool.sol'; -import {GPv2SafeERC20} from '../../../core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {ReserveConfiguration} from '../../../core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol'; -import {DataTypes} from '../../../core-v3/contracts/protocol/libraries/types/DataTypes.sol'; - -/** - * @title WalletBalanceProvider contract - * @author Aave, influenced by https://github.com/wbobeirne/eth-balance-checker/blob/master/contracts/BalanceChecker.sol - * @notice Implements a logic of getting multiple tokens balance for one user address - * @dev NOTE: THIS CONTRACT IS NOT USED WITHIN THE AAVE PROTOCOL. It's an accessory contract used to reduce the number of calls - * towards the blockchain from the Aave backend. - **/ -contract WalletBalanceProvider { - using Address for address payable; - using Address for address; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - address constant MOCK_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /** - @dev Fallback function, don't accept any ETH - **/ - receive() external payable { - //only contracts can send ETH to the core - require(msg.sender.isContract(), '22'); - } - - /** - @dev Check the token balance of a wallet in a token contract - - Returns the balance of the token for user. Avoids possible errors: - - return 0 on non-contract address - **/ - function balanceOf(address user, address token) public view returns (uint256) { - if (token == MOCK_ETH_ADDRESS) { - return user.balance; // ETH balance - // check if token is actually a contract - } else if (token.isContract()) { - return IERC20(token).balanceOf(user); - } - revert('INVALID_TOKEN'); - } - - /** - * @notice Fetches, for a list of _users and _tokens (ETH included with mock address), the balances - * @param users The list of users - * @param tokens The list of tokens - * @return And array with the concatenation of, for each user, his/her balances - **/ - function batchBalanceOf(address[] calldata users, address[] calldata tokens) - external - view - returns (uint256[] memory) - { - uint256[] memory balances = new uint256[](users.length * tokens.length); - - for (uint256 i = 0; i < users.length; i++) { - for (uint256 j = 0; j < tokens.length; j++) { - balances[i * tokens.length + j] = balanceOf(users[i], tokens[j]); - } - } - - return balances; - } - - /** - @dev provides balances of user wallet for all reserves available on the pool - */ - function getUserWalletBalances(address provider, address user) - external - view - returns (address[] memory, uint256[] memory) - { - IPool pool = IPool(IPoolAddressesProvider(provider).getPool()); - - address[] memory reserves = pool.getReservesList(); - address[] memory reservesWithEth = new address[](reserves.length + 1); - for (uint256 i = 0; i < reserves.length; i++) { - reservesWithEth[i] = reserves[i]; - } - reservesWithEth[reserves.length] = MOCK_ETH_ADDRESS; - - uint256[] memory balances = new uint256[](reservesWithEth.length); - - for (uint256 j = 0; j < reserves.length; j++) { - DataTypes.ReserveConfigurationMap memory configuration = pool.getConfiguration( - reservesWithEth[j] - ); - - (bool isActive, , , , ) = configuration.getFlags(); - - if (!isActive) { - balances[j] = 0; - continue; - } - balances[j] = balanceOf(user, reservesWithEth[j]); - } - balances[reserves.length] = balanceOf(user, MOCK_ETH_ADDRESS); - - return (reservesWithEth, balances); - } -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY.sol b/downloads/ARBITRUM/WETH_GATEWAY.sol deleted file mode 100644 index 5984e041..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY.sol +++ /dev/null @@ -1,3076 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWETH.sol - -interface IWETH { - function deposit() external payable; - - function withdraw(uint256) external; - - function approve(address guy, uint256 wad) external returns (bool); - - function transferFrom(address src, address dst, uint256 wad) external returns (bool); -} - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol - -interface IWrappedTokenGatewayV3 { - function depositETH(address pool, address onBehalfOf, uint16 referralCode) external payable; - - function withdrawETH(address pool, uint256 amount, address onBehalfOf) external; - - function repayETH(address pool, uint256 amount, address onBehalfOf) external payable; - - function borrowETH(address pool, uint256 amount, uint16 referralCode) external; - - function withdrawETHWithPermit( - address pool, - uint256 amount, - address to, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; -} - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/WrappedTokenGatewayV3.sol - -/** - * @dev This contract is an upgrade of the WrappedTokenGatewayV3 contract, with immutable pool address. - * This contract keeps the same interface of the deprecated WrappedTokenGatewayV3 contract. - */ -contract WrappedTokenGatewayV3 is IWrappedTokenGatewayV3, Ownable { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using GPv2SafeERC20 for IERC20; - - IWETH internal immutable WETH; - IPool internal immutable POOL; - - /** - * @dev Sets the WETH address and the PoolAddressesProvider address. Infinite approves pool. - * @param weth Address of the Wrapped Ether contract - * @param owner Address of the owner of this contract - **/ - constructor(address weth, address owner, IPool pool) { - WETH = IWETH(weth); - POOL = pool; - transferOwnership(owner); - IWETH(weth).approve(address(pool), type(uint256).max); - } - - /** - * @dev deposits WETH into the reserve, using native ETH. A corresponding amount of the overlying asset (aTokens) - * is minted. - * @param onBehalfOf address of the user who will receive the aTokens representing the deposit - * @param referralCode integrators are assigned a referral code and can potentially receive rewards. - **/ - function depositETH(address, address onBehalfOf, uint16 referralCode) external payable override { - WETH.deposit{value: msg.value}(); - POOL.deposit(address(WETH), msg.value, onBehalfOf, referralCode); - } - - /** - * @dev withdraws the WETH _reserves of msg.sender. - * @param amount amount of aWETH to withdraw and receive native ETH - * @param to address of the user who will receive native ETH - */ - function withdrawETH(address, uint256 amount, address to) external override { - IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); - uint256 userBalance = aWETH.balanceOf(msg.sender); - uint256 amountToWithdraw = amount; - - // if amount is equal to uint(-1), the user wants to redeem everything - if (amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); - POOL.withdraw(address(WETH), amountToWithdraw, address(this)); - WETH.withdraw(amountToWithdraw); - _safeTransferETH(to, amountToWithdraw); - } - - /** - * @dev repays a borrow on the WETH reserve, for the specified amount (or for the whole amount, if uint256(-1) is specified). - * @param amount the amount to repay, or uint256(-1) if the user wants to repay everything - * @param onBehalfOf the address for which msg.sender is repaying - */ - function repayETH(address, uint256 amount, address onBehalfOf) external payable override { - uint256 paybackAmount = IERC20((POOL.getReserveData(address(WETH))).variableDebtTokenAddress) - .balanceOf(onBehalfOf); - - if (amount < paybackAmount) { - paybackAmount = amount; - } - require(msg.value >= paybackAmount, 'msg.value is less than repayment amount'); - WETH.deposit{value: paybackAmount}(); - POOL.repay( - address(WETH), - paybackAmount, - uint256(DataTypes.InterestRateMode.VARIABLE), - onBehalfOf - ); - - // refund remaining dust eth - if (msg.value > paybackAmount) _safeTransferETH(msg.sender, msg.value - paybackAmount); - } - - /** - * @dev borrow WETH, unwraps to ETH and send both the ETH and DebtTokens to msg.sender, via `approveDelegation` and onBehalf argument in `Pool.borrow`. - * @param amount the amount of ETH to borrow - * @param referralCode integrators are assigned a referral code and can potentially receive rewards - */ - function borrowETH(address, uint256 amount, uint16 referralCode) external override { - POOL.borrow( - address(WETH), - amount, - uint256(DataTypes.InterestRateMode.VARIABLE), - referralCode, - msg.sender - ); - WETH.withdraw(amount); - _safeTransferETH(msg.sender, amount); - } - - /** - * @dev withdraws the WETH _reserves of msg.sender. - * @param amount amount of aWETH to withdraw and receive native ETH - * @param to address of the user who will receive native ETH - * @param deadline validity deadline of permit and so depositWithPermit signature - * @param permitV V parameter of ERC712 permit sig - * @param permitR R parameter of ERC712 permit sig - * @param permitS S parameter of ERC712 permit sig - */ - function withdrawETHWithPermit( - address, - uint256 amount, - address to, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external override { - IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); - uint256 userBalance = aWETH.balanceOf(msg.sender); - uint256 amountToWithdraw = amount; - - // if amount is equal to type(uint256).max, the user wants to redeem everything - if (amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - // permit `amount` rather than `amountToWithdraw` to make it easier for front-ends and integrators - aWETH.permit(msg.sender, address(this), amount, deadline, permitV, permitR, permitS); - aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); - POOL.withdraw(address(WETH), amountToWithdraw, address(this)); - WETH.withdraw(amountToWithdraw); - _safeTransferETH(to, amountToWithdraw); - } - - /** - * @dev transfer ETH to an address, revert if it fails. - * @param to recipient of the transfer - * @param value the amount to send - */ - function _safeTransferETH(address to, uint256 value) internal { - (bool success, ) = to.call{value: value}(new bytes(0)); - require(success, 'ETH_TRANSFER_FAILED'); - } - - /** - * @dev transfer ERC20 from the utility contract, for ERC20 recovery in case of stuck tokens due - * direct transfers to the contract address. - * @param token token to transfer - * @param to recipient of the transfer - * @param amount amount to send - */ - function emergencyTokenTransfer(address token, address to, uint256 amount) external onlyOwner { - IERC20(token).safeTransfer(to, amount); - } - - /** - * @dev transfer native Ether from the utility contract, for native Ether recovery in case of stuck Ether - * due to selfdestructs or ether transfers to the pre-computed contract address before deployment. - * @param to recipient of the transfer - * @param amount amount to send - */ - function emergencyEtherTransfer(address to, uint256 amount) external onlyOwner { - _safeTransferETH(to, amount); - } - - /** - * @dev Get WETH address used by WrappedTokenGatewayV3 - */ - function getWETHAddress() external view returns (address) { - return address(WETH); - } - - /** - * @dev Only WETH contract is allowed to transfer ETH here. Prevent other addresses to send Ether to this contract. - */ - receive() external payable { - require(msg.sender == address(WETH), 'Receive not allowed'); - } - - /** - * @dev Revert fallback calls - */ - fallback() external payable { - revert('Fallback not allowed'); - } -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol deleted file mode 100644 index 7917b722..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -import './Context.sol'; - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/WrappedTokenGatewayV3.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/WrappedTokenGatewayV3.sol deleted file mode 100644 index 56725d5e..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/WrappedTokenGatewayV3.sol +++ /dev/null @@ -1,197 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {Ownable} from '../dependencies/openzeppelin/contracts/Ownable.sol'; -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IWETH} from './interfaces/IWETH.sol'; -import {IPool} from '../interfaces/IPool.sol'; -import {IAToken} from '../interfaces/IAToken.sol'; -import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; -import {IWrappedTokenGatewayV3} from './interfaces/IWrappedTokenGatewayV3.sol'; - -/** - * @dev This contract is an upgrade of the WrappedTokenGatewayV3 contract, with immutable pool address. - * This contract keeps the same interface of the deprecated WrappedTokenGatewayV3 contract. - */ -contract WrappedTokenGatewayV3 is IWrappedTokenGatewayV3, Ownable { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using GPv2SafeERC20 for IERC20; - - IWETH internal immutable WETH; - IPool internal immutable POOL; - - /** - * @dev Sets the WETH address and the PoolAddressesProvider address. Infinite approves pool. - * @param weth Address of the Wrapped Ether contract - * @param owner Address of the owner of this contract - **/ - constructor(address weth, address owner, IPool pool) { - WETH = IWETH(weth); - POOL = pool; - transferOwnership(owner); - IWETH(weth).approve(address(pool), type(uint256).max); - } - - /** - * @dev deposits WETH into the reserve, using native ETH. A corresponding amount of the overlying asset (aTokens) - * is minted. - * @param onBehalfOf address of the user who will receive the aTokens representing the deposit - * @param referralCode integrators are assigned a referral code and can potentially receive rewards. - **/ - function depositETH(address, address onBehalfOf, uint16 referralCode) external payable override { - WETH.deposit{value: msg.value}(); - POOL.deposit(address(WETH), msg.value, onBehalfOf, referralCode); - } - - /** - * @dev withdraws the WETH _reserves of msg.sender. - * @param amount amount of aWETH to withdraw and receive native ETH - * @param to address of the user who will receive native ETH - */ - function withdrawETH(address, uint256 amount, address to) external override { - IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); - uint256 userBalance = aWETH.balanceOf(msg.sender); - uint256 amountToWithdraw = amount; - - // if amount is equal to uint(-1), the user wants to redeem everything - if (amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); - POOL.withdraw(address(WETH), amountToWithdraw, address(this)); - WETH.withdraw(amountToWithdraw); - _safeTransferETH(to, amountToWithdraw); - } - - /** - * @dev repays a borrow on the WETH reserve, for the specified amount (or for the whole amount, if uint256(-1) is specified). - * @param amount the amount to repay, or uint256(-1) if the user wants to repay everything - * @param onBehalfOf the address for which msg.sender is repaying - */ - function repayETH(address, uint256 amount, address onBehalfOf) external payable override { - uint256 paybackAmount = IERC20((POOL.getReserveData(address(WETH))).variableDebtTokenAddress) - .balanceOf(onBehalfOf); - - if (amount < paybackAmount) { - paybackAmount = amount; - } - require(msg.value >= paybackAmount, 'msg.value is less than repayment amount'); - WETH.deposit{value: paybackAmount}(); - POOL.repay( - address(WETH), - paybackAmount, - uint256(DataTypes.InterestRateMode.VARIABLE), - onBehalfOf - ); - - // refund remaining dust eth - if (msg.value > paybackAmount) _safeTransferETH(msg.sender, msg.value - paybackAmount); - } - - /** - * @dev borrow WETH, unwraps to ETH and send both the ETH and DebtTokens to msg.sender, via `approveDelegation` and onBehalf argument in `Pool.borrow`. - * @param amount the amount of ETH to borrow - * @param referralCode integrators are assigned a referral code and can potentially receive rewards - */ - function borrowETH(address, uint256 amount, uint16 referralCode) external override { - POOL.borrow( - address(WETH), - amount, - uint256(DataTypes.InterestRateMode.VARIABLE), - referralCode, - msg.sender - ); - WETH.withdraw(amount); - _safeTransferETH(msg.sender, amount); - } - - /** - * @dev withdraws the WETH _reserves of msg.sender. - * @param amount amount of aWETH to withdraw and receive native ETH - * @param to address of the user who will receive native ETH - * @param deadline validity deadline of permit and so depositWithPermit signature - * @param permitV V parameter of ERC712 permit sig - * @param permitR R parameter of ERC712 permit sig - * @param permitS S parameter of ERC712 permit sig - */ - function withdrawETHWithPermit( - address, - uint256 amount, - address to, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external override { - IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); - uint256 userBalance = aWETH.balanceOf(msg.sender); - uint256 amountToWithdraw = amount; - - // if amount is equal to type(uint256).max, the user wants to redeem everything - if (amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - // permit `amount` rather than `amountToWithdraw` to make it easier for front-ends and integrators - aWETH.permit(msg.sender, address(this), amount, deadline, permitV, permitR, permitS); - aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); - POOL.withdraw(address(WETH), amountToWithdraw, address(this)); - WETH.withdraw(amountToWithdraw); - _safeTransferETH(to, amountToWithdraw); - } - - /** - * @dev transfer ETH to an address, revert if it fails. - * @param to recipient of the transfer - * @param value the amount to send - */ - function _safeTransferETH(address to, uint256 value) internal { - (bool success, ) = to.call{value: value}(new bytes(0)); - require(success, 'ETH_TRANSFER_FAILED'); - } - - /** - * @dev transfer ERC20 from the utility contract, for ERC20 recovery in case of stuck tokens due - * direct transfers to the contract address. - * @param token token to transfer - * @param to recipient of the transfer - * @param amount amount to send - */ - function emergencyTokenTransfer(address token, address to, uint256 amount) external onlyOwner { - IERC20(token).safeTransfer(to, amount); - } - - /** - * @dev transfer native Ether from the utility contract, for native Ether recovery in case of stuck Ether - * due to selfdestructs or ether transfers to the pre-computed contract address before deployment. - * @param to recipient of the transfer - * @param amount amount to send - */ - function emergencyEtherTransfer(address to, uint256 amount) external onlyOwner { - _safeTransferETH(to, amount); - } - - /** - * @dev Get WETH address used by WrappedTokenGatewayV3 - */ - function getWETHAddress() external view returns (address) { - return address(WETH); - } - - /** - * @dev Only WETH contract is allowed to transfer ETH here. Prevent other addresses to send Ether to this contract. - */ - receive() external payable { - require(msg.sender == address(WETH), 'Receive not allowed'); - } - - /** - * @dev Revert fallback calls - */ - fallback() external payable { - revert('Fallback not allowed'); - } -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWETH.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWETH.sol deleted file mode 100644 index 98281d0a..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWETH.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -interface IWETH { - function deposit() external payable; - - function withdraw(uint256) external; - - function approve(address guy, uint256 wad) external returns (bool); - - function transferFrom(address src, address dst, uint256 wad) external returns (bool); -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol deleted file mode 100644 index ae8f5980..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -interface IWrappedTokenGatewayV3 { - function depositETH(address pool, address onBehalfOf, uint16 referralCode) external payable; - - function withdrawETH(address pool, uint256 amount, address onBehalfOf) external; - - function repayETH(address pool, uint256 amount, address onBehalfOf) external payable; - - function borrowETH(address pool, uint256 amount, uint16 referralCode) external; - - function withdrawETHWithPermit( - address pool, - uint256 amount, - address to, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/ARBITRUM/WETH_GATEWAY/WrappedTokenGatewayV3/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER.sol deleted file mode 100644 index 9b347532..00000000 --- a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER.sol +++ /dev/null @@ -1,3228 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolDataProvider.sol - -/** - * @title IPoolDataProvider - * @author Aave - * @notice Defines the basic interface of a PoolDataProvider - */ -interface IPoolDataProvider { - struct TokenData { - string symbol; - address tokenAddress; - } - - /** - * @notice Returns the address for the PoolAddressesProvider contract. - * @return The address for the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the list of the existing reserves in the pool. - * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. - * @return The list of reserves, pairs of symbols and addresses - */ - function getAllReservesTokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the list of the existing ATokens in the pool. - * @return The list of ATokens, pairs of symbols and addresses - */ - function getAllATokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the configuration data of the reserve - * @dev Not returning borrow and supply caps for compatibility, nor pause flag - * @param asset The address of the underlying asset of the reserve - * @return decimals The number of decimals of the reserve - * @return ltv The ltv of the reserve - * @return liquidationThreshold The liquidationThreshold of the reserve - * @return liquidationBonus The liquidationBonus of the reserve - * @return reserveFactor The reserveFactor of the reserve - * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise - * @return borrowingEnabled True if borrowing is enabled, false otherwise - * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise - * @return isActive True if it is active, false otherwise - * @return isFrozen True if it is frozen, false otherwise - */ - function getReserveConfigurationData( - address asset - ) - external - view - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ); - - /** - * @notice Returns the caps parameters of the reserve - * @param asset The address of the underlying asset of the reserve - * @return borrowCap The borrow cap of the reserve - * @return supplyCap The supply cap of the reserve - */ - function getReserveCaps( - address asset - ) external view returns (uint256 borrowCap, uint256 supplyCap); - - /** - * @notice Returns if the pool is paused - * @param asset The address of the underlying asset of the reserve - * @return isPaused True if the pool is paused, false otherwise - */ - function getPaused(address asset) external view returns (bool isPaused); - - /** - * @notice Returns the siloed borrowing flag - * @param asset The address of the underlying asset of the reserve - * @return True if the asset is siloed for borrowing - */ - function getSiloedBorrowing(address asset) external view returns (bool); - - /** - * @notice Returns the protocol fee on the liquidation bonus - * @param asset The address of the underlying asset of the reserve - * @return The protocol fee on liquidation - */ - function getLiquidationProtocolFee(address asset) external view returns (uint256); - - /** - * @notice Returns the unbacked mint cap of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The unbacked mint cap of the reserve - */ - function getUnbackedMintCap(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The debt ceiling of the reserve - */ - function getDebtCeiling(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling decimals - * @return The debt ceiling decimals - */ - function getDebtCeilingDecimals() external pure returns (uint256); - - /** - * @notice Returns the reserve data - * @param asset The address of the underlying asset of the reserve - * @return unbacked The amount of unbacked tokens - * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted - * @return totalAToken The total supply of the aToken - * @return totalStableDebt The total stable debt of the reserve - * @return totalVariableDebt The total variable debt of the reserve - * @return liquidityRate The liquidity rate of the reserve - * @return variableBorrowRate The variable borrow rate of the reserve - * @return stableBorrowRate The stable borrow rate of the reserve - * @return averageStableBorrowRate The average stable borrow rate of the reserve - * @return liquidityIndex The liquidity index of the reserve - * @return variableBorrowIndex The variable borrow index of the reserve - * @return lastUpdateTimestamp The timestamp of the last update of the reserve - */ - function getReserveData( - address asset - ) - external - view - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ); - - /** - * @notice Returns the total supply of aTokens for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total supply of the aToken - */ - function getATokenTotalSupply(address asset) external view returns (uint256); - - /** - * @notice Returns the total debt for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total debt for asset - */ - function getTotalDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the user data in a reserve - * @param asset The address of the underlying asset of the reserve - * @param user The address of the user - * @return currentATokenBalance The current AToken balance of the user - * @return currentStableDebt The current stable debt of the user - * @return currentVariableDebt The current variable debt of the user - * @return principalStableDebt The principal stable debt of the user - * @return scaledVariableDebt The scaled variable debt of the user - * @return stableBorrowRate The stable borrow rate of the user - * @return liquidityRate The liquidity rate of the reserve - * @return stableRateLastUpdated The timestamp of the last update of the user stable rate - * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false - * otherwise - */ - function getUserReserveData( - address asset, - address user - ) - external - view - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ); - - /** - * @notice Returns the token addresses of the reserve - * @param asset The address of the underlying asset of the reserve - * @return aTokenAddress The AToken address of the reserve - * @return stableDebtTokenAddress DEPRECATED in v3.2.0 - * @return variableDebtTokenAddress The VariableDebtToken address of the reserve - */ - function getReserveTokensAddresses( - address asset - ) - external - view - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ); - - /** - * @notice Returns the address of the Interest Rate strategy - * @param asset The address of the underlying asset of the reserve - * @return irStrategyAddress The address of the Interest Rate strategy - */ - function getInterestRateStrategyAddress( - address asset - ) external view returns (address irStrategyAddress); - - /** - * @notice Returns whether the reserve has FlashLoans enabled or disabled - * @param asset The address of the underlying asset of the reserve - * @return True if FlashLoans are enabled, false otherwise - */ - function getFlashLoanEnabled(address asset) external view returns (bool); - - /** - * @notice Returns whether virtual accounting is enabled/not for a reserve - * @param asset The address of the underlying asset of the reserve - * @return True if active, false otherwise - */ - function getIsVirtualAccActive(address asset) external view returns (bool); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint256); -} - -// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/helpers/AaveProtocolDataProvider.sol - -/** - * @title AaveProtocolDataProvider - * @author Aave - * @notice Peripheral contract to collect and pre-process information from the Pool. - */ -contract AaveProtocolDataProvider is IPoolDataProvider { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - - address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; - address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /// @inheritdoc IPoolDataProvider - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @notice Constructor - * @param addressesProvider The address of the PoolAddressesProvider contract - */ - constructor(IPoolAddressesProvider addressesProvider) { - ADDRESSES_PROVIDER = addressesProvider; - } - - /// @inheritdoc IPoolDataProvider - function getAllReservesTokens() external view override returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory reservesTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - if (reserves[i] == MKR) { - reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); - continue; - } - if (reserves[i] == ETH) { - reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); - continue; - } - reservesTokens[i] = TokenData({ - symbol: IERC20Detailed(reserves[i]).symbol(), - tokenAddress: reserves[i] - }); - } - return reservesTokens; - } - - /// @inheritdoc IPoolDataProvider - function getAllATokens() external view override returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory aTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveDataLegacy memory reserveData = pool.getReserveData(reserves[i]); - aTokens[i] = TokenData({ - symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), - tokenAddress: reserveData.aTokenAddress - }); - } - return aTokens; - } - - /// @inheritdoc IPoolDataProvider - function getReserveConfigurationData( - address asset - ) - external - view - override - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ) - { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration - .getParams(); - - (isActive, isFrozen, borrowingEnabled, ) = configuration.getFlags(); - - // @notice all stable debt related parameters deprecated in v3.2.0 - stableBorrowRateEnabled = false; - - usageAsCollateralEnabled = liquidationThreshold != 0; - } - - /// @inheritdoc IPoolDataProvider - function getReserveCaps( - address asset - ) external view override returns (uint256 borrowCap, uint256 supplyCap) { - (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); - } - - /// @inheritdoc IPoolDataProvider - function getPaused(address asset) external view override returns (bool isPaused) { - (, , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); - } - - /// @inheritdoc IPoolDataProvider - function getSiloedBorrowing(address asset) external view override returns (bool) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); - } - - /// @inheritdoc IPoolDataProvider - function getLiquidationProtocolFee(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); - } - - /// @inheritdoc IPoolDataProvider - function getUnbackedMintCap(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); - } - - /// @inheritdoc IPoolDataProvider - function getDebtCeiling(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); - } - - /// @inheritdoc IPoolDataProvider - function getDebtCeilingDecimals() external pure override returns (uint256) { - return ReserveConfiguration.DEBT_CEILING_DECIMALS; - } - - /// @inheritdoc IPoolDataProvider - function getReserveData( - address asset - ) - external - view - override - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - // @notice all stable debt related parameters deprecated in v3.2.0 - return ( - reserve.unbacked, - reserve.accruedToTreasury, - IERC20Detailed(reserve.aTokenAddress).totalSupply(), - 0, - IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), - reserve.currentLiquidityRate, - reserve.currentVariableBorrowRate, - 0, - 0, - reserve.liquidityIndex, - reserve.variableBorrowIndex, - reserve.lastUpdateTimestamp - ); - } - - /// @inheritdoc IPoolDataProvider - function getATokenTotalSupply(address asset) external view override returns (uint256) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.aTokenAddress).totalSupply(); - } - - /// @inheritdoc IPoolDataProvider - function getTotalDebt(address asset) external view override returns (uint256) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); - } - - /// @inheritdoc IPoolDataProvider - function getUserReserveData( - address asset, - address user - ) - external - view - override - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) - .getUserConfiguration(user); - - currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); - currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); - - // @notice all stable debt related parameters deprecated in v3.2.0 - currentStableDebt = principalStableDebt = stableBorrowRate = stableRateLastUpdated = 0; - - scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); - liquidityRate = reserve.currentLiquidityRate; - usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); - } - - /// @inheritdoc IPoolDataProvider - function getReserveTokensAddresses( - address asset - ) - external - view - override - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - // @notice all stable debt related parameters deprecated in v3.2.0 - return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); - } - - /// @inheritdoc IPoolDataProvider - function getInterestRateStrategyAddress( - address asset - ) external view override returns (address irStrategyAddress) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - return (reserve.interestRateStrategyAddress); - } - - /// @inheritdoc IPoolDataProvider - function getFlashLoanEnabled(address asset) external view override returns (bool) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - return configuration.getFlashLoanEnabled(); - } - - /// @inheritdoc IPoolDataProvider - function getIsVirtualAccActive(address asset) external view override returns (bool) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - return configuration.getIsVirtualAccActive(); - } - - /// @inheritdoc IPoolDataProvider - function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); - } -} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/helpers/AaveProtocolDataProvider.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/helpers/AaveProtocolDataProvider.sol deleted file mode 100644 index 671b658b..00000000 --- a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/helpers/AaveProtocolDataProvider.sol +++ /dev/null @@ -1,295 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; -import {WadRayMath} from '../protocol/libraries/math/WadRayMath.sol'; -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {IVariableDebtToken} from '../interfaces/IVariableDebtToken.sol'; -import {IPool} from '../interfaces/IPool.sol'; -import {IPoolDataProvider} from '../interfaces/IPoolDataProvider.sol'; - -/** - * @title AaveProtocolDataProvider - * @author Aave - * @notice Peripheral contract to collect and pre-process information from the Pool. - */ -contract AaveProtocolDataProvider is IPoolDataProvider { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - - address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; - address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /// @inheritdoc IPoolDataProvider - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @notice Constructor - * @param addressesProvider The address of the PoolAddressesProvider contract - */ - constructor(IPoolAddressesProvider addressesProvider) { - ADDRESSES_PROVIDER = addressesProvider; - } - - /// @inheritdoc IPoolDataProvider - function getAllReservesTokens() external view override returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory reservesTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - if (reserves[i] == MKR) { - reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); - continue; - } - if (reserves[i] == ETH) { - reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); - continue; - } - reservesTokens[i] = TokenData({ - symbol: IERC20Detailed(reserves[i]).symbol(), - tokenAddress: reserves[i] - }); - } - return reservesTokens; - } - - /// @inheritdoc IPoolDataProvider - function getAllATokens() external view override returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory aTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveDataLegacy memory reserveData = pool.getReserveData(reserves[i]); - aTokens[i] = TokenData({ - symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), - tokenAddress: reserveData.aTokenAddress - }); - } - return aTokens; - } - - /// @inheritdoc IPoolDataProvider - function getReserveConfigurationData( - address asset - ) - external - view - override - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ) - { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration - .getParams(); - - (isActive, isFrozen, borrowingEnabled, ) = configuration.getFlags(); - - // @notice all stable debt related parameters deprecated in v3.2.0 - stableBorrowRateEnabled = false; - - usageAsCollateralEnabled = liquidationThreshold != 0; - } - - /// @inheritdoc IPoolDataProvider - function getReserveCaps( - address asset - ) external view override returns (uint256 borrowCap, uint256 supplyCap) { - (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); - } - - /// @inheritdoc IPoolDataProvider - function getPaused(address asset) external view override returns (bool isPaused) { - (, , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); - } - - /// @inheritdoc IPoolDataProvider - function getSiloedBorrowing(address asset) external view override returns (bool) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); - } - - /// @inheritdoc IPoolDataProvider - function getLiquidationProtocolFee(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); - } - - /// @inheritdoc IPoolDataProvider - function getUnbackedMintCap(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); - } - - /// @inheritdoc IPoolDataProvider - function getDebtCeiling(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); - } - - /// @inheritdoc IPoolDataProvider - function getDebtCeilingDecimals() external pure override returns (uint256) { - return ReserveConfiguration.DEBT_CEILING_DECIMALS; - } - - /// @inheritdoc IPoolDataProvider - function getReserveData( - address asset - ) - external - view - override - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - // @notice all stable debt related parameters deprecated in v3.2.0 - return ( - reserve.unbacked, - reserve.accruedToTreasury, - IERC20Detailed(reserve.aTokenAddress).totalSupply(), - 0, - IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), - reserve.currentLiquidityRate, - reserve.currentVariableBorrowRate, - 0, - 0, - reserve.liquidityIndex, - reserve.variableBorrowIndex, - reserve.lastUpdateTimestamp - ); - } - - /// @inheritdoc IPoolDataProvider - function getATokenTotalSupply(address asset) external view override returns (uint256) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.aTokenAddress).totalSupply(); - } - - /// @inheritdoc IPoolDataProvider - function getTotalDebt(address asset) external view override returns (uint256) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); - } - - /// @inheritdoc IPoolDataProvider - function getUserReserveData( - address asset, - address user - ) - external - view - override - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) - .getUserConfiguration(user); - - currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); - currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); - - // @notice all stable debt related parameters deprecated in v3.2.0 - currentStableDebt = principalStableDebt = stableBorrowRate = stableRateLastUpdated = 0; - - scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); - liquidityRate = reserve.currentLiquidityRate; - usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); - } - - /// @inheritdoc IPoolDataProvider - function getReserveTokensAddresses( - address asset - ) - external - view - override - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - // @notice all stable debt related parameters deprecated in v3.2.0 - return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); - } - - /// @inheritdoc IPoolDataProvider - function getInterestRateStrategyAddress( - address asset - ) external view override returns (address irStrategyAddress) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - return (reserve.interestRateStrategyAddress); - } - - /// @inheritdoc IPoolDataProvider - function getFlashLoanEnabled(address asset) external view override returns (bool) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - return configuration.getFlashLoanEnabled(); - } - - /// @inheritdoc IPoolDataProvider - function getIsVirtualAccActive(address asset) external view override returns (bool) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - return configuration.getIsVirtualAccActive(); - } - - /// @inheritdoc IPoolDataProvider - function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); - } -} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPool.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolDataProvider.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolDataProvider.sol deleted file mode 100644 index a9df8903..00000000 --- a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IPoolDataProvider.sol +++ /dev/null @@ -1,250 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPoolDataProvider - * @author Aave - * @notice Defines the basic interface of a PoolDataProvider - */ -interface IPoolDataProvider { - struct TokenData { - string symbol; - address tokenAddress; - } - - /** - * @notice Returns the address for the PoolAddressesProvider contract. - * @return The address for the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the list of the existing reserves in the pool. - * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. - * @return The list of reserves, pairs of symbols and addresses - */ - function getAllReservesTokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the list of the existing ATokens in the pool. - * @return The list of ATokens, pairs of symbols and addresses - */ - function getAllATokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the configuration data of the reserve - * @dev Not returning borrow and supply caps for compatibility, nor pause flag - * @param asset The address of the underlying asset of the reserve - * @return decimals The number of decimals of the reserve - * @return ltv The ltv of the reserve - * @return liquidationThreshold The liquidationThreshold of the reserve - * @return liquidationBonus The liquidationBonus of the reserve - * @return reserveFactor The reserveFactor of the reserve - * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise - * @return borrowingEnabled True if borrowing is enabled, false otherwise - * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise - * @return isActive True if it is active, false otherwise - * @return isFrozen True if it is frozen, false otherwise - */ - function getReserveConfigurationData( - address asset - ) - external - view - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ); - - /** - * @notice Returns the caps parameters of the reserve - * @param asset The address of the underlying asset of the reserve - * @return borrowCap The borrow cap of the reserve - * @return supplyCap The supply cap of the reserve - */ - function getReserveCaps( - address asset - ) external view returns (uint256 borrowCap, uint256 supplyCap); - - /** - * @notice Returns if the pool is paused - * @param asset The address of the underlying asset of the reserve - * @return isPaused True if the pool is paused, false otherwise - */ - function getPaused(address asset) external view returns (bool isPaused); - - /** - * @notice Returns the siloed borrowing flag - * @param asset The address of the underlying asset of the reserve - * @return True if the asset is siloed for borrowing - */ - function getSiloedBorrowing(address asset) external view returns (bool); - - /** - * @notice Returns the protocol fee on the liquidation bonus - * @param asset The address of the underlying asset of the reserve - * @return The protocol fee on liquidation - */ - function getLiquidationProtocolFee(address asset) external view returns (uint256); - - /** - * @notice Returns the unbacked mint cap of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The unbacked mint cap of the reserve - */ - function getUnbackedMintCap(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The debt ceiling of the reserve - */ - function getDebtCeiling(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling decimals - * @return The debt ceiling decimals - */ - function getDebtCeilingDecimals() external pure returns (uint256); - - /** - * @notice Returns the reserve data - * @param asset The address of the underlying asset of the reserve - * @return unbacked The amount of unbacked tokens - * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted - * @return totalAToken The total supply of the aToken - * @return totalStableDebt The total stable debt of the reserve - * @return totalVariableDebt The total variable debt of the reserve - * @return liquidityRate The liquidity rate of the reserve - * @return variableBorrowRate The variable borrow rate of the reserve - * @return stableBorrowRate The stable borrow rate of the reserve - * @return averageStableBorrowRate The average stable borrow rate of the reserve - * @return liquidityIndex The liquidity index of the reserve - * @return variableBorrowIndex The variable borrow index of the reserve - * @return lastUpdateTimestamp The timestamp of the last update of the reserve - */ - function getReserveData( - address asset - ) - external - view - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ); - - /** - * @notice Returns the total supply of aTokens for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total supply of the aToken - */ - function getATokenTotalSupply(address asset) external view returns (uint256); - - /** - * @notice Returns the total debt for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total debt for asset - */ - function getTotalDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the user data in a reserve - * @param asset The address of the underlying asset of the reserve - * @param user The address of the user - * @return currentATokenBalance The current AToken balance of the user - * @return currentStableDebt The current stable debt of the user - * @return currentVariableDebt The current variable debt of the user - * @return principalStableDebt The principal stable debt of the user - * @return scaledVariableDebt The scaled variable debt of the user - * @return stableBorrowRate The stable borrow rate of the user - * @return liquidityRate The liquidity rate of the reserve - * @return stableRateLastUpdated The timestamp of the last update of the user stable rate - * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false - * otherwise - */ - function getUserReserveData( - address asset, - address user - ) - external - view - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ); - - /** - * @notice Returns the token addresses of the reserve - * @param asset The address of the underlying asset of the reserve - * @return aTokenAddress The AToken address of the reserve - * @return stableDebtTokenAddress DEPRECATED in v3.2.0 - * @return variableDebtTokenAddress The VariableDebtToken address of the reserve - */ - function getReserveTokensAddresses( - address asset - ) - external - view - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ); - - /** - * @notice Returns the address of the Interest Rate strategy - * @param asset The address of the underlying asset of the reserve - * @return irStrategyAddress The address of the Interest Rate strategy - */ - function getInterestRateStrategyAddress( - address asset - ) external view returns (address irStrategyAddress); - - /** - * @notice Returns whether the reserve has FlashLoans enabled or disabled - * @param asset The address of the underlying asset of the reserve - * @return True if FlashLoans are enabled, false otherwise - */ - function getFlashLoanEnabled(address asset) external view returns (bool); - - /** - * @notice Returns whether virtual accounting is enabled/not for a reserve - * @param asset The address of the underlying asset of the reserve - * @return True if active, false otherwise - */ - function getIsVirtualAccActive(address asset) external view returns (bool); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint256); -} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/AAVE_PROTOCOL_DATA_PROVIDER/AaveProtocolDataProvider/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/ACL_MANAGER.sol b/downloads/LINEA/ACL_MANAGER.sol deleted file mode 100644 index c45f49c9..00000000 --- a/downloads/LINEA/ACL_MANAGER.sol +++ /dev/null @@ -1,1069 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IERC165.sol - -/** - * @dev Interface of the ERC165 standard, as defined in the - * https://eips.ethereum.org/EIPS/eip-165[EIP]. - * - * Implementers can declare support of contract interfaces, which can then be - * queried by others ({ERC165Checker}). - * - * For an implementation, see {ERC165}. - */ -interface IERC165 { - /** - * @dev Returns true if this contract implements the interface defined by - * `interfaceId`. See the corresponding - * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] - * to learn more about how these ids are created. - * - * This function call must use less than 30 000 gas. - */ - function supportsInterface(bytes4 interfaceId) external view returns (bool); -} - -// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Strings.sol - -/** - * @dev String operations. - */ -library Strings { - bytes16 private constant _HEX_SYMBOLS = '0123456789abcdef'; - - /** - * @dev Converts a `uint256` to its ASCII `string` decimal representation. - */ - function toString(uint256 value) internal pure returns (string memory) { - // Inspired by OraclizeAPI's implementation - MIT licence - // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol - - if (value == 0) { - return '0'; - } - uint256 temp = value; - uint256 digits; - while (temp != 0) { - digits++; - temp /= 10; - } - bytes memory buffer = new bytes(digits); - while (value != 0) { - digits -= 1; - buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); - value /= 10; - } - return string(buffer); - } - - /** - * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. - */ - function toHexString(uint256 value) internal pure returns (string memory) { - if (value == 0) { - return '0x00'; - } - uint256 temp = value; - uint256 length = 0; - while (temp != 0) { - length++; - temp >>= 8; - } - return toHexString(value, length); - } - - /** - * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. - */ - function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { - bytes memory buffer = new bytes(2 * length + 2); - buffer[0] = '0'; - buffer[1] = 'x'; - for (uint256 i = 2 * length + 1; i > 1; --i) { - buffer[i] = _HEX_SYMBOLS[value & 0xf]; - value >>= 4; - } - require(value == 0, 'Strings: hex length insufficient'); - return string(buffer); - } -} - -// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/ERC165.sol - -/** - * @dev Implementation of the {IERC165} interface. - * - * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check - * for the additional interface id that will be supported. For example: - * - * ```solidity - * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); - * } - * ``` - * - * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. - */ -abstract contract ERC165 is IERC165 { - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IERC165).interfaceId; - } -} - -// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/AccessControl.sol - -/** - * @dev Contract module that allows children to implement role-based access - * control mechanisms. This is a lightweight version that doesn't allow enumerating role - * members except through off-chain means by accessing the contract event logs. Some - * applications may benefit from on-chain enumerability, for those cases see - * {AccessControlEnumerable}. - * - * Roles are referred to by their `bytes32` identifier. These should be exposed - * in the external API and be unique. The best way to achieve this is by - * using `public constant` hash digests: - * - * ``` - * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); - * ``` - * - * Roles can be used to represent a set of permissions. To restrict access to a - * function call, use {hasRole}: - * - * ``` - * function foo() public { - * require(hasRole(MY_ROLE, msg.sender)); - * ... - * } - * ``` - * - * Roles can be granted and revoked dynamically via the {grantRole} and - * {revokeRole} functions. Each role has an associated admin role, and only - * accounts that have a role's admin role can call {grantRole} and {revokeRole}. - * - * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means - * that only accounts with this role will be able to grant or revoke other - * roles. More complex role relationships can be created by using - * {_setRoleAdmin}. - * - * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to - * grant and revoke this role. Extra precautions should be taken to secure - * accounts that have been granted it. - */ -abstract contract AccessControl is Context, IAccessControl, ERC165 { - struct RoleData { - mapping(address => bool) members; - bytes32 adminRole; - } - - mapping(bytes32 => RoleData) private _roles; - - bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; - - /** - * @dev Modifier that checks that an account has a specific role. Reverts - * with a standardized message including the required role. - * - * The format of the revert reason is given by the following regular expression: - * - * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ - * - * _Available since v4.1._ - */ - modifier onlyRole(bytes32 role) { - _checkRole(role, _msgSender()); - _; - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) public view override returns (bool) { - return _roles[role].members[account]; - } - - /** - * @dev Revert with a standard message if `account` is missing `role`. - * - * The format of the revert reason is given by the following regular expression: - * - * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ - */ - function _checkRole(bytes32 role, address account) internal view { - if (!hasRole(role, account)) { - revert( - string( - abi.encodePacked( - 'AccessControl: account ', - Strings.toHexString(uint160(account), 20), - ' is missing role ', - Strings.toHexString(uint256(role), 32) - ) - ) - ); - } - } - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) public view override returns (bytes32) { - return _roles[role].adminRole; - } - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole( - bytes32 role, - address account - ) public virtual override onlyRole(getRoleAdmin(role)) { - _grantRole(role, account); - } - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole( - bytes32 role, - address account - ) public virtual override onlyRole(getRoleAdmin(role)) { - _revokeRole(role, account); - } - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) public virtual override { - require(account == _msgSender(), 'AccessControl: can only renounce roles for self'); - - _revokeRole(role, account); - } - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. Note that unlike {grantRole}, this function doesn't perform any - * checks on the calling account. - * - * [WARNING] - * ==== - * This function should only be called from the constructor when setting - * up the initial roles for the system. - * - * Using this function in any other way is effectively circumventing the admin - * system imposed by {AccessControl}. - * ==== - */ - function _setupRole(bytes32 role, address account) internal virtual { - _grantRole(role, account); - } - - /** - * @dev Sets `adminRole` as ``role``'s admin role. - * - * Emits a {RoleAdminChanged} event. - */ - function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { - bytes32 previousAdminRole = getRoleAdmin(role); - _roles[role].adminRole = adminRole; - emit RoleAdminChanged(role, previousAdminRole, adminRole); - } - - function _grantRole(bytes32 role, address account) private { - if (!hasRole(role, account)) { - _roles[role].members[account] = true; - emit RoleGranted(role, account, _msgSender()); - } - } - - function _revokeRole(bytes32 role, address account) private { - if (hasRole(role, account)) { - _roles[role].members[account] = false; - emit RoleRevoked(role, account, _msgSender()); - } - } -} - -// downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/configuration/ACLManager.sol - -/** - * @title ACLManager - * @author Aave - * @notice Access Control List Manager. Main registry of system roles and permissions. - */ -contract ACLManager is AccessControl, IACLManager { - bytes32 public constant override POOL_ADMIN_ROLE = keccak256('POOL_ADMIN'); - bytes32 public constant override EMERGENCY_ADMIN_ROLE = keccak256('EMERGENCY_ADMIN'); - bytes32 public constant override RISK_ADMIN_ROLE = keccak256('RISK_ADMIN'); - bytes32 public constant override FLASH_BORROWER_ROLE = keccak256('FLASH_BORROWER'); - bytes32 public constant override BRIDGE_ROLE = keccak256('BRIDGE'); - bytes32 public constant override ASSET_LISTING_ADMIN_ROLE = keccak256('ASSET_LISTING_ADMIN'); - - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @dev Constructor - * @dev The ACL admin should be initialized at the addressesProvider beforehand - * @param provider The address of the PoolAddressesProvider - */ - constructor(IPoolAddressesProvider provider) { - ADDRESSES_PROVIDER = provider; - address aclAdmin = provider.getACLAdmin(); - require(aclAdmin != address(0), Errors.ACL_ADMIN_CANNOT_BE_ZERO); - _setupRole(DEFAULT_ADMIN_ROLE, aclAdmin); - } - - /// @inheritdoc IACLManager - function setRoleAdmin( - bytes32 role, - bytes32 adminRole - ) external override onlyRole(DEFAULT_ADMIN_ROLE) { - _setRoleAdmin(role, adminRole); - } - - /// @inheritdoc IACLManager - function addPoolAdmin(address admin) external override { - grantRole(POOL_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removePoolAdmin(address admin) external override { - revokeRole(POOL_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isPoolAdmin(address admin) external view override returns (bool) { - return hasRole(POOL_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function addEmergencyAdmin(address admin) external override { - grantRole(EMERGENCY_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removeEmergencyAdmin(address admin) external override { - revokeRole(EMERGENCY_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isEmergencyAdmin(address admin) external view override returns (bool) { - return hasRole(EMERGENCY_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function addRiskAdmin(address admin) external override { - grantRole(RISK_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removeRiskAdmin(address admin) external override { - revokeRole(RISK_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isRiskAdmin(address admin) external view override returns (bool) { - return hasRole(RISK_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function addFlashBorrower(address borrower) external override { - grantRole(FLASH_BORROWER_ROLE, borrower); - } - - /// @inheritdoc IACLManager - function removeFlashBorrower(address borrower) external override { - revokeRole(FLASH_BORROWER_ROLE, borrower); - } - - /// @inheritdoc IACLManager - function isFlashBorrower(address borrower) external view override returns (bool) { - return hasRole(FLASH_BORROWER_ROLE, borrower); - } - - /// @inheritdoc IACLManager - function addBridge(address bridge) external override { - grantRole(BRIDGE_ROLE, bridge); - } - - /// @inheritdoc IACLManager - function removeBridge(address bridge) external override { - revokeRole(BRIDGE_ROLE, bridge); - } - - /// @inheritdoc IACLManager - function isBridge(address bridge) external view override returns (bool) { - return hasRole(BRIDGE_ROLE, bridge); - } - - /// @inheritdoc IACLManager - function addAssetListingAdmin(address admin) external override { - grantRole(ASSET_LISTING_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removeAssetListingAdmin(address admin) external override { - revokeRole(ASSET_LISTING_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isAssetListingAdmin(address admin) external view override returns (bool) { - return hasRole(ASSET_LISTING_ADMIN_ROLE, admin); - } -} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/AccessControl.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/AccessControl.sol deleted file mode 100644 index 1f73bab6..00000000 --- a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/AccessControl.sol +++ /dev/null @@ -1,216 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -import './IAccessControl.sol'; -import './Context.sol'; -import './Strings.sol'; -import './ERC165.sol'; - -/** - * @dev Contract module that allows children to implement role-based access - * control mechanisms. This is a lightweight version that doesn't allow enumerating role - * members except through off-chain means by accessing the contract event logs. Some - * applications may benefit from on-chain enumerability, for those cases see - * {AccessControlEnumerable}. - * - * Roles are referred to by their `bytes32` identifier. These should be exposed - * in the external API and be unique. The best way to achieve this is by - * using `public constant` hash digests: - * - * ``` - * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); - * ``` - * - * Roles can be used to represent a set of permissions. To restrict access to a - * function call, use {hasRole}: - * - * ``` - * function foo() public { - * require(hasRole(MY_ROLE, msg.sender)); - * ... - * } - * ``` - * - * Roles can be granted and revoked dynamically via the {grantRole} and - * {revokeRole} functions. Each role has an associated admin role, and only - * accounts that have a role's admin role can call {grantRole} and {revokeRole}. - * - * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means - * that only accounts with this role will be able to grant or revoke other - * roles. More complex role relationships can be created by using - * {_setRoleAdmin}. - * - * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to - * grant and revoke this role. Extra precautions should be taken to secure - * accounts that have been granted it. - */ -abstract contract AccessControl is Context, IAccessControl, ERC165 { - struct RoleData { - mapping(address => bool) members; - bytes32 adminRole; - } - - mapping(bytes32 => RoleData) private _roles; - - bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; - - /** - * @dev Modifier that checks that an account has a specific role. Reverts - * with a standardized message including the required role. - * - * The format of the revert reason is given by the following regular expression: - * - * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ - * - * _Available since v4.1._ - */ - modifier onlyRole(bytes32 role) { - _checkRole(role, _msgSender()); - _; - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) public view override returns (bool) { - return _roles[role].members[account]; - } - - /** - * @dev Revert with a standard message if `account` is missing `role`. - * - * The format of the revert reason is given by the following regular expression: - * - * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ - */ - function _checkRole(bytes32 role, address account) internal view { - if (!hasRole(role, account)) { - revert( - string( - abi.encodePacked( - 'AccessControl: account ', - Strings.toHexString(uint160(account), 20), - ' is missing role ', - Strings.toHexString(uint256(role), 32) - ) - ) - ); - } - } - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) public view override returns (bytes32) { - return _roles[role].adminRole; - } - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole( - bytes32 role, - address account - ) public virtual override onlyRole(getRoleAdmin(role)) { - _grantRole(role, account); - } - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole( - bytes32 role, - address account - ) public virtual override onlyRole(getRoleAdmin(role)) { - _revokeRole(role, account); - } - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) public virtual override { - require(account == _msgSender(), 'AccessControl: can only renounce roles for self'); - - _revokeRole(role, account); - } - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. Note that unlike {grantRole}, this function doesn't perform any - * checks on the calling account. - * - * [WARNING] - * ==== - * This function should only be called from the constructor when setting - * up the initial roles for the system. - * - * Using this function in any other way is effectively circumventing the admin - * system imposed by {AccessControl}. - * ==== - */ - function _setupRole(bytes32 role, address account) internal virtual { - _grantRole(role, account); - } - - /** - * @dev Sets `adminRole` as ``role``'s admin role. - * - * Emits a {RoleAdminChanged} event. - */ - function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { - bytes32 previousAdminRole = getRoleAdmin(role); - _roles[role].adminRole = adminRole; - emit RoleAdminChanged(role, previousAdminRole, adminRole); - } - - function _grantRole(bytes32 role, address account) private { - if (!hasRole(role, account)) { - _roles[role].members[account] = true; - emit RoleGranted(role, account, _msgSender()); - } - } - - function _revokeRole(bytes32 role, address account) private { - if (hasRole(role, account)) { - _roles[role].members[account] = false; - emit RoleRevoked(role, account, _msgSender()); - } - } -} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/ERC165.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/ERC165.sol deleted file mode 100644 index 74efff97..00000000 --- a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/ERC165.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -import './IERC165.sol'; - -/** - * @dev Implementation of the {IERC165} interface. - * - * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check - * for the additional interface id that will be supported. For example: - * - * ```solidity - * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); - * } - * ``` - * - * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. - */ -abstract contract ERC165 is IERC165 { - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IERC165).interfaceId; - } -} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IERC165.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IERC165.sol deleted file mode 100644 index b914e440..00000000 --- a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/IERC165.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev Interface of the ERC165 standard, as defined in the - * https://eips.ethereum.org/EIPS/eip-165[EIP]. - * - * Implementers can declare support of contract interfaces, which can then be - * queried by others ({ERC165Checker}). - * - * For an implementation, see {ERC165}. - */ -interface IERC165 { - /** - * @dev Returns true if this contract implements the interface defined by - * `interfaceId`. See the corresponding - * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] - * to learn more about how these ids are created. - * - * This function call must use less than 30 000 gas. - */ - function supportsInterface(bytes4 interfaceId) external view returns (bool); -} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Strings.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Strings.sol deleted file mode 100644 index 760a2671..00000000 --- a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/dependencies/openzeppelin/contracts/Strings.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev String operations. - */ -library Strings { - bytes16 private constant _HEX_SYMBOLS = '0123456789abcdef'; - - /** - * @dev Converts a `uint256` to its ASCII `string` decimal representation. - */ - function toString(uint256 value) internal pure returns (string memory) { - // Inspired by OraclizeAPI's implementation - MIT licence - // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol - - if (value == 0) { - return '0'; - } - uint256 temp = value; - uint256 digits; - while (temp != 0) { - digits++; - temp /= 10; - } - bytes memory buffer = new bytes(digits); - while (value != 0) { - digits -= 1; - buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); - value /= 10; - } - return string(buffer); - } - - /** - * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. - */ - function toHexString(uint256 value) internal pure returns (string memory) { - if (value == 0) { - return '0x00'; - } - uint256 temp = value; - uint256 length = 0; - while (temp != 0) { - length++; - temp >>= 8; - } - return toHexString(value, length); - } - - /** - * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. - */ - function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { - bytes memory buffer = new bytes(2 * length + 2); - buffer[0] = '0'; - buffer[1] = 'x'; - for (uint256 i = 2 * length + 1; i > 1; --i) { - buffer[i] = _HEX_SYMBOLS[value & 0xf]; - value >>= 4; - } - require(value == 0, 'Strings: hex length insufficient'); - return string(buffer); - } -} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/configuration/ACLManager.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/configuration/ACLManager.sol deleted file mode 100644 index dc4de67d..00000000 --- a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/configuration/ACLManager.sol +++ /dev/null @@ -1,133 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {AccessControl} from '../../dependencies/openzeppelin/contracts/AccessControl.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {IACLManager} from '../../interfaces/IACLManager.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; - -/** - * @title ACLManager - * @author Aave - * @notice Access Control List Manager. Main registry of system roles and permissions. - */ -contract ACLManager is AccessControl, IACLManager { - bytes32 public constant override POOL_ADMIN_ROLE = keccak256('POOL_ADMIN'); - bytes32 public constant override EMERGENCY_ADMIN_ROLE = keccak256('EMERGENCY_ADMIN'); - bytes32 public constant override RISK_ADMIN_ROLE = keccak256('RISK_ADMIN'); - bytes32 public constant override FLASH_BORROWER_ROLE = keccak256('FLASH_BORROWER'); - bytes32 public constant override BRIDGE_ROLE = keccak256('BRIDGE'); - bytes32 public constant override ASSET_LISTING_ADMIN_ROLE = keccak256('ASSET_LISTING_ADMIN'); - - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @dev Constructor - * @dev The ACL admin should be initialized at the addressesProvider beforehand - * @param provider The address of the PoolAddressesProvider - */ - constructor(IPoolAddressesProvider provider) { - ADDRESSES_PROVIDER = provider; - address aclAdmin = provider.getACLAdmin(); - require(aclAdmin != address(0), Errors.ACL_ADMIN_CANNOT_BE_ZERO); - _setupRole(DEFAULT_ADMIN_ROLE, aclAdmin); - } - - /// @inheritdoc IACLManager - function setRoleAdmin( - bytes32 role, - bytes32 adminRole - ) external override onlyRole(DEFAULT_ADMIN_ROLE) { - _setRoleAdmin(role, adminRole); - } - - /// @inheritdoc IACLManager - function addPoolAdmin(address admin) external override { - grantRole(POOL_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removePoolAdmin(address admin) external override { - revokeRole(POOL_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isPoolAdmin(address admin) external view override returns (bool) { - return hasRole(POOL_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function addEmergencyAdmin(address admin) external override { - grantRole(EMERGENCY_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removeEmergencyAdmin(address admin) external override { - revokeRole(EMERGENCY_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isEmergencyAdmin(address admin) external view override returns (bool) { - return hasRole(EMERGENCY_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function addRiskAdmin(address admin) external override { - grantRole(RISK_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removeRiskAdmin(address admin) external override { - revokeRole(RISK_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isRiskAdmin(address admin) external view override returns (bool) { - return hasRole(RISK_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function addFlashBorrower(address borrower) external override { - grantRole(FLASH_BORROWER_ROLE, borrower); - } - - /// @inheritdoc IACLManager - function removeFlashBorrower(address borrower) external override { - revokeRole(FLASH_BORROWER_ROLE, borrower); - } - - /// @inheritdoc IACLManager - function isFlashBorrower(address borrower) external view override returns (bool) { - return hasRole(FLASH_BORROWER_ROLE, borrower); - } - - /// @inheritdoc IACLManager - function addBridge(address bridge) external override { - grantRole(BRIDGE_ROLE, bridge); - } - - /// @inheritdoc IACLManager - function removeBridge(address bridge) external override { - revokeRole(BRIDGE_ROLE, bridge); - } - - /// @inheritdoc IACLManager - function isBridge(address bridge) external view override returns (bool) { - return hasRole(BRIDGE_ROLE, bridge); - } - - /// @inheritdoc IACLManager - function addAssetListingAdmin(address admin) external override { - grantRole(ASSET_LISTING_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function removeAssetListingAdmin(address admin) external override { - revokeRole(ASSET_LISTING_ADMIN_ROLE, admin); - } - - /// @inheritdoc IACLManager - function isAssetListingAdmin(address admin) external view override returns (bool) { - return hasRole(ASSET_LISTING_ADMIN_ROLE, admin); - } -} diff --git a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/ACL_MANAGER/ACLManager/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/BORROW_LOGIC.sol b/downloads/LINEA/BORROW_LOGIC.sol deleted file mode 100644 index 9ef522e8..00000000 --- a/downloads/LINEA/BORROW_LOGIC.sol +++ /dev/null @@ -1,5817 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} - -// downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol - -/** - * @title BorrowLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to borrowing - */ -library BorrowLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the - * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the - * isolated debt. - * @dev Emits the `Borrow()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the borrow function - */ - function executeBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteBorrowParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ( - bool isolationModeActive, - address isolationModeCollateralAddress, - uint256 isolationModeDebtCeiling - ) = userConfig.getIsolationModeState(reservesData, reservesList); - - ValidationLogic.validateBorrow( - reservesData, - reservesList, - eModeCategories, - DataTypes.ValidateBorrowParams({ - reserveCache: reserveCache, - userConfig: userConfig, - asset: params.asset, - userAddress: params.onBehalfOf, - amount: params.amount, - interestRateMode: params.interestRateMode, - reservesCount: params.reservesCount, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory, - priceOracleSentinel: params.priceOracleSentinel, - isolationModeActive: isolationModeActive, - isolationModeCollateralAddress: isolationModeCollateralAddress, - isolationModeDebtCeiling: isolationModeDebtCeiling - }) - ); - - bool isFirstBorrowing = false; - - (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); - - if (isFirstBorrowing) { - userConfig.setBorrowing(reserve.id, true); - } - - if (isolationModeActive) { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt += (params.amount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - 0, - params.releaseUnderlying ? params.amount : 0 - ); - - if (params.releaseUnderlying) { - IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); - } - - emit Borrow( - params.asset, - params.user, - params.onBehalfOf, - params.amount, - DataTypes.InterestRateMode.VARIABLE, - reserve.currentVariableBorrowRate, - params.referralCode - ); - } - - /** - * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the - * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also - * reduces the isolated debt. - * @dev Emits the `Repay()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the repay function - * @return The actual amount being repaid - */ - function executeRepay( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteRepayParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - - uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( - params.onBehalfOf - ); - - ValidationLogic.validateRepay( - reserveCache, - params.amount, - params.interestRateMode, - params.onBehalfOf, - variableDebt - ); - - uint256 paybackAmount = variableDebt; - - // Allows a user to repay with aTokens without leaving dust from interest. - if (params.useATokens && params.amount == type(uint256).max) { - params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); - } - - if (params.amount < paybackAmount) { - paybackAmount = params.amount; - } - - reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) - .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - params.useATokens ? 0 : paybackAmount, - 0 - ); - - if (variableDebt - paybackAmount == 0) { - userConfig.setBorrowing(reserve.id, false); - } - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - reserveCache, - paybackAmount - ); - - if (params.useATokens) { - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - reserveCache.aTokenAddress, - paybackAmount, - reserveCache.nextLiquidityIndex - ); - // in case of aToken repayment the msg.sender must always repay on behalf of itself - if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - } else { - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); - IAToken(reserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.onBehalfOf, - paybackAmount - ); - } - - emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); - - return paybackAmount; - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index e7ba8f7a..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol deleted file mode 100644 index c4ed26ed..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {IsolationModeLogic} from './IsolationModeLogic.sol'; - -/** - * @title BorrowLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to borrowing - */ -library BorrowLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the - * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the - * isolated debt. - * @dev Emits the `Borrow()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the borrow function - */ - function executeBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteBorrowParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ( - bool isolationModeActive, - address isolationModeCollateralAddress, - uint256 isolationModeDebtCeiling - ) = userConfig.getIsolationModeState(reservesData, reservesList); - - ValidationLogic.validateBorrow( - reservesData, - reservesList, - eModeCategories, - DataTypes.ValidateBorrowParams({ - reserveCache: reserveCache, - userConfig: userConfig, - asset: params.asset, - userAddress: params.onBehalfOf, - amount: params.amount, - interestRateMode: params.interestRateMode, - reservesCount: params.reservesCount, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory, - priceOracleSentinel: params.priceOracleSentinel, - isolationModeActive: isolationModeActive, - isolationModeCollateralAddress: isolationModeCollateralAddress, - isolationModeDebtCeiling: isolationModeDebtCeiling - }) - ); - - bool isFirstBorrowing = false; - - (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); - - if (isFirstBorrowing) { - userConfig.setBorrowing(reserve.id, true); - } - - if (isolationModeActive) { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt += (params.amount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - 0, - params.releaseUnderlying ? params.amount : 0 - ); - - if (params.releaseUnderlying) { - IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); - } - - emit Borrow( - params.asset, - params.user, - params.onBehalfOf, - params.amount, - DataTypes.InterestRateMode.VARIABLE, - reserve.currentVariableBorrowRate, - params.referralCode - ); - } - - /** - * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the - * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also - * reduces the isolated debt. - * @dev Emits the `Repay()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the repay function - * @return The actual amount being repaid - */ - function executeRepay( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteRepayParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - - uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( - params.onBehalfOf - ); - - ValidationLogic.validateRepay( - reserveCache, - params.amount, - params.interestRateMode, - params.onBehalfOf, - variableDebt - ); - - uint256 paybackAmount = variableDebt; - - // Allows a user to repay with aTokens without leaving dust from interest. - if (params.useATokens && params.amount == type(uint256).max) { - params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); - } - - if (params.amount < paybackAmount) { - paybackAmount = params.amount; - } - - reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) - .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - params.useATokens ? 0 : paybackAmount, - 0 - ); - - if (variableDebt - paybackAmount == 0) { - userConfig.setBorrowing(reserve.id, false); - } - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - reserveCache, - paybackAmount - ); - - if (params.useATokens) { - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - reserveCache.aTokenAddress, - paybackAmount, - reserveCache.nextLiquidityIndex - ); - // in case of aToken repayment the msg.sender must always repay on behalf of itself - if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - } else { - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); - IAToken(reserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.onBehalfOf, - paybackAmount - ); - } - - emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); - - return paybackAmount; - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index 647fc7e7..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index cd5b83c6..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol deleted file mode 100644 index 473840ea..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index dd5c637d..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index e08a30e8..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index 9adca939..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/LINEA/BORROW_LOGIC/BorrowLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC.sol b/downloads/LINEA/BRIDGE_LOGIC.sol deleted file mode 100644 index ffa3a454..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC.sol +++ /dev/null @@ -1,5673 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} - -// downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol - -library BridgeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. - * @dev Essentially a supply without transferring the underlying. - * @dev Emits the `MintUnbacked` event - * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param asset The address of the underlying asset to mint aTokens of - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function executeMintUnbacked( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, reserve, amount, onBehalfOf); - - uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); - uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); - - uint256 unbacked = reserve.unbacked += amount.toUint128(); - - require( - unbacked <= unbackedMintCap * (10 ** reserveDecimals), - Errors.UNBACKED_MINT_CAP_EXCEEDED - ); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, 0, 0); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - onBehalfOf, - amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration, - reserveCache.aTokenAddress - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); - } - } - - emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); - } - - /** - * @notice Back the current unbacked with `amount` and pay `fee`. - * @dev It is not possible to back more than the existing unbacked amount of the reserve - * @dev Emits the `BackUnbacked` event - * @param reserve The reserve to back unbacked for - * @param asset The address of the underlying asset to repay - * @param amount The amount to back - * @param fee The amount paid in fees - * @param protocolFeeBps The fraction of fees in basis points paid to the protocol - * @return The backed amount - */ - function executeBackUnbacked( - DataTypes.ReserveData storage reserve, - address asset, - uint256 amount, - uint256 fee, - uint256 protocolFeeBps - ) external returns (uint256) { - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; - - uint256 feeToProtocol = fee.percentMul(protocolFeeBps); - uint256 feeToLP = fee - feeToProtocol; - uint256 added = backingAmount + fee; - - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply() + - uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), - feeToLP - ); - - reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - - reserve.unbacked -= backingAmount.toUint128(); - reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, added, 0); - - IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); - - emit BackUnbacked(asset, msg.sender, backingAmount, fee); - - return backingAmount; - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index e7ba8f7a..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol deleted file mode 100644 index 3b4d469b..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/BridgeLogic.sol +++ /dev/null @@ -1,150 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -library BridgeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. - * @dev Essentially a supply without transferring the underlying. - * @dev Emits the `MintUnbacked` event - * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param asset The address of the underlying asset to mint aTokens of - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function executeMintUnbacked( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, reserve, amount, onBehalfOf); - - uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); - uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); - - uint256 unbacked = reserve.unbacked += amount.toUint128(); - - require( - unbacked <= unbackedMintCap * (10 ** reserveDecimals), - Errors.UNBACKED_MINT_CAP_EXCEEDED - ); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, 0, 0); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - onBehalfOf, - amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration, - reserveCache.aTokenAddress - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); - } - } - - emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); - } - - /** - * @notice Back the current unbacked with `amount` and pay `fee`. - * @dev It is not possible to back more than the existing unbacked amount of the reserve - * @dev Emits the `BackUnbacked` event - * @param reserve The reserve to back unbacked for - * @param asset The address of the underlying asset to repay - * @param amount The amount to back - * @param fee The amount paid in fees - * @param protocolFeeBps The fraction of fees in basis points paid to the protocol - * @return The backed amount - */ - function executeBackUnbacked( - DataTypes.ReserveData storage reserve, - address asset, - uint256 amount, - uint256 fee, - uint256 protocolFeeBps - ) external returns (uint256) { - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; - - uint256 feeToProtocol = fee.percentMul(protocolFeeBps); - uint256 feeToLP = fee - feeToProtocol; - uint256 added = backingAmount + fee; - - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply() + - uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), - feeToLP - ); - - reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - - reserve.unbacked -= backingAmount.toUint128(); - reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, added, 0); - - IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); - - emit BackUnbacked(asset, msg.sender, backingAmount, fee); - - return backingAmount; - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index 647fc7e7..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index cd5b83c6..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index dd5c637d..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index e08a30e8..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index 9adca939..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/LINEA/BRIDGE_LOGIC/BridgeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/LINEA/COLLECTOR_IMPL.sol b/downloads/LINEA/COLLECTOR_IMPL.sol deleted file mode 100644 index 80c907f2..00000000 --- a/downloads/LINEA/COLLECTOR_IMPL.sol +++ /dev/null @@ -1,1035 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/ReentrancyGuard.sol - -// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) - -/** - * @dev Contract module that helps prevent reentrant calls to a function. - * - * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier - * available, which can be applied to functions to make sure there are no nested - * (reentrant) calls to them. - * - * Note that because there is a single `nonReentrant` guard, functions marked as - * `nonReentrant` may not call one another. This can be worked around by making - * those functions `private`, and then adding `external` `nonReentrant` entry - * points to them. - * - * TIP: If you would like to learn more about reentrancy and alternative ways - * to protect against it, check out our blog post - * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. - */ -abstract contract ReentrancyGuard { - // Booleans are more expensive than uint256 or any type that takes up a full - // word because each write operation emits an extra SLOAD to first read the - // slot's contents, replace the bits taken up by the boolean, and then write - // back. This is the compiler's defense against contract upgrades and - // pointer aliasing, and it cannot be disabled. - - // The values being non-zero value makes deployment a bit more expensive, - // but in exchange the refund on every call to nonReentrant will be lower in - // amount. Since refunds are capped to a percentage of the total - // transaction's gas, it is best to keep them low in cases like this one, to - // increase the likelihood of the full refund coming into effect. - uint256 private constant _NOT_ENTERED = 1; - uint256 private constant _ENTERED = 2; - - uint256 private _status; - - constructor() { - _status = _NOT_ENTERED; - } - - /** - * @dev Prevents a contract from calling itself, directly or indirectly. - * Calling a `nonReentrant` function from another `nonReentrant` - * function is not supported. It is possible to prevent this from happening - * by making the `nonReentrant` function external, and making it call a - * `private` function that does the actual work. - */ - modifier nonReentrant() { - // On the first call to nonReentrant, _notEntered will be true - require(_status != _ENTERED, 'ReentrancyGuard: reentrant call'); - - // Any calls to nonReentrant after this point will fail - _status = _ENTERED; - - _; - - // By storing the original value once again, a refund is triggered (see - // https://eips.ethereum.org/EIPS/eip-2200) - _status = _NOT_ENTERED; - } - - /** - * @dev As we use the guard with the proxy we need to init it with the empty value - */ - function _initGuard() internal { - _status = _NOT_ENTERED; - } -} - -// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} - -// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/ICollector.sol - -interface ICollector { - struct Stream { - uint256 deposit; - uint256 ratePerSecond; - uint256 remainingBalance; - uint256 startTime; - uint256 stopTime; - address recipient; - address sender; - address tokenAddress; - bool isEntity; - } - - /** @notice Emitted when the funds admin changes - * @param fundsAdmin The new funds admin. - **/ - event NewFundsAdmin(address indexed fundsAdmin); - - /** @notice Emitted when the new stream is created - * @param streamId The identifier of the stream. - * @param sender The address of the collector. - * @param recipient The address towards which the money is streamed. - * @param deposit The amount of money to be streamed. - * @param tokenAddress The ERC20 token to use as streaming currency. - * @param startTime The unix timestamp for when the stream starts. - * @param stopTime The unix timestamp for when the stream stops. - **/ - event CreateStream( - uint256 indexed streamId, - address indexed sender, - address indexed recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime - ); - - /** - * @notice Emmitted when withdraw happens from the contract to the recipient's account. - * @param streamId The id of the stream to withdraw tokens from. - * @param recipient The address towards which the money is streamed. - * @param amount The amount of tokens to withdraw. - */ - event WithdrawFromStream(uint256 indexed streamId, address indexed recipient, uint256 amount); - - /** - * @notice Emmitted when the stream is canceled. - * @param streamId The id of the stream to withdraw tokens from. - * @param sender The address of the collector. - * @param recipient The address towards which the money is streamed. - * @param senderBalance The sender's balance at the moment of cancelling. - * @param recipientBalance The recipient's balance at the moment of cancelling. - */ - event CancelStream( - uint256 indexed streamId, - address indexed sender, - address indexed recipient, - uint256 senderBalance, - uint256 recipientBalance - ); - - /** @notice Returns the mock ETH reference address - * @return address The address - **/ - function ETH_MOCK_ADDRESS() external pure returns (address); - - /** @notice Initializes the contracts - * @param fundsAdmin Funds admin address - * @param nextStreamId StreamId to set, applied if greater than 0 - **/ - function initialize(address fundsAdmin, uint256 nextStreamId) external; - - /** - * @notice Return the funds admin, only entity to be able to interact with this contract (controller of reserve) - * @return address The address of the funds admin - **/ - function getFundsAdmin() external view returns (address); - - /** - * @notice Returns the available funds for the given stream id and address. - * @param streamId The id of the stream for which to query the balance. - * @param who The address for which to query the balance. - * @notice Returns the total funds allocated to `who` as uint256. - */ - function balanceOf(uint256 streamId, address who) external view returns (uint256 balance); - - /** - * @dev Function for the funds admin to give ERC20 allowance to other parties - * @param token The address of the token to give allowance from - * @param recipient Allowance's recipient - * @param amount Allowance to approve - **/ - function approve(IERC20 token, address recipient, uint256 amount) external; - - /** - * @notice Function for the funds admin to transfer ERC20 tokens to other parties - * @param token The address of the token to transfer - * @param recipient Transfer's recipient - * @param amount Amount to transfer - **/ - function transfer(IERC20 token, address recipient, uint256 amount) external; - - /** - * @dev Transfer the ownership of the funds administrator role. - This function should only be callable by the current funds administrator. - * @param admin The address of the new funds administrator - */ - function setFundsAdmin(address admin) external; - - /** - * @notice Creates a new stream funded by this contracts itself and paid towards `recipient`. - * @param recipient The address towards which the money is streamed. - * @param deposit The amount of money to be streamed. - * @param tokenAddress The ERC20 token to use as streaming currency. - * @param startTime The unix timestamp for when the stream starts. - * @param stopTime The unix timestamp for when the stream stops. - * @return streamId the uint256 id of the newly created stream. - */ - function createStream( - address recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime - ) external returns (uint256 streamId); - - /** - * @notice Returns the stream with all its properties. - * @dev Throws if the id does not point to a valid stream. - * @param streamId The id of the stream to query. - * @notice Returns the stream object. - */ - function getStream( - uint256 streamId - ) - external - view - returns ( - address sender, - address recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime, - uint256 remainingBalance, - uint256 ratePerSecond - ); - - /** - * @notice Withdraws from the contract to the recipient's account. - * @param streamId The id of the stream to withdraw tokens from. - * @param amount The amount of tokens to withdraw. - * @return bool Returns true if successful. - */ - function withdrawFromStream(uint256 streamId, uint256 amount) external returns (bool); - - /** - * @notice Cancels the stream and transfers the tokens back on a pro rata basis. - * @param streamId The id of the stream to cancel. - * @return bool Returns true if successful. - */ - function cancelStream(uint256 streamId) external returns (bool); - - /** - * @notice Returns the next available stream id - * @return nextStreamId Returns the stream id. - */ - function getNextStreamId() external view returns (uint256); -} - -// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/SafeERC20.sol - -// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) - -/** - * @title SafeERC20 - * @dev Wrappers around ERC20 operations that throw on failure (when the token - * contract returns false). Tokens that return no value (and instead revert or - * throw on failure) are also supported, non-reverting calls are assumed to be - * successful. - * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, - * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. - */ -library SafeERC20 { - using Address for address; - - function safeTransfer(IERC20 token, address to, uint256 value) internal { - _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); - } - - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - _callOptionalReturn( - token, - abi.encodeWithSelector(token.transferFrom.selector, from, to, value) - ); - } - - /** - * @dev Deprecated. This function has issues similar to the ones found in - * {IERC20-approve}, and its usage is discouraged. - * - * Whenever possible, use {safeIncreaseAllowance} and - * {safeDecreaseAllowance} instead. - */ - function safeApprove(IERC20 token, address spender, uint256 value) internal { - // safeApprove should only be called when setting an initial allowance, - // or when resetting it to zero. To increase and decrease it, use - // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' - require( - (value == 0) || (token.allowance(address(this), spender) == 0), - 'SafeERC20: approve from non-zero to non-zero allowance' - ); - _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); - } - - function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { - uint256 newAllowance = token.allowance(address(this), spender) + value; - _callOptionalReturn( - token, - abi.encodeWithSelector(token.approve.selector, spender, newAllowance) - ); - } - - function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { - unchecked { - uint256 oldAllowance = token.allowance(address(this), spender); - require(oldAllowance >= value, 'SafeERC20: decreased allowance below zero'); - uint256 newAllowance = oldAllowance - value; - _callOptionalReturn( - token, - abi.encodeWithSelector(token.approve.selector, spender, newAllowance) - ); - } - } - - /** - * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement - * on the return value: the return value is optional (but if data is returned, it must not be false). - * @param token The token targeted by the call. - * @param data The call data (encoded using abi.encode or one of its variants). - */ - function _callOptionalReturn(IERC20 token, bytes memory data) private { - // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since - // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that - // the target address contains contract code and also asserts for success in the low-level call. - - bytes memory returndata = address(token).functionCall(data, 'SafeERC20: low-level call failed'); - if (returndata.length > 0) { - // Return data is optional - require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed'); - } - } -} - -// downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/Collector.sol - -/** - * @title Collector - * @notice Stores ERC20 tokens of an ecosystem reserve and allows to dispose of them via approval - * or transfer dynamics or streaming capabilities. - * Modification of Sablier https://github.com/sablierhq/sablier/blob/develop/packages/protocol/contracts/Sablier.sol - * Original can be found also deployed on https://etherscan.io/address/0xCD18eAa163733Da39c232722cBC4E8940b1D8888 - * Modifications: - * - Sablier "pulls" the funds from the creator of the stream at creation. In the Aave case, we already have the funds. - * - Anybody can create streams on Sablier. Here, only the funds admin (Aave governance via controller) can - * - Adapted codebase to Solidity 0.8.11, mainly removing SafeMath and CarefulMath to use native safe math - * - Same as with creation, on Sablier the `sender` and `recipient` can cancel a stream. Here, only fund admin and recipient - * @author BGD Labs - **/ -contract Collector is VersionedInitializable, ICollector, ReentrancyGuard { - using SafeERC20 for IERC20; - using Address for address payable; - - /*** Storage Properties ***/ - - /** - * @notice Address of the current funds admin. - */ - address internal _fundsAdmin; - - /** - * @notice Current revision of the contract. - */ - uint256 public constant REVISION = 5; - - /** - * @notice Counter for new stream ids. - */ - uint256 private _nextStreamId; - - /** - * @notice The stream objects identifiable by their unsigned integer ids. - */ - mapping(uint256 => Stream) private _streams; - - /// @inheritdoc ICollector - address public constant ETH_MOCK_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /*** Modifiers ***/ - - /** - * @dev Throws if the caller is not the funds admin. - */ - modifier onlyFundsAdmin() { - require(msg.sender == _fundsAdmin, 'ONLY_BY_FUNDS_ADMIN'); - _; - } - - /** - * @dev Throws if the caller is not the funds admin of the recipient of the stream. - * @param streamId The id of the stream to query. - */ - modifier onlyAdminOrRecipient(uint256 streamId) { - require( - msg.sender == _fundsAdmin || msg.sender == _streams[streamId].recipient, - 'caller is not the funds admin or the recipient of the stream' - ); - _; - } - - /** - * @dev Throws if the provided id does not point to a valid stream. - */ - modifier streamExists(uint256 streamId) { - require(_streams[streamId].isEntity, 'stream does not exist'); - _; - } - - /*** Contract Logic Starts Here */ - - /// @inheritdoc ICollector - function initialize(address fundsAdmin, uint256 nextStreamId) external initializer { - if (nextStreamId != 0) { - _nextStreamId = nextStreamId; - } - - _setFundsAdmin(fundsAdmin); - } - - /*** View Functions ***/ - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure override returns (uint256) { - return REVISION; - } - - /// @inheritdoc ICollector - function getFundsAdmin() external view returns (address) { - return _fundsAdmin; - } - - /// @inheritdoc ICollector - function getNextStreamId() external view returns (uint256) { - return _nextStreamId; - } - - /// @inheritdoc ICollector - function getStream( - uint256 streamId - ) - external - view - streamExists(streamId) - returns ( - address sender, - address recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime, - uint256 remainingBalance, - uint256 ratePerSecond - ) - { - sender = _streams[streamId].sender; - recipient = _streams[streamId].recipient; - deposit = _streams[streamId].deposit; - tokenAddress = _streams[streamId].tokenAddress; - startTime = _streams[streamId].startTime; - stopTime = _streams[streamId].stopTime; - remainingBalance = _streams[streamId].remainingBalance; - ratePerSecond = _streams[streamId].ratePerSecond; - } - - /** - * @notice Returns either the delta in seconds between `block.timestamp` and `startTime` or - * between `stopTime` and `startTime, whichever is smaller. If `block.timestamp` is before - * `startTime`, it returns 0. - * @dev Throws if the id does not point to a valid stream. - * @param streamId The id of the stream for which to query the delta. - * @notice Returns the time delta in seconds. - */ - function deltaOf(uint256 streamId) public view streamExists(streamId) returns (uint256 delta) { - Stream memory stream = _streams[streamId]; - if (block.timestamp <= stream.startTime) return 0; - if (block.timestamp < stream.stopTime) return block.timestamp - stream.startTime; - return stream.stopTime - stream.startTime; - } - - struct BalanceOfLocalVars { - uint256 recipientBalance; - uint256 withdrawalAmount; - uint256 senderBalance; - } - - /// @inheritdoc ICollector - function balanceOf( - uint256 streamId, - address who - ) public view streamExists(streamId) returns (uint256 balance) { - Stream memory stream = _streams[streamId]; - BalanceOfLocalVars memory vars; - - uint256 delta = deltaOf(streamId); - vars.recipientBalance = delta * stream.ratePerSecond; - - /* - * If the stream `balance` does not equal `deposit`, it means there have been withdrawals. - * We have to subtract the total amount withdrawn from the amount of money that has been - * streamed until now. - */ - if (stream.deposit > stream.remainingBalance) { - vars.withdrawalAmount = stream.deposit - stream.remainingBalance; - vars.recipientBalance = vars.recipientBalance - vars.withdrawalAmount; - } - - if (who == stream.recipient) return vars.recipientBalance; - if (who == stream.sender) { - vars.senderBalance = stream.remainingBalance - vars.recipientBalance; - return vars.senderBalance; - } - return 0; - } - - /*** Public Effects & Interactions Functions ***/ - - /// @inheritdoc ICollector - function approve(IERC20 token, address recipient, uint256 amount) external onlyFundsAdmin { - token.safeApprove(recipient, amount); - } - - /// @inheritdoc ICollector - function transfer(IERC20 token, address recipient, uint256 amount) external onlyFundsAdmin { - require(recipient != address(0), 'INVALID_0X_RECIPIENT'); - - if (address(token) == ETH_MOCK_ADDRESS) { - payable(recipient).sendValue(amount); - } else { - token.safeTransfer(recipient, amount); - } - } - - /// @inheritdoc ICollector - function setFundsAdmin(address admin) external onlyFundsAdmin { - _setFundsAdmin(admin); - } - - /** - * @dev Transfer the ownership of the funds administrator role. - * @param admin The address of the new funds administrator - */ - function _setFundsAdmin(address admin) internal { - _fundsAdmin = admin; - emit NewFundsAdmin(admin); - } - - struct CreateStreamLocalVars { - uint256 duration; - uint256 ratePerSecond; - } - - /// @inheritdoc ICollector - /** - * @dev Throws if the recipient is the zero address, the contract itself or the caller. - * Throws if the deposit is 0. - * Throws if the start time is before `block.timestamp`. - * Throws if the stop time is before the start time. - * Throws if the duration calculation has a math error. - * Throws if the deposit is smaller than the duration. - * Throws if the deposit is not a multiple of the duration. - * Throws if the rate calculation has a math error. - * Throws if the next stream id calculation has a math error. - * Throws if the contract is not allowed to transfer enough tokens. - * Throws if there is a token transfer failure. - */ - function createStream( - address recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime - ) external onlyFundsAdmin returns (uint256) { - require(recipient != address(0), 'stream to the zero address'); - require(recipient != address(this), 'stream to the contract itself'); - require(recipient != msg.sender, 'stream to the caller'); - require(deposit > 0, 'deposit is zero'); - require(startTime >= block.timestamp, 'start time before block.timestamp'); - require(stopTime > startTime, 'stop time before the start time'); - - CreateStreamLocalVars memory vars; - vars.duration = stopTime - startTime; - - /* Without this, the rate per second would be zero. */ - require(deposit >= vars.duration, 'deposit smaller than time delta'); - - /* This condition avoids dealing with remainders */ - require(deposit % vars.duration == 0, 'deposit not multiple of time delta'); - - vars.ratePerSecond = deposit / vars.duration; - - /* Create and store the stream object. */ - uint256 streamId = _nextStreamId; - _streams[streamId] = Stream({ - remainingBalance: deposit, - deposit: deposit, - isEntity: true, - ratePerSecond: vars.ratePerSecond, - recipient: recipient, - sender: address(this), - startTime: startTime, - stopTime: stopTime, - tokenAddress: tokenAddress - }); - - /* Increment the next stream id. */ - _nextStreamId++; - - emit CreateStream( - streamId, - address(this), - recipient, - deposit, - tokenAddress, - startTime, - stopTime - ); - return streamId; - } - - /// @inheritdoc ICollector - /** - * @dev Throws if the id does not point to a valid stream. - * Throws if the caller is not the funds admin or the recipient of the stream. - * Throws if the amount exceeds the available balance. - * Throws if there is a token transfer failure. - */ - function withdrawFromStream( - uint256 streamId, - uint256 amount - ) external nonReentrant streamExists(streamId) onlyAdminOrRecipient(streamId) returns (bool) { - require(amount > 0, 'amount is zero'); - Stream memory stream = _streams[streamId]; - - uint256 balance = balanceOf(streamId, stream.recipient); - require(balance >= amount, 'amount exceeds the available balance'); - - _streams[streamId].remainingBalance = stream.remainingBalance - amount; - - if (_streams[streamId].remainingBalance == 0) delete _streams[streamId]; - - IERC20(stream.tokenAddress).safeTransfer(stream.recipient, amount); - emit WithdrawFromStream(streamId, stream.recipient, amount); - return true; - } - - /// @inheritdoc ICollector - /** - * @dev Throws if the id does not point to a valid stream. - * Throws if the caller is not the funds admin or the recipient of the stream. - * Throws if there is a token transfer failure. - */ - function cancelStream( - uint256 streamId - ) external nonReentrant streamExists(streamId) onlyAdminOrRecipient(streamId) returns (bool) { - Stream memory stream = _streams[streamId]; - uint256 senderBalance = balanceOf(streamId, stream.sender); - uint256 recipientBalance = balanceOf(streamId, stream.recipient); - - delete _streams[streamId]; - - IERC20 token = IERC20(stream.tokenAddress); - if (recipientBalance > 0) token.safeTransfer(stream.recipient, recipientBalance); - - emit CancelStream(streamId, stream.sender, stream.recipient, senderBalance, recipientBalance); - return true; - } -} diff --git a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/ReentrancyGuard.sol b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/ReentrancyGuard.sol deleted file mode 100644 index d8b54911..00000000 --- a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/ReentrancyGuard.sol +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Contract module that helps prevent reentrant calls to a function. - * - * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier - * available, which can be applied to functions to make sure there are no nested - * (reentrant) calls to them. - * - * Note that because there is a single `nonReentrant` guard, functions marked as - * `nonReentrant` may not call one another. This can be worked around by making - * those functions `private`, and then adding `external` `nonReentrant` entry - * points to them. - * - * TIP: If you would like to learn more about reentrancy and alternative ways - * to protect against it, check out our blog post - * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. - */ -abstract contract ReentrancyGuard { - // Booleans are more expensive than uint256 or any type that takes up a full - // word because each write operation emits an extra SLOAD to first read the - // slot's contents, replace the bits taken up by the boolean, and then write - // back. This is the compiler's defense against contract upgrades and - // pointer aliasing, and it cannot be disabled. - - // The values being non-zero value makes deployment a bit more expensive, - // but in exchange the refund on every call to nonReentrant will be lower in - // amount. Since refunds are capped to a percentage of the total - // transaction's gas, it is best to keep them low in cases like this one, to - // increase the likelihood of the full refund coming into effect. - uint256 private constant _NOT_ENTERED = 1; - uint256 private constant _ENTERED = 2; - - uint256 private _status; - - constructor() { - _status = _NOT_ENTERED; - } - - /** - * @dev Prevents a contract from calling itself, directly or indirectly. - * Calling a `nonReentrant` function from another `nonReentrant` - * function is not supported. It is possible to prevent this from happening - * by making the `nonReentrant` function external, and making it call a - * `private` function that does the actual work. - */ - modifier nonReentrant() { - // On the first call to nonReentrant, _notEntered will be true - require(_status != _ENTERED, 'ReentrancyGuard: reentrant call'); - - // Any calls to nonReentrant after this point will fail - _status = _ENTERED; - - _; - - // By storing the original value once again, a refund is triggered (see - // https://eips.ethereum.org/EIPS/eip-2200) - _status = _NOT_ENTERED; - } - - /** - * @dev As we use the guard with the proxy we need to init it with the empty value - */ - function _initGuard() internal { - _status = _NOT_ENTERED; - } -} diff --git a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/SafeERC20.sol b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/SafeERC20.sol deleted file mode 100644 index 93db74c1..00000000 --- a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/dependencies/openzeppelin/contracts/SafeERC20.sol +++ /dev/null @@ -1,87 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) - -pragma solidity ^0.8.0; - -import './IERC20.sol'; -import './Address.sol'; - -/** - * @title SafeERC20 - * @dev Wrappers around ERC20 operations that throw on failure (when the token - * contract returns false). Tokens that return no value (and instead revert or - * throw on failure) are also supported, non-reverting calls are assumed to be - * successful. - * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, - * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. - */ -library SafeERC20 { - using Address for address; - - function safeTransfer(IERC20 token, address to, uint256 value) internal { - _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); - } - - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - _callOptionalReturn( - token, - abi.encodeWithSelector(token.transferFrom.selector, from, to, value) - ); - } - - /** - * @dev Deprecated. This function has issues similar to the ones found in - * {IERC20-approve}, and its usage is discouraged. - * - * Whenever possible, use {safeIncreaseAllowance} and - * {safeDecreaseAllowance} instead. - */ - function safeApprove(IERC20 token, address spender, uint256 value) internal { - // safeApprove should only be called when setting an initial allowance, - // or when resetting it to zero. To increase and decrease it, use - // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' - require( - (value == 0) || (token.allowance(address(this), spender) == 0), - 'SafeERC20: approve from non-zero to non-zero allowance' - ); - _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); - } - - function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { - uint256 newAllowance = token.allowance(address(this), spender) + value; - _callOptionalReturn( - token, - abi.encodeWithSelector(token.approve.selector, spender, newAllowance) - ); - } - - function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { - unchecked { - uint256 oldAllowance = token.allowance(address(this), spender); - require(oldAllowance >= value, 'SafeERC20: decreased allowance below zero'); - uint256 newAllowance = oldAllowance - value; - _callOptionalReturn( - token, - abi.encodeWithSelector(token.approve.selector, spender, newAllowance) - ); - } - } - - /** - * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement - * on the return value: the return value is optional (but if data is returned, it must not be false). - * @param token The token targeted by the call. - * @param data The call data (encoded using abi.encode or one of its variants). - */ - function _callOptionalReturn(IERC20 token, bytes memory data) private { - // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since - // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that - // the target address contains contract code and also asserts for success in the low-level call. - - bytes memory returndata = address(token).functionCall(data, 'SafeERC20: low-level call failed'); - if (returndata.length > 0) { - // Return data is optional - require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed'); - } - } -} diff --git a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol deleted file mode 100644 index 1070227a..00000000 --- a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} diff --git a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/Collector.sol b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/Collector.sol deleted file mode 100644 index daf6b7a3..00000000 --- a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/Collector.sol +++ /dev/null @@ -1,341 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {ICollector} from './ICollector.sol'; -import {ReentrancyGuard} from '../dependencies/openzeppelin/ReentrancyGuard.sol'; -import {VersionedInitializable} from '../misc/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {SafeERC20} from '../dependencies/openzeppelin/contracts/SafeERC20.sol'; -import {Address} from '../dependencies/openzeppelin/contracts/Address.sol'; - -/** - * @title Collector - * @notice Stores ERC20 tokens of an ecosystem reserve and allows to dispose of them via approval - * or transfer dynamics or streaming capabilities. - * Modification of Sablier https://github.com/sablierhq/sablier/blob/develop/packages/protocol/contracts/Sablier.sol - * Original can be found also deployed on https://etherscan.io/address/0xCD18eAa163733Da39c232722cBC4E8940b1D8888 - * Modifications: - * - Sablier "pulls" the funds from the creator of the stream at creation. In the Aave case, we already have the funds. - * - Anybody can create streams on Sablier. Here, only the funds admin (Aave governance via controller) can - * - Adapted codebase to Solidity 0.8.11, mainly removing SafeMath and CarefulMath to use native safe math - * - Same as with creation, on Sablier the `sender` and `recipient` can cancel a stream. Here, only fund admin and recipient - * @author BGD Labs - **/ -contract Collector is VersionedInitializable, ICollector, ReentrancyGuard { - using SafeERC20 for IERC20; - using Address for address payable; - - /*** Storage Properties ***/ - - /** - * @notice Address of the current funds admin. - */ - address internal _fundsAdmin; - - /** - * @notice Current revision of the contract. - */ - uint256 public constant REVISION = 5; - - /** - * @notice Counter for new stream ids. - */ - uint256 private _nextStreamId; - - /** - * @notice The stream objects identifiable by their unsigned integer ids. - */ - mapping(uint256 => Stream) private _streams; - - /// @inheritdoc ICollector - address public constant ETH_MOCK_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /*** Modifiers ***/ - - /** - * @dev Throws if the caller is not the funds admin. - */ - modifier onlyFundsAdmin() { - require(msg.sender == _fundsAdmin, 'ONLY_BY_FUNDS_ADMIN'); - _; - } - - /** - * @dev Throws if the caller is not the funds admin of the recipient of the stream. - * @param streamId The id of the stream to query. - */ - modifier onlyAdminOrRecipient(uint256 streamId) { - require( - msg.sender == _fundsAdmin || msg.sender == _streams[streamId].recipient, - 'caller is not the funds admin or the recipient of the stream' - ); - _; - } - - /** - * @dev Throws if the provided id does not point to a valid stream. - */ - modifier streamExists(uint256 streamId) { - require(_streams[streamId].isEntity, 'stream does not exist'); - _; - } - - /*** Contract Logic Starts Here */ - - /// @inheritdoc ICollector - function initialize(address fundsAdmin, uint256 nextStreamId) external initializer { - if (nextStreamId != 0) { - _nextStreamId = nextStreamId; - } - - _setFundsAdmin(fundsAdmin); - } - - /*** View Functions ***/ - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure override returns (uint256) { - return REVISION; - } - - /// @inheritdoc ICollector - function getFundsAdmin() external view returns (address) { - return _fundsAdmin; - } - - /// @inheritdoc ICollector - function getNextStreamId() external view returns (uint256) { - return _nextStreamId; - } - - /// @inheritdoc ICollector - function getStream( - uint256 streamId - ) - external - view - streamExists(streamId) - returns ( - address sender, - address recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime, - uint256 remainingBalance, - uint256 ratePerSecond - ) - { - sender = _streams[streamId].sender; - recipient = _streams[streamId].recipient; - deposit = _streams[streamId].deposit; - tokenAddress = _streams[streamId].tokenAddress; - startTime = _streams[streamId].startTime; - stopTime = _streams[streamId].stopTime; - remainingBalance = _streams[streamId].remainingBalance; - ratePerSecond = _streams[streamId].ratePerSecond; - } - - /** - * @notice Returns either the delta in seconds between `block.timestamp` and `startTime` or - * between `stopTime` and `startTime, whichever is smaller. If `block.timestamp` is before - * `startTime`, it returns 0. - * @dev Throws if the id does not point to a valid stream. - * @param streamId The id of the stream for which to query the delta. - * @notice Returns the time delta in seconds. - */ - function deltaOf(uint256 streamId) public view streamExists(streamId) returns (uint256 delta) { - Stream memory stream = _streams[streamId]; - if (block.timestamp <= stream.startTime) return 0; - if (block.timestamp < stream.stopTime) return block.timestamp - stream.startTime; - return stream.stopTime - stream.startTime; - } - - struct BalanceOfLocalVars { - uint256 recipientBalance; - uint256 withdrawalAmount; - uint256 senderBalance; - } - - /// @inheritdoc ICollector - function balanceOf( - uint256 streamId, - address who - ) public view streamExists(streamId) returns (uint256 balance) { - Stream memory stream = _streams[streamId]; - BalanceOfLocalVars memory vars; - - uint256 delta = deltaOf(streamId); - vars.recipientBalance = delta * stream.ratePerSecond; - - /* - * If the stream `balance` does not equal `deposit`, it means there have been withdrawals. - * We have to subtract the total amount withdrawn from the amount of money that has been - * streamed until now. - */ - if (stream.deposit > stream.remainingBalance) { - vars.withdrawalAmount = stream.deposit - stream.remainingBalance; - vars.recipientBalance = vars.recipientBalance - vars.withdrawalAmount; - } - - if (who == stream.recipient) return vars.recipientBalance; - if (who == stream.sender) { - vars.senderBalance = stream.remainingBalance - vars.recipientBalance; - return vars.senderBalance; - } - return 0; - } - - /*** Public Effects & Interactions Functions ***/ - - /// @inheritdoc ICollector - function approve(IERC20 token, address recipient, uint256 amount) external onlyFundsAdmin { - token.safeApprove(recipient, amount); - } - - /// @inheritdoc ICollector - function transfer(IERC20 token, address recipient, uint256 amount) external onlyFundsAdmin { - require(recipient != address(0), 'INVALID_0X_RECIPIENT'); - - if (address(token) == ETH_MOCK_ADDRESS) { - payable(recipient).sendValue(amount); - } else { - token.safeTransfer(recipient, amount); - } - } - - /// @inheritdoc ICollector - function setFundsAdmin(address admin) external onlyFundsAdmin { - _setFundsAdmin(admin); - } - - /** - * @dev Transfer the ownership of the funds administrator role. - * @param admin The address of the new funds administrator - */ - function _setFundsAdmin(address admin) internal { - _fundsAdmin = admin; - emit NewFundsAdmin(admin); - } - - struct CreateStreamLocalVars { - uint256 duration; - uint256 ratePerSecond; - } - - /// @inheritdoc ICollector - /** - * @dev Throws if the recipient is the zero address, the contract itself or the caller. - * Throws if the deposit is 0. - * Throws if the start time is before `block.timestamp`. - * Throws if the stop time is before the start time. - * Throws if the duration calculation has a math error. - * Throws if the deposit is smaller than the duration. - * Throws if the deposit is not a multiple of the duration. - * Throws if the rate calculation has a math error. - * Throws if the next stream id calculation has a math error. - * Throws if the contract is not allowed to transfer enough tokens. - * Throws if there is a token transfer failure. - */ - function createStream( - address recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime - ) external onlyFundsAdmin returns (uint256) { - require(recipient != address(0), 'stream to the zero address'); - require(recipient != address(this), 'stream to the contract itself'); - require(recipient != msg.sender, 'stream to the caller'); - require(deposit > 0, 'deposit is zero'); - require(startTime >= block.timestamp, 'start time before block.timestamp'); - require(stopTime > startTime, 'stop time before the start time'); - - CreateStreamLocalVars memory vars; - vars.duration = stopTime - startTime; - - /* Without this, the rate per second would be zero. */ - require(deposit >= vars.duration, 'deposit smaller than time delta'); - - /* This condition avoids dealing with remainders */ - require(deposit % vars.duration == 0, 'deposit not multiple of time delta'); - - vars.ratePerSecond = deposit / vars.duration; - - /* Create and store the stream object. */ - uint256 streamId = _nextStreamId; - _streams[streamId] = Stream({ - remainingBalance: deposit, - deposit: deposit, - isEntity: true, - ratePerSecond: vars.ratePerSecond, - recipient: recipient, - sender: address(this), - startTime: startTime, - stopTime: stopTime, - tokenAddress: tokenAddress - }); - - /* Increment the next stream id. */ - _nextStreamId++; - - emit CreateStream( - streamId, - address(this), - recipient, - deposit, - tokenAddress, - startTime, - stopTime - ); - return streamId; - } - - /// @inheritdoc ICollector - /** - * @dev Throws if the id does not point to a valid stream. - * Throws if the caller is not the funds admin or the recipient of the stream. - * Throws if the amount exceeds the available balance. - * Throws if there is a token transfer failure. - */ - function withdrawFromStream( - uint256 streamId, - uint256 amount - ) external nonReentrant streamExists(streamId) onlyAdminOrRecipient(streamId) returns (bool) { - require(amount > 0, 'amount is zero'); - Stream memory stream = _streams[streamId]; - - uint256 balance = balanceOf(streamId, stream.recipient); - require(balance >= amount, 'amount exceeds the available balance'); - - _streams[streamId].remainingBalance = stream.remainingBalance - amount; - - if (_streams[streamId].remainingBalance == 0) delete _streams[streamId]; - - IERC20(stream.tokenAddress).safeTransfer(stream.recipient, amount); - emit WithdrawFromStream(streamId, stream.recipient, amount); - return true; - } - - /// @inheritdoc ICollector - /** - * @dev Throws if the id does not point to a valid stream. - * Throws if the caller is not the funds admin or the recipient of the stream. - * Throws if there is a token transfer failure. - */ - function cancelStream( - uint256 streamId - ) external nonReentrant streamExists(streamId) onlyAdminOrRecipient(streamId) returns (bool) { - Stream memory stream = _streams[streamId]; - uint256 senderBalance = balanceOf(streamId, stream.sender); - uint256 recipientBalance = balanceOf(streamId, stream.recipient); - - delete _streams[streamId]; - - IERC20 token = IERC20(stream.tokenAddress); - if (recipientBalance > 0) token.safeTransfer(stream.recipient, recipientBalance); - - emit CancelStream(streamId, stream.sender, stream.recipient, senderBalance, recipientBalance); - return true; - } -} diff --git a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/ICollector.sol b/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/ICollector.sol deleted file mode 100644 index 94103d48..00000000 --- a/downloads/LINEA/COLLECTOR_IMPL/Collector/src/contracts/treasury/ICollector.sol +++ /dev/null @@ -1,174 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; - -interface ICollector { - struct Stream { - uint256 deposit; - uint256 ratePerSecond; - uint256 remainingBalance; - uint256 startTime; - uint256 stopTime; - address recipient; - address sender; - address tokenAddress; - bool isEntity; - } - - /** @notice Emitted when the funds admin changes - * @param fundsAdmin The new funds admin. - **/ - event NewFundsAdmin(address indexed fundsAdmin); - - /** @notice Emitted when the new stream is created - * @param streamId The identifier of the stream. - * @param sender The address of the collector. - * @param recipient The address towards which the money is streamed. - * @param deposit The amount of money to be streamed. - * @param tokenAddress The ERC20 token to use as streaming currency. - * @param startTime The unix timestamp for when the stream starts. - * @param stopTime The unix timestamp for when the stream stops. - **/ - event CreateStream( - uint256 indexed streamId, - address indexed sender, - address indexed recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime - ); - - /** - * @notice Emmitted when withdraw happens from the contract to the recipient's account. - * @param streamId The id of the stream to withdraw tokens from. - * @param recipient The address towards which the money is streamed. - * @param amount The amount of tokens to withdraw. - */ - event WithdrawFromStream(uint256 indexed streamId, address indexed recipient, uint256 amount); - - /** - * @notice Emmitted when the stream is canceled. - * @param streamId The id of the stream to withdraw tokens from. - * @param sender The address of the collector. - * @param recipient The address towards which the money is streamed. - * @param senderBalance The sender's balance at the moment of cancelling. - * @param recipientBalance The recipient's balance at the moment of cancelling. - */ - event CancelStream( - uint256 indexed streamId, - address indexed sender, - address indexed recipient, - uint256 senderBalance, - uint256 recipientBalance - ); - - /** @notice Returns the mock ETH reference address - * @return address The address - **/ - function ETH_MOCK_ADDRESS() external pure returns (address); - - /** @notice Initializes the contracts - * @param fundsAdmin Funds admin address - * @param nextStreamId StreamId to set, applied if greater than 0 - **/ - function initialize(address fundsAdmin, uint256 nextStreamId) external; - - /** - * @notice Return the funds admin, only entity to be able to interact with this contract (controller of reserve) - * @return address The address of the funds admin - **/ - function getFundsAdmin() external view returns (address); - - /** - * @notice Returns the available funds for the given stream id and address. - * @param streamId The id of the stream for which to query the balance. - * @param who The address for which to query the balance. - * @notice Returns the total funds allocated to `who` as uint256. - */ - function balanceOf(uint256 streamId, address who) external view returns (uint256 balance); - - /** - * @dev Function for the funds admin to give ERC20 allowance to other parties - * @param token The address of the token to give allowance from - * @param recipient Allowance's recipient - * @param amount Allowance to approve - **/ - function approve(IERC20 token, address recipient, uint256 amount) external; - - /** - * @notice Function for the funds admin to transfer ERC20 tokens to other parties - * @param token The address of the token to transfer - * @param recipient Transfer's recipient - * @param amount Amount to transfer - **/ - function transfer(IERC20 token, address recipient, uint256 amount) external; - - /** - * @dev Transfer the ownership of the funds administrator role. - This function should only be callable by the current funds administrator. - * @param admin The address of the new funds administrator - */ - function setFundsAdmin(address admin) external; - - /** - * @notice Creates a new stream funded by this contracts itself and paid towards `recipient`. - * @param recipient The address towards which the money is streamed. - * @param deposit The amount of money to be streamed. - * @param tokenAddress The ERC20 token to use as streaming currency. - * @param startTime The unix timestamp for when the stream starts. - * @param stopTime The unix timestamp for when the stream stops. - * @return streamId the uint256 id of the newly created stream. - */ - function createStream( - address recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime - ) external returns (uint256 streamId); - - /** - * @notice Returns the stream with all its properties. - * @dev Throws if the id does not point to a valid stream. - * @param streamId The id of the stream to query. - * @notice Returns the stream object. - */ - function getStream( - uint256 streamId - ) - external - view - returns ( - address sender, - address recipient, - uint256 deposit, - address tokenAddress, - uint256 startTime, - uint256 stopTime, - uint256 remainingBalance, - uint256 ratePerSecond - ); - - /** - * @notice Withdraws from the contract to the recipient's account. - * @param streamId The id of the stream to withdraw tokens from. - * @param amount The amount of tokens to withdraw. - * @return bool Returns true if successful. - */ - function withdrawFromStream(uint256 streamId, uint256 amount) external returns (bool); - - /** - * @notice Cancels the stream and transfers the tokens back on a pro rata basis. - * @param streamId The id of the stream to cancel. - * @return bool Returns true if successful. - */ - function cancelStream(uint256 streamId) external returns (bool); - - /** - * @notice Returns the next available stream id - * @return nextStreamId Returns the stream id. - */ - function getNextStreamId() external view returns (uint256); -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC.sol b/downloads/LINEA/CONFIGURATOR_LOGIC.sol deleted file mode 100644 index 22e067d6..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC.sol +++ /dev/null @@ -1,3052 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol - -/** - * @title Proxy - * @dev Implements delegation of calls to other contracts, with proper - * forwarding of return values and bubbling of failures. - * It defines a fallback function that delegates all calls to the address - * returned by the abstract _implementation() internal function. - */ -abstract contract Proxy { - /** - * @dev Fallback function. - * Will run if no other function in the contract matches the call data. - * Implemented entirely in `_fallback`. - */ - fallback() external payable { - _fallback(); - } - - /** - * @dev Fallback function that will run if call data is empty. - * IMPORTANT. receive() on implementation contracts will be unreachable - */ - receive() external payable { - _fallback(); - } - - /** - * @return The Address of the implementation. - */ - function _implementation() internal view virtual returns (address); - - /** - * @dev Delegates execution to an implementation contract. - * This is a low level function that doesn't return to its internal call site. - * It will return to the external caller whatever the implementation returns. - * @param implementation Address to delegate. - */ - function _delegate(address implementation) internal { - //solium-disable-next-line - assembly { - // Copy msg.data. We take full control of memory in this inline assembly - // block because it will not return to Solidity code. We overwrite the - // Solidity scratch pad at memory position 0. - calldatacopy(0, 0, calldatasize()) - - // Call the implementation. - // out and outsize are 0 because we don't know the size yet. - let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) - - // Copy the returned data. - returndatacopy(0, 0, returndatasize()) - - switch result - // delegatecall returns 0 on error. - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } - } - } - - /** - * @dev Function that is run as the first thing in the fallback function. - * Can be redefined in derived contracts to add functionality. - * Redefinitions must call super._willFallback(). - */ - function _willFallback() internal virtual {} - - /** - * @dev fallback implementation. - * Extracted to enable manual triggering. - */ - function _fallback() internal { - _willFallback(); - _delegate(_implementation()); - } -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol - -library ConfiguratorInputTypes { - struct InitReserveInput { - address aTokenImpl; - address variableDebtTokenImpl; - bool useVirtualBalance; - address interestRateStrategyAddress; - address underlyingAsset; - address treasury; - address incentivesController; - string aTokenName; - string aTokenSymbol; - string variableDebtTokenName; - string variableDebtTokenSymbol; - bytes params; - bytes interestRateData; - } - - struct UpdateATokenInput { - address asset; - address treasury; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } - - struct UpdateDebtTokenInput { - address asset; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol - -/** - * @title BaseUpgradeabilityProxy - * @dev This contract implements a proxy that allows to change the - * implementation address to which it will delegate. - * Such a change is called an implementation upgrade. - */ -contract BaseUpgradeabilityProxy is Proxy { - /** - * @dev Emitted when the implementation is upgraded. - * @param implementation Address of the new implementation. - */ - event Upgraded(address indexed implementation); - - /** - * @dev Storage slot with the address of the current implementation. - * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant IMPLEMENTATION_SLOT = - 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /** - * @dev Returns the current implementation. - * @return impl Address of the current implementation - */ - function _implementation() internal view override returns (address impl) { - bytes32 slot = IMPLEMENTATION_SLOT; - //solium-disable-next-line - assembly { - impl := sload(slot) - } - } - - /** - * @dev Upgrades the proxy to a new implementation. - * @param newImplementation Address of the new implementation. - */ - function _upgradeTo(address newImplementation) internal { - _setImplementation(newImplementation); - emit Upgraded(newImplementation); - } - - /** - * @dev Sets the implementation address of the proxy. - * @param newImplementation Address of the new implementation. - */ - function _setImplementation(address newImplementation) internal { - require( - Address.isContract(newImplementation), - 'Cannot set a proxy implementation to a non-contract address' - ); - - bytes32 slot = IMPLEMENTATION_SLOT; - - //solium-disable-next-line - assembly { - sstore(slot, newImplementation) - } - } -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol - -/** - * @title InitializableUpgradeabilityProxy - * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing - * implementation and init data. - */ -contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { - /** - * @dev Contract initializer. - * @param _logic Address of the initial implementation. - * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. - */ - function initialize(address _logic, bytes memory _data) public payable { - require(_implementation() == address(0)); - assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); - _setImplementation(_logic); - if (_data.length > 0) { - (bool success, ) = _logic.delegatecall(_data); - require(success); - } - } -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol - -/** - * @title BaseImmutableAdminUpgradeabilityProxy - * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern - * @notice This contract combines an upgradeability proxy with an authorization - * mechanism for administrative tasks. - * @dev The admin role is stored in an immutable, which helps saving transactions costs - * All external functions in this contract must be guarded by the - * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity - * feature proposal that would enable this to be done automatically. - */ -contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - address internal immutable _admin; - - /** - * @dev Constructor. - * @param admin_ The address of the admin - */ - constructor(address admin_) { - _admin = admin_; - } - - modifier ifAdmin() { - if (msg.sender == _admin) { - _; - } else { - _fallback(); - } - } - - /** - * @notice Return the admin address - * @return The address of the proxy admin. - */ - function admin() external ifAdmin returns (address) { - return _admin; - } - - /** - * @notice Return the implementation address - * @return The address of the implementation. - */ - function implementation() external ifAdmin returns (address) { - return _implementation(); - } - - /** - * @notice Upgrade the backing implementation of the proxy. - * @dev Only the admin can call this function. - * @param newImplementation The address of the new implementation. - */ - function upgradeTo(address newImplementation) external ifAdmin { - _upgradeTo(newImplementation); - } - - /** - * @notice Upgrade the backing implementation of the proxy and call a function - * on the new implementation. - * @dev This is useful to initialize the proxied contract. - * @param newImplementation The address of the new implementation. - * @param data Data to send as msg.data in the low level call. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - */ - function upgradeToAndCall( - address newImplementation, - bytes calldata data - ) external payable ifAdmin { - _upgradeTo(newImplementation); - (bool success, ) = newImplementation.delegatecall(data); - require(success); - } - - /** - * @notice Only fall back when the sender is not the admin. - */ - function _willFallback() internal virtual override { - require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); - super._willFallback(); - } -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol - -/** - * @title InitializableAdminUpgradeabilityProxy - * @author Aave - * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function - */ -contract InitializableImmutableAdminUpgradeabilityProxy is - BaseImmutableAdminUpgradeabilityProxy, - InitializableUpgradeabilityProxy -{ - /** - * @dev Constructor. - * @param admin The address of the admin - */ - constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { - // Intentionally left blank - } - - /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy - function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { - BaseImmutableAdminUpgradeabilityProxy._willFallback(); - } -} - -// downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol - -/** - * @title ConfiguratorLogic library - * @author Aave - * @notice Implements the functions to initialize reserves and update aTokens and debtTokens - */ -library ConfiguratorLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPoolConfigurator` for descriptions - event ReserveInitialized( - address indexed asset, - address indexed aToken, - address stableDebtToken, - address variableDebtToken, - address interestRateStrategyAddress - ); - event ATokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - event VariableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @notice Initialize a reserve by creating and initializing aToken and variable debt token - * @dev Emits the `ReserveInitialized` event - * @param pool The Pool in which the reserve will be initialized - * @param input The needed parameters for the initialization - */ - function executeInitReserve( - IPool pool, - ConfiguratorInputTypes.InitReserveInput calldata input - ) external { - // It is an assumption that the asset listed is non-malicious, and the external call doesn't create re-entrancies - uint8 underlyingAssetDecimals = IERC20Detailed(input.underlyingAsset).decimals(); - require(underlyingAssetDecimals > 5, Errors.INVALID_DECIMALS); - - address aTokenProxyAddress = _initTokenWithProxy( - input.aTokenImpl, - abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - pool, - input.treasury, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.aTokenName, - input.aTokenSymbol, - input.params - ) - ); - - address variableDebtTokenProxyAddress = _initTokenWithProxy( - input.variableDebtTokenImpl, - abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - pool, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.variableDebtTokenName, - input.variableDebtTokenSymbol, - input.params - ) - ); - - pool.initReserve( - input.underlyingAsset, - aTokenProxyAddress, - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - - DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); - - currentConfig.setDecimals(underlyingAssetDecimals); - - currentConfig.setActive(true); - currentConfig.setPaused(false); - currentConfig.setFrozen(false); - currentConfig.setVirtualAccActive(input.useVirtualBalance); - - pool.setConfiguration(input.underlyingAsset, currentConfig); - - IReserveInterestRateStrategy(input.interestRateStrategyAddress).setInterestRateParams( - input.underlyingAsset, - input.interestRateData - ); - - emit ReserveInitialized( - input.underlyingAsset, - aTokenProxyAddress, - address(0), - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - } - - /** - * @notice Updates the aToken implementation and initializes it - * @dev Emits the `ATokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the aToken - * @param input The parameters needed for the initialize call - */ - function executeUpdateAToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateATokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - cachedPool, - input.treasury, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); - - emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); - } - - /** - * @notice Updates the variable debt token implementation and initializes it - * @dev Emits the `VariableDebtTokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the variable debt token - * @param input The parameters needed for the initialize call - */ - function executeUpdateVariableDebtToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - cachedPool, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation( - reserveData.variableDebtTokenAddress, - input.implementation, - encodedCall - ); - - emit VariableDebtTokenUpgraded( - input.asset, - reserveData.variableDebtTokenAddress, - input.implementation - ); - } - - /** - * @notice Creates a new proxy and initializes the implementation - * @param implementation The address of the implementation - * @param initParams The parameters that is passed to the implementation to initialize - * @return The address of initialized proxy - */ - function _initTokenWithProxy( - address implementation, - bytes memory initParams - ) internal returns (address) { - InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( - address(this) - ); - - proxy.initialize(implementation, initParams); - - return address(proxy); - } - - /** - * @notice Upgrades the implementation and makes call to the proxy - * @dev The call is used to initialize the new implementation. - * @param proxyAddress The address of the proxy - * @param implementation The address of the new implementation - * @param initParams The parameters to the call after the upgrade - */ - function _upgradeTokenImplementation( - address proxyAddress, - address implementation, - bytes memory initParams - ) internal { - InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( - payable(proxyAddress) - ); - - proxy.upgradeToAndCall(implementation, initParams); - } -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol deleted file mode 100644 index aec817cb..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import './Proxy.sol'; -import '../contracts/Address.sol'; - -/** - * @title BaseUpgradeabilityProxy - * @dev This contract implements a proxy that allows to change the - * implementation address to which it will delegate. - * Such a change is called an implementation upgrade. - */ -contract BaseUpgradeabilityProxy is Proxy { - /** - * @dev Emitted when the implementation is upgraded. - * @param implementation Address of the new implementation. - */ - event Upgraded(address indexed implementation); - - /** - * @dev Storage slot with the address of the current implementation. - * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant IMPLEMENTATION_SLOT = - 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /** - * @dev Returns the current implementation. - * @return impl Address of the current implementation - */ - function _implementation() internal view override returns (address impl) { - bytes32 slot = IMPLEMENTATION_SLOT; - //solium-disable-next-line - assembly { - impl := sload(slot) - } - } - - /** - * @dev Upgrades the proxy to a new implementation. - * @param newImplementation Address of the new implementation. - */ - function _upgradeTo(address newImplementation) internal { - _setImplementation(newImplementation); - emit Upgraded(newImplementation); - } - - /** - * @dev Sets the implementation address of the proxy. - * @param newImplementation Address of the new implementation. - */ - function _setImplementation(address newImplementation) internal { - require( - Address.isContract(newImplementation), - 'Cannot set a proxy implementation to a non-contract address' - ); - - bytes32 slot = IMPLEMENTATION_SLOT; - - //solium-disable-next-line - assembly { - sstore(slot, newImplementation) - } - } -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol deleted file mode 100644 index 4b43fa6a..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import './BaseUpgradeabilityProxy.sol'; - -/** - * @title InitializableUpgradeabilityProxy - * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing - * implementation and init data. - */ -contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { - /** - * @dev Contract initializer. - * @param _logic Address of the initial implementation. - * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. - */ - function initialize(address _logic, bytes memory _data) public payable { - require(_implementation() == address(0)); - assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); - _setImplementation(_logic); - if (_data.length > 0) { - (bool success, ) = _logic.delegatecall(_data); - require(success); - } - } -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol deleted file mode 100644 index 53589441..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol +++ /dev/null @@ -1,81 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title Proxy - * @dev Implements delegation of calls to other contracts, with proper - * forwarding of return values and bubbling of failures. - * It defines a fallback function that delegates all calls to the address - * returned by the abstract _implementation() internal function. - */ -abstract contract Proxy { - /** - * @dev Fallback function. - * Will run if no other function in the contract matches the call data. - * Implemented entirely in `_fallback`. - */ - fallback() external payable { - _fallback(); - } - - /** - * @dev Fallback function that will run if call data is empty. - * IMPORTANT. receive() on implementation contracts will be unreachable - */ - receive() external payable { - _fallback(); - } - - /** - * @return The Address of the implementation. - */ - function _implementation() internal view virtual returns (address); - - /** - * @dev Delegates execution to an implementation contract. - * This is a low level function that doesn't return to its internal call site. - * It will return to the external caller whatever the implementation returns. - * @param implementation Address to delegate. - */ - function _delegate(address implementation) internal { - //solium-disable-next-line - assembly { - // Copy msg.data. We take full control of memory in this inline assembly - // block because it will not return to Solidity code. We overwrite the - // Solidity scratch pad at memory position 0. - calldatacopy(0, 0, calldatasize()) - - // Call the implementation. - // out and outsize are 0 because we don't know the size yet. - let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) - - // Copy the returned data. - returndatacopy(0, 0, returndatasize()) - - switch result - // delegatecall returns 0 on error. - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } - } - } - - /** - * @dev Function that is run as the first thing in the fallback function. - * Can be redefined in derived contracts to add functionality. - * Redefinitions must call super._willFallback(). - */ - function _willFallback() internal virtual {} - - /** - * @dev fallback implementation. - * Extracted to enable manual triggering. - */ - function _fallback() internal { - _willFallback(); - _delegate(_implementation()); - } -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPool.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol deleted file mode 100644 index 252b4a4b..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {BaseUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol'; - -/** - * @title BaseImmutableAdminUpgradeabilityProxy - * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern - * @notice This contract combines an upgradeability proxy with an authorization - * mechanism for administrative tasks. - * @dev The admin role is stored in an immutable, which helps saving transactions costs - * All external functions in this contract must be guarded by the - * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity - * feature proposal that would enable this to be done automatically. - */ -contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - address internal immutable _admin; - - /** - * @dev Constructor. - * @param admin_ The address of the admin - */ - constructor(address admin_) { - _admin = admin_; - } - - modifier ifAdmin() { - if (msg.sender == _admin) { - _; - } else { - _fallback(); - } - } - - /** - * @notice Return the admin address - * @return The address of the proxy admin. - */ - function admin() external ifAdmin returns (address) { - return _admin; - } - - /** - * @notice Return the implementation address - * @return The address of the implementation. - */ - function implementation() external ifAdmin returns (address) { - return _implementation(); - } - - /** - * @notice Upgrade the backing implementation of the proxy. - * @dev Only the admin can call this function. - * @param newImplementation The address of the new implementation. - */ - function upgradeTo(address newImplementation) external ifAdmin { - _upgradeTo(newImplementation); - } - - /** - * @notice Upgrade the backing implementation of the proxy and call a function - * on the new implementation. - * @dev This is useful to initialize the proxied contract. - * @param newImplementation The address of the new implementation. - * @param data Data to send as msg.data in the low level call. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - */ - function upgradeToAndCall( - address newImplementation, - bytes calldata data - ) external payable ifAdmin { - _upgradeTo(newImplementation); - (bool success, ) = newImplementation.delegatecall(data); - require(success); - } - - /** - * @notice Only fall back when the sender is not the admin. - */ - function _willFallback() internal virtual override { - require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); - super._willFallback(); - } -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol deleted file mode 100644 index 6913a19d..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {InitializableUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol'; -import {Proxy} from '../../dependencies/openzeppelin/upgradeability/Proxy.sol'; -import {BaseImmutableAdminUpgradeabilityProxy} from './BaseImmutableAdminUpgradeabilityProxy.sol'; - -/** - * @title InitializableAdminUpgradeabilityProxy - * @author Aave - * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function - */ -contract InitializableImmutableAdminUpgradeabilityProxy is - BaseImmutableAdminUpgradeabilityProxy, - InitializableUpgradeabilityProxy -{ - /** - * @dev Constructor. - * @param admin The address of the admin - */ - constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { - // Intentionally left blank - } - - /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy - function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { - BaseImmutableAdminUpgradeabilityProxy._willFallback(); - } -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol deleted file mode 100644 index c6b08dcc..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol +++ /dev/null @@ -1,223 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IPool} from '../../../interfaces/IPool.sol'; -import {IInitializableAToken} from '../../../interfaces/IInitializableAToken.sol'; -import {IInitializableDebtToken} from '../../../interfaces/IInitializableDebtToken.sol'; -import {InitializableImmutableAdminUpgradeabilityProxy} from '../../../misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {ConfiguratorInputTypes} from '../types/ConfiguratorInputTypes.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; - -/** - * @title ConfiguratorLogic library - * @author Aave - * @notice Implements the functions to initialize reserves and update aTokens and debtTokens - */ -library ConfiguratorLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPoolConfigurator` for descriptions - event ReserveInitialized( - address indexed asset, - address indexed aToken, - address stableDebtToken, - address variableDebtToken, - address interestRateStrategyAddress - ); - event ATokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - event VariableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @notice Initialize a reserve by creating and initializing aToken and variable debt token - * @dev Emits the `ReserveInitialized` event - * @param pool The Pool in which the reserve will be initialized - * @param input The needed parameters for the initialization - */ - function executeInitReserve( - IPool pool, - ConfiguratorInputTypes.InitReserveInput calldata input - ) external { - // It is an assumption that the asset listed is non-malicious, and the external call doesn't create re-entrancies - uint8 underlyingAssetDecimals = IERC20Detailed(input.underlyingAsset).decimals(); - require(underlyingAssetDecimals > 5, Errors.INVALID_DECIMALS); - - address aTokenProxyAddress = _initTokenWithProxy( - input.aTokenImpl, - abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - pool, - input.treasury, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.aTokenName, - input.aTokenSymbol, - input.params - ) - ); - - address variableDebtTokenProxyAddress = _initTokenWithProxy( - input.variableDebtTokenImpl, - abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - pool, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.variableDebtTokenName, - input.variableDebtTokenSymbol, - input.params - ) - ); - - pool.initReserve( - input.underlyingAsset, - aTokenProxyAddress, - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - - DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); - - currentConfig.setDecimals(underlyingAssetDecimals); - - currentConfig.setActive(true); - currentConfig.setPaused(false); - currentConfig.setFrozen(false); - currentConfig.setVirtualAccActive(input.useVirtualBalance); - - pool.setConfiguration(input.underlyingAsset, currentConfig); - - IReserveInterestRateStrategy(input.interestRateStrategyAddress).setInterestRateParams( - input.underlyingAsset, - input.interestRateData - ); - - emit ReserveInitialized( - input.underlyingAsset, - aTokenProxyAddress, - address(0), - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - } - - /** - * @notice Updates the aToken implementation and initializes it - * @dev Emits the `ATokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the aToken - * @param input The parameters needed for the initialize call - */ - function executeUpdateAToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateATokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - cachedPool, - input.treasury, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); - - emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); - } - - /** - * @notice Updates the variable debt token implementation and initializes it - * @dev Emits the `VariableDebtTokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the variable debt token - * @param input The parameters needed for the initialize call - */ - function executeUpdateVariableDebtToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - cachedPool, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation( - reserveData.variableDebtTokenAddress, - input.implementation, - encodedCall - ); - - emit VariableDebtTokenUpgraded( - input.asset, - reserveData.variableDebtTokenAddress, - input.implementation - ); - } - - /** - * @notice Creates a new proxy and initializes the implementation - * @param implementation The address of the implementation - * @param initParams The parameters that is passed to the implementation to initialize - * @return The address of initialized proxy - */ - function _initTokenWithProxy( - address implementation, - bytes memory initParams - ) internal returns (address) { - InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( - address(this) - ); - - proxy.initialize(implementation, initParams); - - return address(proxy); - } - - /** - * @notice Upgrades the implementation and makes call to the proxy - * @dev The call is used to initialize the new implementation. - * @param proxyAddress The address of the proxy - * @param implementation The address of the new implementation - * @param initParams The parameters to the call after the upgrade - */ - function _upgradeTokenImplementation( - address proxyAddress, - address implementation, - bytes memory initParams - ) internal { - InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( - payable(proxyAddress) - ); - - proxy.upgradeToAndCall(implementation, initParams); - } -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol deleted file mode 100644 index 7894871b..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library ConfiguratorInputTypes { - struct InitReserveInput { - address aTokenImpl; - address variableDebtTokenImpl; - bool useVirtualBalance; - address interestRateStrategyAddress; - address underlyingAsset; - address treasury; - address incentivesController; - string aTokenName; - string aTokenSymbol; - string variableDebtTokenName; - string variableDebtTokenSymbol; - bytes params; - bytes interestRateData; - } - - struct UpdateATokenInput { - address asset; - address treasury; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } - - struct UpdateDebtTokenInput { - address asset; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } -} diff --git a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/CONFIGURATOR_LOGIC/ConfiguratorLogic/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL.sol deleted file mode 100644 index fd9dc668..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL.sol +++ /dev/null @@ -1,3383 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol - -/** - * @title EIP712Base - * @author Aave - * @notice Base contract implementation of EIP712. - */ -abstract contract EIP712Base { - bytes public constant EIP712_REVISION = bytes('1'); - bytes32 internal constant EIP712_DOMAIN = - keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); - - // Map of address nonces (address => nonce) - mapping(address => uint256) internal _nonces; - - bytes32 internal _domainSeparator; - uint256 internal immutable _chainId; - - /** - * @dev Constructor. - */ - constructor() { - _chainId = block.chainid; - } - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { - if (block.chainid == _chainId) { - return _domainSeparator; - } - return _calculateDomainSeparator(); - } - - /** - * @notice Returns the nonce value for address specified as parameter - * @param owner The address for which the nonce is being returned - * @return The nonce value for the input address` - */ - function nonces(address owner) public view virtual returns (uint256) { - return _nonces[owner]; - } - - /** - * @notice Compute the current domain separator - * @return The domain separator for the token - */ - function _calculateDomainSeparator() internal view returns (bytes32) { - return - keccak256( - abi.encode( - EIP712_DOMAIN, - keccak256(bytes(_EIP712BaseId())), - keccak256(EIP712_REVISION), - block.chainid, - address(this) - ) - ); - } - - /** - * @notice Returns the user readable name of signing domain (e.g. token name) - * @return The name of the signing domain - */ - function _EIP712BaseId() internal view virtual returns (string memory); -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol - -/** - * @title MintableIncentivizedERC20 - * @author Aave - * @notice Implements mint and burn functions for IncentivizedERC20 - */ -abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) IncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /** - * @notice Mints tokens to an account and apply incentives if defined - * @param account The address receiving tokens - * @param amount The amount of tokens to mint - */ - function _mint(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply + amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } - - /** - * @notice Burns tokens from an account and apply incentives if defined - * @param account The account whose tokens are burnt - * @param amount The amount of tokens to burn - */ - function _burn(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply - amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance - amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol - -/** - * @title ScaledBalanceTokenBase - * @author Aave - * @notice Basic ERC20 implementation of scaled balance token - */ -abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) MintableIncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /// @inheritdoc IScaledBalanceToken - function scaledBalanceOf(address user) external view override returns (uint256) { - return super.balanceOf(user); - } - - /// @inheritdoc IScaledBalanceToken - function getScaledUserBalanceAndSupply( - address user - ) external view override returns (uint256, uint256) { - return (super.balanceOf(user), super.totalSupply()); - } - - /// @inheritdoc IScaledBalanceToken - function scaledTotalSupply() public view virtual override returns (uint256) { - return super.totalSupply(); - } - - /// @inheritdoc IScaledBalanceToken - function getPreviousIndex(address user) external view virtual override returns (uint256) { - return _userState[user].additionalData; - } - - /** - * @notice Implements the basic logic to mint a scaled balance token. - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the scaled tokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function _mintScaled( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) internal returns (bool) { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); - - uint256 scaledBalance = super.balanceOf(onBehalfOf); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[onBehalfOf].additionalData); - - _userState[onBehalfOf].additionalData = index.toUint128(); - - _mint(onBehalfOf, amountScaled.toUint128()); - - uint256 amountToMint = amount + balanceIncrease; - emit Transfer(address(0), onBehalfOf, amountToMint); - emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); - - return (scaledBalance == 0); - } - - /** - * @notice Implements the basic logic to burn a scaled balance token. - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param user The user which debt is burnt - * @param target The address that will receive the underlying, if any - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - */ - function _burnScaled(address user, address target, uint256 amount, uint256 index) internal { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); - - uint256 scaledBalance = super.balanceOf(user); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[user].additionalData); - - _userState[user].additionalData = index.toUint128(); - - _burn(user, amountScaled.toUint128()); - - if (balanceIncrease > amount) { - uint256 amountToMint = balanceIncrease - amount; - emit Transfer(address(0), user, amountToMint); - emit Mint(user, user, amountToMint, balanceIncrease, index); - } else { - uint256 amountToBurn = amount - balanceIncrease; - emit Transfer(user, address(0), amountToBurn); - emit Burn(user, target, amountToBurn, balanceIncrease, index); - } - } - - /** - * @notice Implements the basic logic to transfer scaled balance tokens between two users - * @dev It emits a mint event with the interest accrued per user - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - * @param index The next liquidity index of the reserve - */ - function _transfer(address sender, address recipient, uint256 amount, uint256 index) internal { - uint256 senderScaledBalance = super.balanceOf(sender); - uint256 senderBalanceIncrease = senderScaledBalance.rayMul(index) - - senderScaledBalance.rayMul(_userState[sender].additionalData); - - uint256 recipientScaledBalance = super.balanceOf(recipient); - uint256 recipientBalanceIncrease = recipientScaledBalance.rayMul(index) - - recipientScaledBalance.rayMul(_userState[recipient].additionalData); - - _userState[sender].additionalData = index.toUint128(); - _userState[recipient].additionalData = index.toUint128(); - - super._transfer(sender, recipient, amount.rayDiv(index).toUint128()); - - if (senderBalanceIncrease > 0) { - emit Transfer(address(0), sender, senderBalanceIncrease); - emit Mint(_msgSender(), sender, senderBalanceIncrease, senderBalanceIncrease, index); - } - - if (sender != recipient && recipientBalanceIncrease > 0) { - emit Transfer(address(0), recipient, recipientBalanceIncrease); - emit Mint(_msgSender(), recipient, recipientBalanceIncrease, recipientBalanceIncrease, index); - } - - emit Transfer(sender, recipient, amount); - } -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/AToken.sol - -/** - * @title Aave ERC20 AToken - * @author Aave - * @notice Implementation of the interest bearing token for the Aave protocol - */ -abstract contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, IAToken { - using WadRayMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - - bytes32 public constant PERMIT_TYPEHASH = - keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); - - address internal _treasury; - address internal _underlyingAsset; - - /** - * @dev Constructor. - * @param pool The address of the Pool contract - */ - constructor( - IPool pool - ) ScaledBalanceTokenBase(pool, 'ATOKEN_IMPL', 'ATOKEN_IMPL', 0) EIP712Base() { - // Intentionally left blank - } - - /// @inheritdoc IInitializableAToken - function initialize( - IPool initializingPool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) public virtual; - - /// @inheritdoc IAToken - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external virtual override onlyPool returns (bool) { - return _mintScaled(caller, onBehalfOf, amount, index); - } - - /// @inheritdoc IAToken - function burn( - address from, - address receiverOfUnderlying, - uint256 amount, - uint256 index - ) external virtual override onlyPool { - _burnScaled(from, receiverOfUnderlying, amount, index); - if (receiverOfUnderlying != address(this)) { - IERC20(_underlyingAsset).safeTransfer(receiverOfUnderlying, amount); - } - } - - /// @inheritdoc IAToken - function mintToTreasury(uint256 amount, uint256 index) external virtual override onlyPool { - if (amount == 0) { - return; - } - _mintScaled(address(POOL), _treasury, amount, index); - } - - /// @inheritdoc IAToken - function transferOnLiquidation( - address from, - address to, - uint256 value - ) external virtual override onlyPool { - // Being a normal transfer, the Transfer() and BalanceTransfer() are emitted - // so no need to emit a specific event here - _transfer(from, to, value, false); - } - - /// @inheritdoc IERC20 - function balanceOf( - address user - ) public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { - return super.balanceOf(user).rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { - uint256 currentSupplyScaled = super.totalSupply(); - - if (currentSupplyScaled == 0) { - return 0; - } - - return currentSupplyScaled.rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); - } - - /// @inheritdoc IAToken - function RESERVE_TREASURY_ADDRESS() external view override returns (address) { - return _treasury; - } - - /// @inheritdoc IAToken - function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { - return _underlyingAsset; - } - - /// @inheritdoc IAToken - function transferUnderlyingTo(address target, uint256 amount) external virtual override onlyPool { - IERC20(_underlyingAsset).safeTransfer(target, amount); - } - - /// @inheritdoc IAToken - function handleRepayment( - address user, - address onBehalfOf, - uint256 amount - ) external virtual override onlyPool { - // Intentionally left blank - } - - /// @inheritdoc IAToken - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external override { - require(owner != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - //solium-disable-next-line - require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); - uint256 currentValidNonce = _nonces[owner]; - bytes32 digest = keccak256( - abi.encodePacked( - '\x19\x01', - DOMAIN_SEPARATOR(), - keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentValidNonce, deadline)) - ) - ); - require(owner == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); - _nonces[owner] = currentValidNonce + 1; - _approve(owner, spender, value); - } - - /** - * @notice Transfers the aTokens between two users. Validates the transfer - * (ie checks for valid HF after the transfer) if required - * @param from The source address - * @param to The destination address - * @param amount The amount getting transferred - * @param validate True if the transfer needs to be validated, false otherwise - */ - function _transfer(address from, address to, uint256 amount, bool validate) internal virtual { - address underlyingAsset = _underlyingAsset; - - uint256 index = POOL.getReserveNormalizedIncome(underlyingAsset); - - uint256 fromBalanceBefore = super.balanceOf(from).rayMul(index); - uint256 toBalanceBefore = super.balanceOf(to).rayMul(index); - - super._transfer(from, to, amount, index); - - if (validate) { - POOL.finalizeTransfer(underlyingAsset, from, to, amount, fromBalanceBefore, toBalanceBefore); - } - - emit BalanceTransfer(from, to, amount.rayDiv(index), index); - } - - /** - * @notice Overrides the parent _transfer to force validated transfer() and transferFrom() - * @param from The source address - * @param to The destination address - * @param amount The amount getting transferred - */ - function _transfer(address from, address to, uint128 amount) internal virtual override { - _transfer(from, to, amount, true); - } - - /** - * @dev Overrides the base function to fully implement IAToken - * @dev see `EIP712Base.DOMAIN_SEPARATOR()` for more detailed documentation - */ - function DOMAIN_SEPARATOR() public view override(IAToken, EIP712Base) returns (bytes32) { - return super.DOMAIN_SEPARATOR(); - } - - /** - * @dev Overrides the base function to fully implement IAToken - * @dev see `EIP712Base.nonces()` for more detailed documentation - */ - function nonces(address owner) public view override(IAToken, EIP712Base) returns (uint256) { - return super.nonces(owner); - } - - /// @inheritdoc EIP712Base - function _EIP712BaseId() internal view override returns (string memory) { - return name(); - } - - /// @inheritdoc IAToken - function rescueTokens(address token, address to, uint256 amount) external override onlyPoolAdmin { - require(token != _underlyingAsset, Errors.UNDERLYING_CANNOT_BE_RESCUED); - IERC20(token).safeTransfer(to, amount); - } -} - -// downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/instances/ATokenInstance.sol - -contract ATokenInstance is AToken { - uint256 public constant ATOKEN_REVISION = 1; - - constructor(IPool pool) AToken(pool) {} - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return ATOKEN_REVISION; - } - - /// @inheritdoc IInitializableAToken - function initialize( - IPool initializingPool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) public virtual override initializer { - require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); - _setName(aTokenName); - _setSymbol(aTokenSymbol); - _setDecimals(aTokenDecimals); - - _treasury = treasury; - _underlyingAsset = underlyingAsset; - _incentivesController = incentivesController; - - _domainSeparator = _calculateDomainSeparator(); - - emit Initialized( - underlyingAsset, - address(POOL), - treasury, - address(incentivesController), - aTokenDecimals, - aTokenName, - aTokenSymbol, - params - ); - } -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/instances/ATokenInstance.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/instances/ATokenInstance.sol deleted file mode 100644 index ab8dee10..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/instances/ATokenInstance.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {AToken, IPool, IAaveIncentivesController, IInitializableAToken, Errors, VersionedInitializable} from '../protocol/tokenization/AToken.sol'; - -contract ATokenInstance is AToken { - uint256 public constant ATOKEN_REVISION = 1; - - constructor(IPool pool) AToken(pool) {} - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return ATOKEN_REVISION; - } - - /// @inheritdoc IInitializableAToken - function initialize( - IPool initializingPool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) public virtual override initializer { - require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); - _setName(aTokenName); - _setSymbol(aTokenSymbol); - _setDecimals(aTokenDecimals); - - _treasury = treasury; - _underlyingAsset = underlyingAsset; - _incentivesController = incentivesController; - - _domainSeparator = _calculateDomainSeparator(); - - emit Initialized( - underlyingAsset, - address(POOL), - treasury, - address(incentivesController), - aTokenDecimals, - aTokenName, - aTokenSymbol, - params - ); - } -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPool.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol deleted file mode 100644 index 1070227a..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/AToken.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/AToken.sol deleted file mode 100644 index 47ba03d9..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/AToken.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {VersionedInitializable} from '../../misc/aave-upgradeability/VersionedInitializable.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; -import {WadRayMath} from '../libraries/math/WadRayMath.sol'; -import {IPool} from '../../interfaces/IPool.sol'; -import {IAToken} from '../../interfaces/IAToken.sol'; -import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; -import {IInitializableAToken} from '../../interfaces/IInitializableAToken.sol'; -import {ScaledBalanceTokenBase} from './base/ScaledBalanceTokenBase.sol'; -import {IncentivizedERC20} from './base/IncentivizedERC20.sol'; -import {EIP712Base} from './base/EIP712Base.sol'; - -/** - * @title Aave ERC20 AToken - * @author Aave - * @notice Implementation of the interest bearing token for the Aave protocol - */ -abstract contract AToken is VersionedInitializable, ScaledBalanceTokenBase, EIP712Base, IAToken { - using WadRayMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - - bytes32 public constant PERMIT_TYPEHASH = - keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); - - address internal _treasury; - address internal _underlyingAsset; - - /** - * @dev Constructor. - * @param pool The address of the Pool contract - */ - constructor( - IPool pool - ) ScaledBalanceTokenBase(pool, 'ATOKEN_IMPL', 'ATOKEN_IMPL', 0) EIP712Base() { - // Intentionally left blank - } - - /// @inheritdoc IInitializableAToken - function initialize( - IPool initializingPool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) public virtual; - - /// @inheritdoc IAToken - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external virtual override onlyPool returns (bool) { - return _mintScaled(caller, onBehalfOf, amount, index); - } - - /// @inheritdoc IAToken - function burn( - address from, - address receiverOfUnderlying, - uint256 amount, - uint256 index - ) external virtual override onlyPool { - _burnScaled(from, receiverOfUnderlying, amount, index); - if (receiverOfUnderlying != address(this)) { - IERC20(_underlyingAsset).safeTransfer(receiverOfUnderlying, amount); - } - } - - /// @inheritdoc IAToken - function mintToTreasury(uint256 amount, uint256 index) external virtual override onlyPool { - if (amount == 0) { - return; - } - _mintScaled(address(POOL), _treasury, amount, index); - } - - /// @inheritdoc IAToken - function transferOnLiquidation( - address from, - address to, - uint256 value - ) external virtual override onlyPool { - // Being a normal transfer, the Transfer() and BalanceTransfer() are emitted - // so no need to emit a specific event here - _transfer(from, to, value, false); - } - - /// @inheritdoc IERC20 - function balanceOf( - address user - ) public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { - return super.balanceOf(user).rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override(IncentivizedERC20, IERC20) returns (uint256) { - uint256 currentSupplyScaled = super.totalSupply(); - - if (currentSupplyScaled == 0) { - return 0; - } - - return currentSupplyScaled.rayMul(POOL.getReserveNormalizedIncome(_underlyingAsset)); - } - - /// @inheritdoc IAToken - function RESERVE_TREASURY_ADDRESS() external view override returns (address) { - return _treasury; - } - - /// @inheritdoc IAToken - function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { - return _underlyingAsset; - } - - /// @inheritdoc IAToken - function transferUnderlyingTo(address target, uint256 amount) external virtual override onlyPool { - IERC20(_underlyingAsset).safeTransfer(target, amount); - } - - /// @inheritdoc IAToken - function handleRepayment( - address user, - address onBehalfOf, - uint256 amount - ) external virtual override onlyPool { - // Intentionally left blank - } - - /// @inheritdoc IAToken - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external override { - require(owner != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - //solium-disable-next-line - require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); - uint256 currentValidNonce = _nonces[owner]; - bytes32 digest = keccak256( - abi.encodePacked( - '\x19\x01', - DOMAIN_SEPARATOR(), - keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentValidNonce, deadline)) - ) - ); - require(owner == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); - _nonces[owner] = currentValidNonce + 1; - _approve(owner, spender, value); - } - - /** - * @notice Transfers the aTokens between two users. Validates the transfer - * (ie checks for valid HF after the transfer) if required - * @param from The source address - * @param to The destination address - * @param amount The amount getting transferred - * @param validate True if the transfer needs to be validated, false otherwise - */ - function _transfer(address from, address to, uint256 amount, bool validate) internal virtual { - address underlyingAsset = _underlyingAsset; - - uint256 index = POOL.getReserveNormalizedIncome(underlyingAsset); - - uint256 fromBalanceBefore = super.balanceOf(from).rayMul(index); - uint256 toBalanceBefore = super.balanceOf(to).rayMul(index); - - super._transfer(from, to, amount, index); - - if (validate) { - POOL.finalizeTransfer(underlyingAsset, from, to, amount, fromBalanceBefore, toBalanceBefore); - } - - emit BalanceTransfer(from, to, amount.rayDiv(index), index); - } - - /** - * @notice Overrides the parent _transfer to force validated transfer() and transferFrom() - * @param from The source address - * @param to The destination address - * @param amount The amount getting transferred - */ - function _transfer(address from, address to, uint128 amount) internal virtual override { - _transfer(from, to, amount, true); - } - - /** - * @dev Overrides the base function to fully implement IAToken - * @dev see `EIP712Base.DOMAIN_SEPARATOR()` for more detailed documentation - */ - function DOMAIN_SEPARATOR() public view override(IAToken, EIP712Base) returns (bytes32) { - return super.DOMAIN_SEPARATOR(); - } - - /** - * @dev Overrides the base function to fully implement IAToken - * @dev see `EIP712Base.nonces()` for more detailed documentation - */ - function nonces(address owner) public view override(IAToken, EIP712Base) returns (uint256) { - return super.nonces(owner); - } - - /// @inheritdoc EIP712Base - function _EIP712BaseId() internal view override returns (string memory) { - return name(); - } - - /// @inheritdoc IAToken - function rescueTokens(address token, address to, uint256 amount) external override onlyPoolAdmin { - require(token != _underlyingAsset, Errors.UNDERLYING_CANNOT_BE_RESCUED); - IERC20(token).safeTransfer(to, amount); - } -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol deleted file mode 100644 index 97abc425..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title EIP712Base - * @author Aave - * @notice Base contract implementation of EIP712. - */ -abstract contract EIP712Base { - bytes public constant EIP712_REVISION = bytes('1'); - bytes32 internal constant EIP712_DOMAIN = - keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); - - // Map of address nonces (address => nonce) - mapping(address => uint256) internal _nonces; - - bytes32 internal _domainSeparator; - uint256 internal immutable _chainId; - - /** - * @dev Constructor. - */ - constructor() { - _chainId = block.chainid; - } - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { - if (block.chainid == _chainId) { - return _domainSeparator; - } - return _calculateDomainSeparator(); - } - - /** - * @notice Returns the nonce value for address specified as parameter - * @param owner The address for which the nonce is being returned - * @return The nonce value for the input address` - */ - function nonces(address owner) public view virtual returns (uint256) { - return _nonces[owner]; - } - - /** - * @notice Compute the current domain separator - * @return The domain separator for the token - */ - function _calculateDomainSeparator() internal view returns (bytes32) { - return - keccak256( - abi.encode( - EIP712_DOMAIN, - keccak256(bytes(_EIP712BaseId())), - keccak256(EIP712_REVISION), - block.chainid, - address(this) - ) - ); - } - - /** - * @notice Returns the user readable name of signing domain (e.g. token name) - * @return The name of the signing domain - */ - function _EIP712BaseId() internal view virtual returns (string memory); -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol deleted file mode 100644 index b07b1673..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IncentivizedERC20} from './IncentivizedERC20.sol'; - -/** - * @title MintableIncentivizedERC20 - * @author Aave - * @notice Implements mint and burn functions for IncentivizedERC20 - */ -abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) IncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /** - * @notice Mints tokens to an account and apply incentives if defined - * @param account The address receiving tokens - * @param amount The amount of tokens to mint - */ - function _mint(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply + amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } - - /** - * @notice Burns tokens from an account and apply incentives if defined - * @param account The account whose tokens are burnt - * @param amount The amount of tokens to burn - */ - function _burn(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply - amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance - amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } -} diff --git a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol b/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol deleted file mode 100644 index a79d8917..00000000 --- a/downloads/LINEA/DEFAULT_A_TOKEN_IMPL/ATokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol +++ /dev/null @@ -1,156 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {MintableIncentivizedERC20} from './MintableIncentivizedERC20.sol'; - -/** - * @title ScaledBalanceTokenBase - * @author Aave - * @notice Basic ERC20 implementation of scaled balance token - */ -abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) MintableIncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /// @inheritdoc IScaledBalanceToken - function scaledBalanceOf(address user) external view override returns (uint256) { - return super.balanceOf(user); - } - - /// @inheritdoc IScaledBalanceToken - function getScaledUserBalanceAndSupply( - address user - ) external view override returns (uint256, uint256) { - return (super.balanceOf(user), super.totalSupply()); - } - - /// @inheritdoc IScaledBalanceToken - function scaledTotalSupply() public view virtual override returns (uint256) { - return super.totalSupply(); - } - - /// @inheritdoc IScaledBalanceToken - function getPreviousIndex(address user) external view virtual override returns (uint256) { - return _userState[user].additionalData; - } - - /** - * @notice Implements the basic logic to mint a scaled balance token. - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the scaled tokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function _mintScaled( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) internal returns (bool) { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); - - uint256 scaledBalance = super.balanceOf(onBehalfOf); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[onBehalfOf].additionalData); - - _userState[onBehalfOf].additionalData = index.toUint128(); - - _mint(onBehalfOf, amountScaled.toUint128()); - - uint256 amountToMint = amount + balanceIncrease; - emit Transfer(address(0), onBehalfOf, amountToMint); - emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); - - return (scaledBalance == 0); - } - - /** - * @notice Implements the basic logic to burn a scaled balance token. - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param user The user which debt is burnt - * @param target The address that will receive the underlying, if any - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - */ - function _burnScaled(address user, address target, uint256 amount, uint256 index) internal { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); - - uint256 scaledBalance = super.balanceOf(user); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[user].additionalData); - - _userState[user].additionalData = index.toUint128(); - - _burn(user, amountScaled.toUint128()); - - if (balanceIncrease > amount) { - uint256 amountToMint = balanceIncrease - amount; - emit Transfer(address(0), user, amountToMint); - emit Mint(user, user, amountToMint, balanceIncrease, index); - } else { - uint256 amountToBurn = amount - balanceIncrease; - emit Transfer(user, address(0), amountToBurn); - emit Burn(user, target, amountToBurn, balanceIncrease, index); - } - } - - /** - * @notice Implements the basic logic to transfer scaled balance tokens between two users - * @dev It emits a mint event with the interest accrued per user - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - * @param index The next liquidity index of the reserve - */ - function _transfer(address sender, address recipient, uint256 amount, uint256 index) internal { - uint256 senderScaledBalance = super.balanceOf(sender); - uint256 senderBalanceIncrease = senderScaledBalance.rayMul(index) - - senderScaledBalance.rayMul(_userState[sender].additionalData); - - uint256 recipientScaledBalance = super.balanceOf(recipient); - uint256 recipientBalanceIncrease = recipientScaledBalance.rayMul(index) - - recipientScaledBalance.rayMul(_userState[recipient].additionalData); - - _userState[sender].additionalData = index.toUint128(); - _userState[recipient].additionalData = index.toUint128(); - - super._transfer(sender, recipient, amount.rayDiv(index).toUint128()); - - if (senderBalanceIncrease > 0) { - emit Transfer(address(0), sender, senderBalanceIncrease); - emit Mint(_msgSender(), sender, senderBalanceIncrease, senderBalanceIncrease, index); - } - - if (sender != recipient && recipientBalanceIncrease > 0) { - emit Transfer(address(0), recipient, recipientBalanceIncrease); - emit Mint(_msgSender(), recipient, recipientBalanceIncrease, recipientBalanceIncrease, index); - } - - emit Transfer(sender, recipient, amount); - } -} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol deleted file mode 100644 index 8226df66..00000000 --- a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL.sol +++ /dev/null @@ -1,1853 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} - -// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} - -// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsDistributor.sol - -/** - * @title IRewardsDistributor - * @author Aave - * @notice Defines the basic interface for a Rewards Distributor. - */ -interface IRewardsDistributor { - /** - * @dev Emitted when the configuration of the rewards of an asset is updated. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param oldEmission The old emissions per second value of the reward distribution - * @param newEmission The new emissions per second value of the reward distribution - * @param oldDistributionEnd The old end timestamp of the reward distribution - * @param newDistributionEnd The new end timestamp of the reward distribution - * @param assetIndex The index of the asset distribution - */ - event AssetConfigUpdated( - address indexed asset, - address indexed reward, - uint256 oldEmission, - uint256 newEmission, - uint256 oldDistributionEnd, - uint256 newDistributionEnd, - uint256 assetIndex - ); - - /** - * @dev Emitted when rewards of an asset are accrued on behalf of a user. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param user The address of the user that rewards are accrued on behalf of - * @param assetIndex The index of the asset distribution - * @param userIndex The index of the asset distribution on behalf of the user - * @param rewardsAccrued The amount of rewards accrued - */ - event Accrued( - address indexed asset, - address indexed reward, - address indexed user, - uint256 assetIndex, - uint256 userIndex, - uint256 rewardsAccrued - ); - - /** - * @dev Sets the end date for the distribution - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Gets the end date for the distribution - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The timestamp with the end of the distribution, in unix time format - **/ - function getDistributionEnd(address asset, address reward) external view returns (uint256); - - /** - * @dev Returns the index of a user on a reward distribution - * @param user Address of the user - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The current user asset index, not including new distributions - **/ - function getUserAssetIndex( - address user, - address asset, - address reward - ) external view returns (uint256); - - /** - * @dev Returns the configuration of the distribution reward for a certain asset - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The index of the asset distribution - * @return The emission per second of the reward distribution - * @return The timestamp of the last update of the index - * @return The timestamp of the distribution end - **/ - function getRewardsData( - address asset, - address reward - ) external view returns (uint256, uint256, uint256, uint256); - - /** - * @dev Calculates the next value of an specific distribution index, with validations. - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The old index of the asset distribution - * @return The new index of the asset distribution - **/ - function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); - - /** - * @dev Returns the list of available reward token addresses of an incentivized asset - * @param asset The incentivized asset - * @return List of rewards addresses of the input asset - **/ - function getRewardsByAsset(address asset) external view returns (address[] memory); - - /** - * @dev Returns the list of available reward addresses - * @return List of rewards supported in this contract - **/ - function getRewardsList() external view returns (address[] memory); - - /** - * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. - * @param user The address of the user - * @param reward The address of the reward token - * @return Unclaimed rewards, not including new distributions - **/ - function getUserAccruedRewards(address user, address reward) external view returns (uint256); - - /** - * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @param reward The address of the reward token - * @return The rewards amount - **/ - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view returns (uint256); - - /** - * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @return The list of reward addresses - * @return The list of unclaimed amount of rewards - **/ - function getAllUserRewards( - address[] calldata assets, - address user - ) external view returns (address[] memory, uint256[] memory); - - /** - * @dev Returns the decimals of an asset to calculate the distribution delta - * @param asset The address to retrieve decimals - * @return The decimals of an underlying asset - */ - function getAssetDecimals(address asset) external view returns (uint8); - - /** - * @dev Returns the address of the emission manager - * @return The address of the EmissionManager - */ - function EMISSION_MANAGER() external view returns (address); - - /** - * @dev Returns the address of the emission manager. - * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. - * @return The address of the EmissionManager - */ - function getEmissionManager() external view returns (address); -} - -// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/ITransferStrategyBase.sol - -interface ITransferStrategyBase { - event EmergencyWithdrawal( - address indexed caller, - address indexed token, - address indexed to, - uint256 amount - ); - - /** - * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation - * @param to Account to transfer rewards - * @param reward Address of the reward token - * @param amount Amount to transfer to the "to" address parameter - * @return Returns true bool if transfer logic succeeds - */ - function performTransfer(address to, address reward, uint256 amount) external returns (bool); - - /** - * @return Returns the address of the Incentives Controller - */ - function getIncentivesController() external view returns (address); - - /** - * @return Returns the address of the Rewards admin - */ - function getRewardsAdmin() external view returns (address); - - /** - * @dev Perform an emergency token withdrawal only callable by the Rewards admin - * @param token Address of the token to withdraw funds from this contract - * @param to Address of the recipient of the withdrawal - * @param amount Amount of the withdrawal - */ - function emergencyWithdrawal(address token, address to, uint256 amount) external; -} - -// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/libraries/RewardsDataTypes.sol - -library RewardsDataTypes { - struct RewardsConfigInput { - uint88 emissionPerSecond; - uint256 totalSupply; - uint32 distributionEnd; - address asset; - address reward; - ITransferStrategyBase transferStrategy; - IEACAggregatorProxy rewardOracle; - } - - struct UserAssetBalance { - address asset; - uint256 userBalance; - uint256 totalSupply; - } - - struct UserData { - // Liquidity index of the reward distribution for the user - uint104 index; - // Amount of accrued rewards for the user since last user index update - uint128 accrued; - } - - struct RewardData { - // Liquidity index of the reward distribution - uint104 index; - // Amount of reward tokens distributed per second - uint88 emissionPerSecond; - // Timestamp of the last reward index update - uint32 lastUpdateTimestamp; - // The end of the distribution of rewards (in seconds) - uint32 distributionEnd; - // Map of user addresses and their rewards data (userAddress => userData) - mapping(address => UserData) usersData; - } - - struct AssetData { - // Map of reward token addresses and their data (rewardTokenAddress => rewardData) - mapping(address => RewardData) rewards; - // List of reward token addresses for the asset - mapping(uint128 => address) availableRewards; - // Count of reward tokens for the asset - uint128 availableRewardsCount; - // Number of decimals of the asset - uint8 decimals; - } -} - -// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsController.sol - -/** - * @title IRewardsController - * @author Aave - * @notice Defines the basic interface for a Rewards Controller. - */ -interface IRewardsController is IRewardsDistributor { - /** - * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user - * @param user The address of the user - * @param claimer The address of the claimer - */ - event ClaimerSet(address indexed user, address indexed claimer); - - /** - * @dev Emitted when rewards are claimed - * @param user The address of the user rewards has been claimed on behalf of - * @param reward The address of the token reward is claimed - * @param to The address of the receiver of the rewards - * @param claimer The address of the claimer - * @param amount The amount of rewards claimed - */ - event RewardsClaimed( - address indexed user, - address indexed reward, - address indexed to, - address claimer, - uint256 amount - ); - - /** - * @dev Emitted when a transfer strategy is installed for the reward distribution - * @param reward The address of the token reward - * @param transferStrategy The address of TransferStrategy contract - */ - event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); - - /** - * @dev Emitted when the reward oracle is updated - * @param reward The address of the token reward - * @param rewardOracle The address of oracle - */ - event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Get the price aggregator oracle address - * @param reward The address of the reward - * @return The price oracle of the reward - */ - function getRewardOracle(address reward) external view returns (address); - - /** - * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) - * @param user The address of the user - * @return The claimer address - */ - function getClaimer(address user) external view returns (address); - - /** - * @dev Returns the Transfer Strategy implementation contract address being used for a reward address - * @param reward The address of the reward - * @return The address of the TransferStrategy contract - */ - function getTransferStrategy(address reward) external view returns (address); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - **/ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - - /** - * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The - * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external returns (uint256); - - /** - * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" - **/ - function claimAllRewards( - address[] calldata assets, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must - * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsToSelf( - address[] calldata assets - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); -} - -// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsDistributor.sol - -/** - * @title RewardsDistributor - * @notice Accounting contract to manage multiple staking distributions with multiple rewards - * @author Aave - **/ -abstract contract RewardsDistributor is IRewardsDistributor { - using SafeCast for uint256; - - // Manager of incentives - address public immutable EMISSION_MANAGER; - // Deprecated: This storage slot is kept for backwards compatibility purposes. - address internal _emissionManager; - - // Map of rewarded asset addresses and their data (assetAddress => assetData) - mapping(address => RewardsDataTypes.AssetData) internal _assets; - - // Map of reward assets (rewardAddress => enabled) - mapping(address => bool) internal _isRewardEnabled; - - // Rewards list - address[] internal _rewardsList; - - // Assets list - address[] internal _assetsList; - - modifier onlyEmissionManager() { - require(msg.sender == EMISSION_MANAGER, 'ONLY_EMISSION_MANAGER'); - _; - } - - constructor(address emissionManager) { - EMISSION_MANAGER = emissionManager; - } - - /// @inheritdoc IRewardsDistributor - function getRewardsData( - address asset, - address reward - ) external view override returns (uint256, uint256, uint256, uint256) { - return ( - _assets[asset].rewards[reward].index, - _assets[asset].rewards[reward].emissionPerSecond, - _assets[asset].rewards[reward].lastUpdateTimestamp, - _assets[asset].rewards[reward].distributionEnd - ); - } - - /// @inheritdoc IRewardsDistributor - function getAssetIndex( - address asset, - address reward - ) external view override returns (uint256, uint256) { - RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; - return - _getAssetIndex( - rewardData, - IScaledBalanceToken(asset).scaledTotalSupply(), - 10 ** _assets[asset].decimals - ); - } - - /// @inheritdoc IRewardsDistributor - function getDistributionEnd( - address asset, - address reward - ) external view override returns (uint256) { - return _assets[asset].rewards[reward].distributionEnd; - } - - /// @inheritdoc IRewardsDistributor - function getRewardsByAsset(address asset) external view override returns (address[] memory) { - uint128 rewardsCount = _assets[asset].availableRewardsCount; - address[] memory availableRewards = new address[](rewardsCount); - - for (uint128 i = 0; i < rewardsCount; i++) { - availableRewards[i] = _assets[asset].availableRewards[i]; - } - return availableRewards; - } - - /// @inheritdoc IRewardsDistributor - function getRewardsList() external view override returns (address[] memory) { - return _rewardsList; - } - - /// @inheritdoc IRewardsDistributor - function getUserAssetIndex( - address user, - address asset, - address reward - ) external view override returns (uint256) { - return _assets[asset].rewards[reward].usersData[user].index; - } - - /// @inheritdoc IRewardsDistributor - function getUserAccruedRewards( - address user, - address reward - ) external view override returns (uint256) { - uint256 totalAccrued; - for (uint256 i = 0; i < _assetsList.length; i++) { - totalAccrued += _assets[_assetsList[i]].rewards[reward].usersData[user].accrued; - } - - return totalAccrued; - } - - /// @inheritdoc IRewardsDistributor - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view override returns (uint256) { - return _getUserReward(user, reward, _getUserAssetBalances(assets, user)); - } - - /// @inheritdoc IRewardsDistributor - function getAllUserRewards( - address[] calldata assets, - address user - ) - external - view - override - returns (address[] memory rewardsList, uint256[] memory unclaimedAmounts) - { - RewardsDataTypes.UserAssetBalance[] memory userAssetBalances = _getUserAssetBalances( - assets, - user - ); - rewardsList = new address[](_rewardsList.length); - unclaimedAmounts = new uint256[](rewardsList.length); - - // Add unrealized rewards from user to unclaimedRewards - for (uint256 i = 0; i < userAssetBalances.length; i++) { - for (uint256 r = 0; r < rewardsList.length; r++) { - rewardsList[r] = _rewardsList[r]; - unclaimedAmounts[r] += _assets[userAssetBalances[i].asset] - .rewards[rewardsList[r]] - .usersData[user] - .accrued; - - if (userAssetBalances[i].userBalance == 0) { - continue; - } - unclaimedAmounts[r] += _getPendingRewards(user, rewardsList[r], userAssetBalances[i]); - } - } - return (rewardsList, unclaimedAmounts); - } - - /// @inheritdoc IRewardsDistributor - function setDistributionEnd( - address asset, - address reward, - uint32 newDistributionEnd - ) external override onlyEmissionManager { - uint256 oldDistributionEnd = _assets[asset].rewards[reward].distributionEnd; - _assets[asset].rewards[reward].distributionEnd = newDistributionEnd; - - emit AssetConfigUpdated( - asset, - reward, - _assets[asset].rewards[reward].emissionPerSecond, - _assets[asset].rewards[reward].emissionPerSecond, - oldDistributionEnd, - newDistributionEnd, - _assets[asset].rewards[reward].index - ); - } - - /// @inheritdoc IRewardsDistributor - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external override onlyEmissionManager { - require(rewards.length == newEmissionsPerSecond.length, 'INVALID_INPUT'); - for (uint256 i = 0; i < rewards.length; i++) { - RewardsDataTypes.AssetData storage assetConfig = _assets[asset]; - RewardsDataTypes.RewardData storage rewardConfig = _assets[asset].rewards[rewards[i]]; - uint256 decimals = assetConfig.decimals; - require( - decimals != 0 && rewardConfig.lastUpdateTimestamp != 0, - 'DISTRIBUTION_DOES_NOT_EXIST' - ); - - (uint256 newIndex, ) = _updateRewardData( - rewardConfig, - IScaledBalanceToken(asset).scaledTotalSupply(), - 10 ** decimals - ); - - uint256 oldEmissionPerSecond = rewardConfig.emissionPerSecond; - rewardConfig.emissionPerSecond = newEmissionsPerSecond[i]; - - emit AssetConfigUpdated( - asset, - rewards[i], - oldEmissionPerSecond, - newEmissionsPerSecond[i], - rewardConfig.distributionEnd, - rewardConfig.distributionEnd, - newIndex - ); - } - } - - /** - * @dev Configure the _assets for a specific emission - * @param rewardsInput The array of each asset configuration - **/ - function _configureAssets(RewardsDataTypes.RewardsConfigInput[] memory rewardsInput) internal { - for (uint256 i = 0; i < rewardsInput.length; i++) { - if (_assets[rewardsInput[i].asset].decimals == 0) { - //never initialized before, adding to the list of assets - _assetsList.push(rewardsInput[i].asset); - } - - uint256 decimals = _assets[rewardsInput[i].asset].decimals = IERC20Detailed( - rewardsInput[i].asset - ).decimals(); - - RewardsDataTypes.RewardData storage rewardConfig = _assets[rewardsInput[i].asset].rewards[ - rewardsInput[i].reward - ]; - - // Add reward address to asset available rewards if latestUpdateTimestamp is zero - if (rewardConfig.lastUpdateTimestamp == 0) { - _assets[rewardsInput[i].asset].availableRewards[ - _assets[rewardsInput[i].asset].availableRewardsCount - ] = rewardsInput[i].reward; - _assets[rewardsInput[i].asset].availableRewardsCount++; - } - - // Add reward address to global rewards list if still not enabled - if (_isRewardEnabled[rewardsInput[i].reward] == false) { - _isRewardEnabled[rewardsInput[i].reward] = true; - _rewardsList.push(rewardsInput[i].reward); - } - - // Due emissions is still zero, updates only latestUpdateTimestamp - (uint256 newIndex, ) = _updateRewardData( - rewardConfig, - rewardsInput[i].totalSupply, - 10 ** decimals - ); - - // Configure emission and distribution end of the reward per asset - uint88 oldEmissionsPerSecond = rewardConfig.emissionPerSecond; - uint32 oldDistributionEnd = rewardConfig.distributionEnd; - rewardConfig.emissionPerSecond = rewardsInput[i].emissionPerSecond; - rewardConfig.distributionEnd = rewardsInput[i].distributionEnd; - - emit AssetConfigUpdated( - rewardsInput[i].asset, - rewardsInput[i].reward, - oldEmissionsPerSecond, - rewardsInput[i].emissionPerSecond, - oldDistributionEnd, - rewardsInput[i].distributionEnd, - newIndex - ); - } - } - - /** - * @dev Updates the state of the distribution for the specified reward - * @param rewardData Storage pointer to the distribution reward config - * @param totalSupply Current total of underlying assets for this distribution - * @param assetUnit One unit of asset (10**decimals) - * @return The new distribution index - * @return True if the index was updated, false otherwise - **/ - function _updateRewardData( - RewardsDataTypes.RewardData storage rewardData, - uint256 totalSupply, - uint256 assetUnit - ) internal returns (uint256, bool) { - (uint256 oldIndex, uint256 newIndex) = _getAssetIndex(rewardData, totalSupply, assetUnit); - bool indexUpdated; - if (newIndex != oldIndex) { - require(newIndex <= type(uint104).max, 'INDEX_OVERFLOW'); - indexUpdated = true; - - //optimization: storing one after another saves one SSTORE - rewardData.index = uint104(newIndex); - rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); - } else { - rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); - } - - return (newIndex, indexUpdated); - } - - /** - * @dev Updates the state of the distribution for the specific user - * @param rewardData Storage pointer to the distribution reward config - * @param user The address of the user - * @param userBalance The user balance of the asset - * @param newAssetIndex The new index of the asset distribution - * @param assetUnit One unit of asset (10**decimals) - * @return The rewards accrued since the last update - **/ - function _updateUserData( - RewardsDataTypes.RewardData storage rewardData, - address user, - uint256 userBalance, - uint256 newAssetIndex, - uint256 assetUnit - ) internal returns (uint256, bool) { - uint256 userIndex = rewardData.usersData[user].index; - uint256 rewardsAccrued; - bool dataUpdated; - if ((dataUpdated = userIndex != newAssetIndex)) { - // already checked for overflow in _updateRewardData - rewardData.usersData[user].index = uint104(newAssetIndex); - if (userBalance != 0) { - rewardsAccrued = _getRewards(userBalance, newAssetIndex, userIndex, assetUnit); - - rewardData.usersData[user].accrued += rewardsAccrued.toUint128(); - } - } - return (rewardsAccrued, dataUpdated); - } - - /** - * @dev Iterates and accrues all the rewards for asset of the specific user - * @param asset The address of the reference asset of the distribution - * @param user The user address - * @param userBalance The current user asset balance - * @param totalSupply Total supply of the asset - **/ - function _updateData( - address asset, - address user, - uint256 userBalance, - uint256 totalSupply - ) internal { - uint256 assetUnit; - uint256 numAvailableRewards = _assets[asset].availableRewardsCount; - unchecked { - assetUnit = 10 ** _assets[asset].decimals; - } - - if (numAvailableRewards == 0) { - return; - } - unchecked { - for (uint128 r = 0; r < numAvailableRewards; r++) { - address reward = _assets[asset].availableRewards[r]; - RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; - - (uint256 newAssetIndex, bool rewardDataUpdated) = _updateRewardData( - rewardData, - totalSupply, - assetUnit - ); - - (uint256 rewardsAccrued, bool userDataUpdated) = _updateUserData( - rewardData, - user, - userBalance, - newAssetIndex, - assetUnit - ); - - if (rewardDataUpdated || userDataUpdated) { - emit Accrued(asset, reward, user, newAssetIndex, newAssetIndex, rewardsAccrued); - } - } - } - } - - /** - * @dev Accrues all the rewards of the assets specified in the userAssetBalances list - * @param user The address of the user - * @param userAssetBalances List of structs with the user balance and total supply of a set of assets - **/ - function _updateDataMultiple( - address user, - RewardsDataTypes.UserAssetBalance[] memory userAssetBalances - ) internal { - for (uint256 i = 0; i < userAssetBalances.length; i++) { - _updateData( - userAssetBalances[i].asset, - user, - userAssetBalances[i].userBalance, - userAssetBalances[i].totalSupply - ); - } - } - - /** - * @dev Return the accrued unclaimed amount of a reward from a user over a list of distribution - * @param user The address of the user - * @param reward The address of the reward token - * @param userAssetBalances List of structs with the user balance and total supply of a set of assets - * @return unclaimedRewards The accrued rewards for the user until the moment - **/ - function _getUserReward( - address user, - address reward, - RewardsDataTypes.UserAssetBalance[] memory userAssetBalances - ) internal view returns (uint256 unclaimedRewards) { - // Add unrealized rewards - for (uint256 i = 0; i < userAssetBalances.length; i++) { - if (userAssetBalances[i].userBalance == 0) { - unclaimedRewards += _assets[userAssetBalances[i].asset] - .rewards[reward] - .usersData[user] - .accrued; - } else { - unclaimedRewards += - _getPendingRewards(user, reward, userAssetBalances[i]) + - _assets[userAssetBalances[i].asset].rewards[reward].usersData[user].accrued; - } - } - - return unclaimedRewards; - } - - /** - * @dev Calculates the pending (not yet accrued) rewards since the last user action - * @param user The address of the user - * @param reward The address of the reward token - * @param userAssetBalance struct with the user balance and total supply of the incentivized asset - * @return The pending rewards for the user since the last user action - **/ - function _getPendingRewards( - address user, - address reward, - RewardsDataTypes.UserAssetBalance memory userAssetBalance - ) internal view returns (uint256) { - RewardsDataTypes.RewardData storage rewardData = _assets[userAssetBalance.asset].rewards[ - reward - ]; - uint256 assetUnit = 10 ** _assets[userAssetBalance.asset].decimals; - (, uint256 nextIndex) = _getAssetIndex(rewardData, userAssetBalance.totalSupply, assetUnit); - - return - _getRewards( - userAssetBalance.userBalance, - nextIndex, - rewardData.usersData[user].index, - assetUnit - ); - } - - /** - * @dev Internal function for the calculation of user's rewards on a distribution - * @param userBalance Balance of the user asset on a distribution - * @param reserveIndex Current index of the distribution - * @param userIndex Index stored for the user, representation his staking moment - * @param assetUnit One unit of asset (10**decimals) - * @return The rewards - **/ - function _getRewards( - uint256 userBalance, - uint256 reserveIndex, - uint256 userIndex, - uint256 assetUnit - ) internal pure returns (uint256) { - uint256 result = userBalance * (reserveIndex - userIndex); - assembly { - result := div(result, assetUnit) - } - return result; - } - - /** - * @dev Calculates the next value of an specific distribution index, with validations - * @param rewardData Storage pointer to the distribution reward config - * @param totalSupply of the asset being rewarded - * @param assetUnit One unit of asset (10**decimals) - * @return The new index. - **/ - function _getAssetIndex( - RewardsDataTypes.RewardData storage rewardData, - uint256 totalSupply, - uint256 assetUnit - ) internal view returns (uint256, uint256) { - uint256 oldIndex = rewardData.index; - uint256 distributionEnd = rewardData.distributionEnd; - uint256 emissionPerSecond = rewardData.emissionPerSecond; - uint256 lastUpdateTimestamp = rewardData.lastUpdateTimestamp; - - if ( - emissionPerSecond == 0 || - totalSupply == 0 || - lastUpdateTimestamp == block.timestamp || - lastUpdateTimestamp >= distributionEnd - ) { - return (oldIndex, oldIndex); - } - - uint256 currentTimestamp = block.timestamp > distributionEnd - ? distributionEnd - : block.timestamp; - uint256 timeDelta = currentTimestamp - lastUpdateTimestamp; - uint256 firstTerm = emissionPerSecond * timeDelta * assetUnit; - assembly { - firstTerm := div(firstTerm, totalSupply) - } - return (oldIndex, (firstTerm + oldIndex)); - } - - /** - * @dev Get user balances and total supply of all the assets specified by the assets parameter - * @param assets List of assets to retrieve user balance and total supply - * @param user Address of the user - * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets - */ - function _getUserAssetBalances( - address[] calldata assets, - address user - ) internal view virtual returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances); - - /// @inheritdoc IRewardsDistributor - function getAssetDecimals(address asset) external view returns (uint8) { - return _assets[asset].decimals; - } - - /// @inheritdoc IRewardsDistributor - function getEmissionManager() external view returns (address) { - return EMISSION_MANAGER; - } -} - -// downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsController.sol - -/** - * @title RewardsController - * @notice Abstract contract template to build Distributors contracts for ERC20 rewards to protocol participants - * @author Aave - **/ -contract RewardsController is RewardsDistributor, VersionedInitializable, IRewardsController { - using SafeCast for uint256; - - uint256 public constant REVISION = 1; - - // This mapping allows whitelisted addresses to claim on behalf of others - // useful for contracts that hold tokens to be rewarded but don't have any native logic to claim Liquidity Mining rewards - mapping(address => address) internal _authorizedClaimers; - - // reward => transfer strategy implementation contract - // The TransferStrategy contract abstracts the logic regarding - // the source of the reward and how to transfer it to the user. - mapping(address => ITransferStrategyBase) internal _transferStrategy; - - // This mapping contains the price oracle per reward. - // A price oracle is enforced for integrators to be able to show incentives at - // the current Aave UI without the need to setup an external price registry - // At the moment of reward configuration, the Incentives Controller performs - // a check to see if the provided reward oracle contains `latestAnswer`. - mapping(address => IEACAggregatorProxy) internal _rewardOracle; - - modifier onlyAuthorizedClaimers(address claimer, address user) { - require(_authorizedClaimers[user] == claimer, 'CLAIMER_UNAUTHORIZED'); - _; - } - - constructor(address emissionManager) RewardsDistributor(emissionManager) {} - - /** - * @dev Initialize for RewardsController - * @dev It expects an address as argument since its initialized via PoolAddressesProvider._updateImpl() - **/ - function initialize(address) external initializer {} - - /// @inheritdoc IRewardsController - function getClaimer(address user) external view override returns (address) { - return _authorizedClaimers[user]; - } - - /** - * @dev Returns the revision of the implementation contract - * @return uint256, current revision version - */ - function getRevision() internal pure override returns (uint256) { - return REVISION; - } - - /// @inheritdoc IRewardsController - function getRewardOracle(address reward) external view override returns (address) { - return address(_rewardOracle[reward]); - } - - /// @inheritdoc IRewardsController - function getTransferStrategy(address reward) external view override returns (address) { - return address(_transferStrategy[reward]); - } - - /// @inheritdoc IRewardsController - function configureAssets( - RewardsDataTypes.RewardsConfigInput[] memory config - ) external override onlyEmissionManager { - for (uint256 i = 0; i < config.length; i++) { - // Get the current Scaled Total Supply of AToken or Debt token - config[i].totalSupply = IScaledBalanceToken(config[i].asset).scaledTotalSupply(); - - // Install TransferStrategy logic at IncentivesController - _installTransferStrategy(config[i].reward, config[i].transferStrategy); - - // Set reward oracle, enforces input oracle to have latestPrice function - _setRewardOracle(config[i].reward, config[i].rewardOracle); - } - _configureAssets(config); - } - - /// @inheritdoc IRewardsController - function setTransferStrategy( - address reward, - ITransferStrategyBase transferStrategy - ) external onlyEmissionManager { - _installTransferStrategy(reward, transferStrategy); - } - - /// @inheritdoc IRewardsController - function setRewardOracle( - address reward, - IEACAggregatorProxy rewardOracle - ) external onlyEmissionManager { - _setRewardOracle(reward, rewardOracle); - } - - /// @inheritdoc IRewardsController - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external override { - _updateData(msg.sender, user, userBalance, totalSupply); - } - - /// @inheritdoc IRewardsController - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external override returns (uint256) { - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimRewards(assets, amount, msg.sender, msg.sender, to, reward); - } - - /// @inheritdoc IRewardsController - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external override onlyAuthorizedClaimers(msg.sender, user) returns (uint256) { - require(user != address(0), 'INVALID_USER_ADDRESS'); - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimRewards(assets, amount, msg.sender, user, to, reward); - } - - /// @inheritdoc IRewardsController - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external override returns (uint256) { - return _claimRewards(assets, amount, msg.sender, msg.sender, msg.sender, reward); - } - - /// @inheritdoc IRewardsController - function claimAllRewards( - address[] calldata assets, - address to - ) external override returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimAllRewards(assets, msg.sender, msg.sender, to); - } - - /// @inheritdoc IRewardsController - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) - external - override - onlyAuthorizedClaimers(msg.sender, user) - returns (address[] memory rewardsList, uint256[] memory claimedAmounts) - { - require(user != address(0), 'INVALID_USER_ADDRESS'); - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimAllRewards(assets, msg.sender, user, to); - } - - /// @inheritdoc IRewardsController - function claimAllRewardsToSelf( - address[] calldata assets - ) external override returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { - return _claimAllRewards(assets, msg.sender, msg.sender, msg.sender); - } - - /// @inheritdoc IRewardsController - function setClaimer(address user, address caller) external override onlyEmissionManager { - _authorizedClaimers[user] = caller; - emit ClaimerSet(user, caller); - } - - /** - * @dev Get user balances and total supply of all the assets specified by the assets parameter - * @param assets List of assets to retrieve user balance and total supply - * @param user Address of the user - * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets - */ - function _getUserAssetBalances( - address[] calldata assets, - address user - ) internal view override returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances) { - userAssetBalances = new RewardsDataTypes.UserAssetBalance[](assets.length); - for (uint256 i = 0; i < assets.length; i++) { - userAssetBalances[i].asset = assets[i]; - (userAssetBalances[i].userBalance, userAssetBalances[i].totalSupply) = IScaledBalanceToken( - assets[i] - ).getScaledUserBalanceAndSupply(user); - } - return userAssetBalances; - } - - /** - * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount Amount of rewards to claim - * @param claimer Address of the claimer who claims rewards on behalf of user - * @param user Address to check and claim rewards - * @param to Address that will be receiving the rewards - * @param reward Address of the reward token - * @return Rewards claimed - **/ - function _claimRewards( - address[] calldata assets, - uint256 amount, - address claimer, - address user, - address to, - address reward - ) internal returns (uint256) { - if (amount == 0) { - return 0; - } - uint256 totalRewards; - - _updateDataMultiple(user, _getUserAssetBalances(assets, user)); - for (uint256 i = 0; i < assets.length; i++) { - address asset = assets[i]; - totalRewards += _assets[asset].rewards[reward].usersData[user].accrued; - - if (totalRewards <= amount) { - _assets[asset].rewards[reward].usersData[user].accrued = 0; - } else { - uint256 difference = totalRewards - amount; - totalRewards -= difference; - _assets[asset].rewards[reward].usersData[user].accrued = difference.toUint128(); - break; - } - } - - if (totalRewards == 0) { - return 0; - } - - _transferRewards(to, reward, totalRewards); - emit RewardsClaimed(user, reward, to, claimer, totalRewards); - - return totalRewards; - } - - /** - * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. - * @param assets List of assets to check eligible distributions before claiming rewards - * @param claimer Address of the claimer on behalf of user - * @param user Address to check and claim rewards - * @param to Address that will be receiving the rewards - * @return - * rewardsList List of reward addresses - * claimedAmount List of claimed amounts, follows "rewardsList" items order - **/ - function _claimAllRewards( - address[] calldata assets, - address claimer, - address user, - address to - ) internal returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { - uint256 rewardsListLength = _rewardsList.length; - rewardsList = new address[](rewardsListLength); - claimedAmounts = new uint256[](rewardsListLength); - - _updateDataMultiple(user, _getUserAssetBalances(assets, user)); - - for (uint256 i = 0; i < assets.length; i++) { - address asset = assets[i]; - for (uint256 j = 0; j < rewardsListLength; j++) { - if (rewardsList[j] == address(0)) { - rewardsList[j] = _rewardsList[j]; - } - uint256 rewardAmount = _assets[asset].rewards[rewardsList[j]].usersData[user].accrued; - if (rewardAmount != 0) { - claimedAmounts[j] += rewardAmount; - _assets[asset].rewards[rewardsList[j]].usersData[user].accrued = 0; - } - } - } - for (uint256 i = 0; i < rewardsListLength; i++) { - _transferRewards(to, rewardsList[i], claimedAmounts[i]); - emit RewardsClaimed(user, rewardsList[i], to, claimer, claimedAmounts[i]); - } - return (rewardsList, claimedAmounts); - } - - /** - * @dev Function to transfer rewards to the desired account using delegatecall and - * @param to Account address to send the rewards - * @param reward Address of the reward token - * @param amount Amount of rewards to transfer - */ - function _transferRewards(address to, address reward, uint256 amount) internal { - ITransferStrategyBase transferStrategy = _transferStrategy[reward]; - - bool success = transferStrategy.performTransfer(to, reward, amount); - - require(success == true, 'TRANSFER_ERROR'); - } - - /** - * @dev Returns true if `account` is a contract. - * @param account The address of the account - * @return bool, true if contract, false otherwise - */ - function _isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - // solhint-disable-next-line no-inline-assembly - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Internal function to call the optional install hook at the TransferStrategy - * @param reward The address of the reward token - * @param transferStrategy The address of the reward TransferStrategy - */ - function _installTransferStrategy( - address reward, - ITransferStrategyBase transferStrategy - ) internal { - require(address(transferStrategy) != address(0), 'STRATEGY_CAN_NOT_BE_ZERO'); - require(_isContract(address(transferStrategy)) == true, 'STRATEGY_MUST_BE_CONTRACT'); - - _transferStrategy[reward] = transferStrategy; - - emit TransferStrategyInstalled(reward, address(transferStrategy)); - } - - /** - * @dev Update the Price Oracle of a reward token. The Price Oracle must follow Chainlink IEACAggregatorProxy interface. - * @notice The Price Oracle of a reward is used for displaying correct data about the incentives at the UI frontend. - * @param reward The address of the reward token - * @param rewardOracle The address of the price oracle - */ - - function _setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) internal { - require(rewardOracle.latestAnswer() > 0, 'ORACLE_MUST_RETURN_PRICE'); - _rewardOracle[reward] = rewardOracle; - emit RewardOracleUpdated(reward, address(rewardOracle)); - } -} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol deleted file mode 100644 index c89baee6..00000000 --- a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol deleted file mode 100644 index 1070227a..00000000 --- a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsController.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsController.sol deleted file mode 100644 index 3a817f60..00000000 --- a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsController.sol +++ /dev/null @@ -1,355 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '../misc/aave-upgradeability/VersionedInitializable.sol'; -import {SafeCast} from '../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IScaledBalanceToken} from '../interfaces/IScaledBalanceToken.sol'; -import {RewardsDistributor} from './RewardsDistributor.sol'; -import {IRewardsController} from './interfaces/IRewardsController.sol'; -import {ITransferStrategyBase} from './interfaces/ITransferStrategyBase.sol'; -import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol'; -import {IEACAggregatorProxy} from '../helpers/interfaces/IEACAggregatorProxy.sol'; - -/** - * @title RewardsController - * @notice Abstract contract template to build Distributors contracts for ERC20 rewards to protocol participants - * @author Aave - **/ -contract RewardsController is RewardsDistributor, VersionedInitializable, IRewardsController { - using SafeCast for uint256; - - uint256 public constant REVISION = 1; - - // This mapping allows whitelisted addresses to claim on behalf of others - // useful for contracts that hold tokens to be rewarded but don't have any native logic to claim Liquidity Mining rewards - mapping(address => address) internal _authorizedClaimers; - - // reward => transfer strategy implementation contract - // The TransferStrategy contract abstracts the logic regarding - // the source of the reward and how to transfer it to the user. - mapping(address => ITransferStrategyBase) internal _transferStrategy; - - // This mapping contains the price oracle per reward. - // A price oracle is enforced for integrators to be able to show incentives at - // the current Aave UI without the need to setup an external price registry - // At the moment of reward configuration, the Incentives Controller performs - // a check to see if the provided reward oracle contains `latestAnswer`. - mapping(address => IEACAggregatorProxy) internal _rewardOracle; - - modifier onlyAuthorizedClaimers(address claimer, address user) { - require(_authorizedClaimers[user] == claimer, 'CLAIMER_UNAUTHORIZED'); - _; - } - - constructor(address emissionManager) RewardsDistributor(emissionManager) {} - - /** - * @dev Initialize for RewardsController - * @dev It expects an address as argument since its initialized via PoolAddressesProvider._updateImpl() - **/ - function initialize(address) external initializer {} - - /// @inheritdoc IRewardsController - function getClaimer(address user) external view override returns (address) { - return _authorizedClaimers[user]; - } - - /** - * @dev Returns the revision of the implementation contract - * @return uint256, current revision version - */ - function getRevision() internal pure override returns (uint256) { - return REVISION; - } - - /// @inheritdoc IRewardsController - function getRewardOracle(address reward) external view override returns (address) { - return address(_rewardOracle[reward]); - } - - /// @inheritdoc IRewardsController - function getTransferStrategy(address reward) external view override returns (address) { - return address(_transferStrategy[reward]); - } - - /// @inheritdoc IRewardsController - function configureAssets( - RewardsDataTypes.RewardsConfigInput[] memory config - ) external override onlyEmissionManager { - for (uint256 i = 0; i < config.length; i++) { - // Get the current Scaled Total Supply of AToken or Debt token - config[i].totalSupply = IScaledBalanceToken(config[i].asset).scaledTotalSupply(); - - // Install TransferStrategy logic at IncentivesController - _installTransferStrategy(config[i].reward, config[i].transferStrategy); - - // Set reward oracle, enforces input oracle to have latestPrice function - _setRewardOracle(config[i].reward, config[i].rewardOracle); - } - _configureAssets(config); - } - - /// @inheritdoc IRewardsController - function setTransferStrategy( - address reward, - ITransferStrategyBase transferStrategy - ) external onlyEmissionManager { - _installTransferStrategy(reward, transferStrategy); - } - - /// @inheritdoc IRewardsController - function setRewardOracle( - address reward, - IEACAggregatorProxy rewardOracle - ) external onlyEmissionManager { - _setRewardOracle(reward, rewardOracle); - } - - /// @inheritdoc IRewardsController - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external override { - _updateData(msg.sender, user, userBalance, totalSupply); - } - - /// @inheritdoc IRewardsController - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external override returns (uint256) { - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimRewards(assets, amount, msg.sender, msg.sender, to, reward); - } - - /// @inheritdoc IRewardsController - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external override onlyAuthorizedClaimers(msg.sender, user) returns (uint256) { - require(user != address(0), 'INVALID_USER_ADDRESS'); - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimRewards(assets, amount, msg.sender, user, to, reward); - } - - /// @inheritdoc IRewardsController - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external override returns (uint256) { - return _claimRewards(assets, amount, msg.sender, msg.sender, msg.sender, reward); - } - - /// @inheritdoc IRewardsController - function claimAllRewards( - address[] calldata assets, - address to - ) external override returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimAllRewards(assets, msg.sender, msg.sender, to); - } - - /// @inheritdoc IRewardsController - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) - external - override - onlyAuthorizedClaimers(msg.sender, user) - returns (address[] memory rewardsList, uint256[] memory claimedAmounts) - { - require(user != address(0), 'INVALID_USER_ADDRESS'); - require(to != address(0), 'INVALID_TO_ADDRESS'); - return _claimAllRewards(assets, msg.sender, user, to); - } - - /// @inheritdoc IRewardsController - function claimAllRewardsToSelf( - address[] calldata assets - ) external override returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { - return _claimAllRewards(assets, msg.sender, msg.sender, msg.sender); - } - - /// @inheritdoc IRewardsController - function setClaimer(address user, address caller) external override onlyEmissionManager { - _authorizedClaimers[user] = caller; - emit ClaimerSet(user, caller); - } - - /** - * @dev Get user balances and total supply of all the assets specified by the assets parameter - * @param assets List of assets to retrieve user balance and total supply - * @param user Address of the user - * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets - */ - function _getUserAssetBalances( - address[] calldata assets, - address user - ) internal view override returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances) { - userAssetBalances = new RewardsDataTypes.UserAssetBalance[](assets.length); - for (uint256 i = 0; i < assets.length; i++) { - userAssetBalances[i].asset = assets[i]; - (userAssetBalances[i].userBalance, userAssetBalances[i].totalSupply) = IScaledBalanceToken( - assets[i] - ).getScaledUserBalanceAndSupply(user); - } - return userAssetBalances; - } - - /** - * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount Amount of rewards to claim - * @param claimer Address of the claimer who claims rewards on behalf of user - * @param user Address to check and claim rewards - * @param to Address that will be receiving the rewards - * @param reward Address of the reward token - * @return Rewards claimed - **/ - function _claimRewards( - address[] calldata assets, - uint256 amount, - address claimer, - address user, - address to, - address reward - ) internal returns (uint256) { - if (amount == 0) { - return 0; - } - uint256 totalRewards; - - _updateDataMultiple(user, _getUserAssetBalances(assets, user)); - for (uint256 i = 0; i < assets.length; i++) { - address asset = assets[i]; - totalRewards += _assets[asset].rewards[reward].usersData[user].accrued; - - if (totalRewards <= amount) { - _assets[asset].rewards[reward].usersData[user].accrued = 0; - } else { - uint256 difference = totalRewards - amount; - totalRewards -= difference; - _assets[asset].rewards[reward].usersData[user].accrued = difference.toUint128(); - break; - } - } - - if (totalRewards == 0) { - return 0; - } - - _transferRewards(to, reward, totalRewards); - emit RewardsClaimed(user, reward, to, claimer, totalRewards); - - return totalRewards; - } - - /** - * @dev Claims one type of reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. - * @param assets List of assets to check eligible distributions before claiming rewards - * @param claimer Address of the claimer on behalf of user - * @param user Address to check and claim rewards - * @param to Address that will be receiving the rewards - * @return - * rewardsList List of reward addresses - * claimedAmount List of claimed amounts, follows "rewardsList" items order - **/ - function _claimAllRewards( - address[] calldata assets, - address claimer, - address user, - address to - ) internal returns (address[] memory rewardsList, uint256[] memory claimedAmounts) { - uint256 rewardsListLength = _rewardsList.length; - rewardsList = new address[](rewardsListLength); - claimedAmounts = new uint256[](rewardsListLength); - - _updateDataMultiple(user, _getUserAssetBalances(assets, user)); - - for (uint256 i = 0; i < assets.length; i++) { - address asset = assets[i]; - for (uint256 j = 0; j < rewardsListLength; j++) { - if (rewardsList[j] == address(0)) { - rewardsList[j] = _rewardsList[j]; - } - uint256 rewardAmount = _assets[asset].rewards[rewardsList[j]].usersData[user].accrued; - if (rewardAmount != 0) { - claimedAmounts[j] += rewardAmount; - _assets[asset].rewards[rewardsList[j]].usersData[user].accrued = 0; - } - } - } - for (uint256 i = 0; i < rewardsListLength; i++) { - _transferRewards(to, rewardsList[i], claimedAmounts[i]); - emit RewardsClaimed(user, rewardsList[i], to, claimer, claimedAmounts[i]); - } - return (rewardsList, claimedAmounts); - } - - /** - * @dev Function to transfer rewards to the desired account using delegatecall and - * @param to Account address to send the rewards - * @param reward Address of the reward token - * @param amount Amount of rewards to transfer - */ - function _transferRewards(address to, address reward, uint256 amount) internal { - ITransferStrategyBase transferStrategy = _transferStrategy[reward]; - - bool success = transferStrategy.performTransfer(to, reward, amount); - - require(success == true, 'TRANSFER_ERROR'); - } - - /** - * @dev Returns true if `account` is a contract. - * @param account The address of the account - * @return bool, true if contract, false otherwise - */ - function _isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - // solhint-disable-next-line no-inline-assembly - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Internal function to call the optional install hook at the TransferStrategy - * @param reward The address of the reward token - * @param transferStrategy The address of the reward TransferStrategy - */ - function _installTransferStrategy( - address reward, - ITransferStrategyBase transferStrategy - ) internal { - require(address(transferStrategy) != address(0), 'STRATEGY_CAN_NOT_BE_ZERO'); - require(_isContract(address(transferStrategy)) == true, 'STRATEGY_MUST_BE_CONTRACT'); - - _transferStrategy[reward] = transferStrategy; - - emit TransferStrategyInstalled(reward, address(transferStrategy)); - } - - /** - * @dev Update the Price Oracle of a reward token. The Price Oracle must follow Chainlink IEACAggregatorProxy interface. - * @notice The Price Oracle of a reward is used for displaying correct data about the incentives at the UI frontend. - * @param reward The address of the reward token - * @param rewardOracle The address of the price oracle - */ - - function _setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) internal { - require(rewardOracle.latestAnswer() > 0, 'ORACLE_MUST_RETURN_PRICE'); - _rewardOracle[reward] = rewardOracle; - emit RewardOracleUpdated(reward, address(rewardOracle)); - } -} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsDistributor.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsDistributor.sol deleted file mode 100644 index 3969a6fd..00000000 --- a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/RewardsDistributor.sol +++ /dev/null @@ -1,537 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IScaledBalanceToken} from '../interfaces/IScaledBalanceToken.sol'; -import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IRewardsDistributor} from './interfaces/IRewardsDistributor.sol'; -import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol'; - -/** - * @title RewardsDistributor - * @notice Accounting contract to manage multiple staking distributions with multiple rewards - * @author Aave - **/ -abstract contract RewardsDistributor is IRewardsDistributor { - using SafeCast for uint256; - - // Manager of incentives - address public immutable EMISSION_MANAGER; - // Deprecated: This storage slot is kept for backwards compatibility purposes. - address internal _emissionManager; - - // Map of rewarded asset addresses and their data (assetAddress => assetData) - mapping(address => RewardsDataTypes.AssetData) internal _assets; - - // Map of reward assets (rewardAddress => enabled) - mapping(address => bool) internal _isRewardEnabled; - - // Rewards list - address[] internal _rewardsList; - - // Assets list - address[] internal _assetsList; - - modifier onlyEmissionManager() { - require(msg.sender == EMISSION_MANAGER, 'ONLY_EMISSION_MANAGER'); - _; - } - - constructor(address emissionManager) { - EMISSION_MANAGER = emissionManager; - } - - /// @inheritdoc IRewardsDistributor - function getRewardsData( - address asset, - address reward - ) external view override returns (uint256, uint256, uint256, uint256) { - return ( - _assets[asset].rewards[reward].index, - _assets[asset].rewards[reward].emissionPerSecond, - _assets[asset].rewards[reward].lastUpdateTimestamp, - _assets[asset].rewards[reward].distributionEnd - ); - } - - /// @inheritdoc IRewardsDistributor - function getAssetIndex( - address asset, - address reward - ) external view override returns (uint256, uint256) { - RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; - return - _getAssetIndex( - rewardData, - IScaledBalanceToken(asset).scaledTotalSupply(), - 10 ** _assets[asset].decimals - ); - } - - /// @inheritdoc IRewardsDistributor - function getDistributionEnd( - address asset, - address reward - ) external view override returns (uint256) { - return _assets[asset].rewards[reward].distributionEnd; - } - - /// @inheritdoc IRewardsDistributor - function getRewardsByAsset(address asset) external view override returns (address[] memory) { - uint128 rewardsCount = _assets[asset].availableRewardsCount; - address[] memory availableRewards = new address[](rewardsCount); - - for (uint128 i = 0; i < rewardsCount; i++) { - availableRewards[i] = _assets[asset].availableRewards[i]; - } - return availableRewards; - } - - /// @inheritdoc IRewardsDistributor - function getRewardsList() external view override returns (address[] memory) { - return _rewardsList; - } - - /// @inheritdoc IRewardsDistributor - function getUserAssetIndex( - address user, - address asset, - address reward - ) external view override returns (uint256) { - return _assets[asset].rewards[reward].usersData[user].index; - } - - /// @inheritdoc IRewardsDistributor - function getUserAccruedRewards( - address user, - address reward - ) external view override returns (uint256) { - uint256 totalAccrued; - for (uint256 i = 0; i < _assetsList.length; i++) { - totalAccrued += _assets[_assetsList[i]].rewards[reward].usersData[user].accrued; - } - - return totalAccrued; - } - - /// @inheritdoc IRewardsDistributor - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view override returns (uint256) { - return _getUserReward(user, reward, _getUserAssetBalances(assets, user)); - } - - /// @inheritdoc IRewardsDistributor - function getAllUserRewards( - address[] calldata assets, - address user - ) - external - view - override - returns (address[] memory rewardsList, uint256[] memory unclaimedAmounts) - { - RewardsDataTypes.UserAssetBalance[] memory userAssetBalances = _getUserAssetBalances( - assets, - user - ); - rewardsList = new address[](_rewardsList.length); - unclaimedAmounts = new uint256[](rewardsList.length); - - // Add unrealized rewards from user to unclaimedRewards - for (uint256 i = 0; i < userAssetBalances.length; i++) { - for (uint256 r = 0; r < rewardsList.length; r++) { - rewardsList[r] = _rewardsList[r]; - unclaimedAmounts[r] += _assets[userAssetBalances[i].asset] - .rewards[rewardsList[r]] - .usersData[user] - .accrued; - - if (userAssetBalances[i].userBalance == 0) { - continue; - } - unclaimedAmounts[r] += _getPendingRewards(user, rewardsList[r], userAssetBalances[i]); - } - } - return (rewardsList, unclaimedAmounts); - } - - /// @inheritdoc IRewardsDistributor - function setDistributionEnd( - address asset, - address reward, - uint32 newDistributionEnd - ) external override onlyEmissionManager { - uint256 oldDistributionEnd = _assets[asset].rewards[reward].distributionEnd; - _assets[asset].rewards[reward].distributionEnd = newDistributionEnd; - - emit AssetConfigUpdated( - asset, - reward, - _assets[asset].rewards[reward].emissionPerSecond, - _assets[asset].rewards[reward].emissionPerSecond, - oldDistributionEnd, - newDistributionEnd, - _assets[asset].rewards[reward].index - ); - } - - /// @inheritdoc IRewardsDistributor - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external override onlyEmissionManager { - require(rewards.length == newEmissionsPerSecond.length, 'INVALID_INPUT'); - for (uint256 i = 0; i < rewards.length; i++) { - RewardsDataTypes.AssetData storage assetConfig = _assets[asset]; - RewardsDataTypes.RewardData storage rewardConfig = _assets[asset].rewards[rewards[i]]; - uint256 decimals = assetConfig.decimals; - require( - decimals != 0 && rewardConfig.lastUpdateTimestamp != 0, - 'DISTRIBUTION_DOES_NOT_EXIST' - ); - - (uint256 newIndex, ) = _updateRewardData( - rewardConfig, - IScaledBalanceToken(asset).scaledTotalSupply(), - 10 ** decimals - ); - - uint256 oldEmissionPerSecond = rewardConfig.emissionPerSecond; - rewardConfig.emissionPerSecond = newEmissionsPerSecond[i]; - - emit AssetConfigUpdated( - asset, - rewards[i], - oldEmissionPerSecond, - newEmissionsPerSecond[i], - rewardConfig.distributionEnd, - rewardConfig.distributionEnd, - newIndex - ); - } - } - - /** - * @dev Configure the _assets for a specific emission - * @param rewardsInput The array of each asset configuration - **/ - function _configureAssets(RewardsDataTypes.RewardsConfigInput[] memory rewardsInput) internal { - for (uint256 i = 0; i < rewardsInput.length; i++) { - if (_assets[rewardsInput[i].asset].decimals == 0) { - //never initialized before, adding to the list of assets - _assetsList.push(rewardsInput[i].asset); - } - - uint256 decimals = _assets[rewardsInput[i].asset].decimals = IERC20Detailed( - rewardsInput[i].asset - ).decimals(); - - RewardsDataTypes.RewardData storage rewardConfig = _assets[rewardsInput[i].asset].rewards[ - rewardsInput[i].reward - ]; - - // Add reward address to asset available rewards if latestUpdateTimestamp is zero - if (rewardConfig.lastUpdateTimestamp == 0) { - _assets[rewardsInput[i].asset].availableRewards[ - _assets[rewardsInput[i].asset].availableRewardsCount - ] = rewardsInput[i].reward; - _assets[rewardsInput[i].asset].availableRewardsCount++; - } - - // Add reward address to global rewards list if still not enabled - if (_isRewardEnabled[rewardsInput[i].reward] == false) { - _isRewardEnabled[rewardsInput[i].reward] = true; - _rewardsList.push(rewardsInput[i].reward); - } - - // Due emissions is still zero, updates only latestUpdateTimestamp - (uint256 newIndex, ) = _updateRewardData( - rewardConfig, - rewardsInput[i].totalSupply, - 10 ** decimals - ); - - // Configure emission and distribution end of the reward per asset - uint88 oldEmissionsPerSecond = rewardConfig.emissionPerSecond; - uint32 oldDistributionEnd = rewardConfig.distributionEnd; - rewardConfig.emissionPerSecond = rewardsInput[i].emissionPerSecond; - rewardConfig.distributionEnd = rewardsInput[i].distributionEnd; - - emit AssetConfigUpdated( - rewardsInput[i].asset, - rewardsInput[i].reward, - oldEmissionsPerSecond, - rewardsInput[i].emissionPerSecond, - oldDistributionEnd, - rewardsInput[i].distributionEnd, - newIndex - ); - } - } - - /** - * @dev Updates the state of the distribution for the specified reward - * @param rewardData Storage pointer to the distribution reward config - * @param totalSupply Current total of underlying assets for this distribution - * @param assetUnit One unit of asset (10**decimals) - * @return The new distribution index - * @return True if the index was updated, false otherwise - **/ - function _updateRewardData( - RewardsDataTypes.RewardData storage rewardData, - uint256 totalSupply, - uint256 assetUnit - ) internal returns (uint256, bool) { - (uint256 oldIndex, uint256 newIndex) = _getAssetIndex(rewardData, totalSupply, assetUnit); - bool indexUpdated; - if (newIndex != oldIndex) { - require(newIndex <= type(uint104).max, 'INDEX_OVERFLOW'); - indexUpdated = true; - - //optimization: storing one after another saves one SSTORE - rewardData.index = uint104(newIndex); - rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); - } else { - rewardData.lastUpdateTimestamp = block.timestamp.toUint32(); - } - - return (newIndex, indexUpdated); - } - - /** - * @dev Updates the state of the distribution for the specific user - * @param rewardData Storage pointer to the distribution reward config - * @param user The address of the user - * @param userBalance The user balance of the asset - * @param newAssetIndex The new index of the asset distribution - * @param assetUnit One unit of asset (10**decimals) - * @return The rewards accrued since the last update - **/ - function _updateUserData( - RewardsDataTypes.RewardData storage rewardData, - address user, - uint256 userBalance, - uint256 newAssetIndex, - uint256 assetUnit - ) internal returns (uint256, bool) { - uint256 userIndex = rewardData.usersData[user].index; - uint256 rewardsAccrued; - bool dataUpdated; - if ((dataUpdated = userIndex != newAssetIndex)) { - // already checked for overflow in _updateRewardData - rewardData.usersData[user].index = uint104(newAssetIndex); - if (userBalance != 0) { - rewardsAccrued = _getRewards(userBalance, newAssetIndex, userIndex, assetUnit); - - rewardData.usersData[user].accrued += rewardsAccrued.toUint128(); - } - } - return (rewardsAccrued, dataUpdated); - } - - /** - * @dev Iterates and accrues all the rewards for asset of the specific user - * @param asset The address of the reference asset of the distribution - * @param user The user address - * @param userBalance The current user asset balance - * @param totalSupply Total supply of the asset - **/ - function _updateData( - address asset, - address user, - uint256 userBalance, - uint256 totalSupply - ) internal { - uint256 assetUnit; - uint256 numAvailableRewards = _assets[asset].availableRewardsCount; - unchecked { - assetUnit = 10 ** _assets[asset].decimals; - } - - if (numAvailableRewards == 0) { - return; - } - unchecked { - for (uint128 r = 0; r < numAvailableRewards; r++) { - address reward = _assets[asset].availableRewards[r]; - RewardsDataTypes.RewardData storage rewardData = _assets[asset].rewards[reward]; - - (uint256 newAssetIndex, bool rewardDataUpdated) = _updateRewardData( - rewardData, - totalSupply, - assetUnit - ); - - (uint256 rewardsAccrued, bool userDataUpdated) = _updateUserData( - rewardData, - user, - userBalance, - newAssetIndex, - assetUnit - ); - - if (rewardDataUpdated || userDataUpdated) { - emit Accrued(asset, reward, user, newAssetIndex, newAssetIndex, rewardsAccrued); - } - } - } - } - - /** - * @dev Accrues all the rewards of the assets specified in the userAssetBalances list - * @param user The address of the user - * @param userAssetBalances List of structs with the user balance and total supply of a set of assets - **/ - function _updateDataMultiple( - address user, - RewardsDataTypes.UserAssetBalance[] memory userAssetBalances - ) internal { - for (uint256 i = 0; i < userAssetBalances.length; i++) { - _updateData( - userAssetBalances[i].asset, - user, - userAssetBalances[i].userBalance, - userAssetBalances[i].totalSupply - ); - } - } - - /** - * @dev Return the accrued unclaimed amount of a reward from a user over a list of distribution - * @param user The address of the user - * @param reward The address of the reward token - * @param userAssetBalances List of structs with the user balance and total supply of a set of assets - * @return unclaimedRewards The accrued rewards for the user until the moment - **/ - function _getUserReward( - address user, - address reward, - RewardsDataTypes.UserAssetBalance[] memory userAssetBalances - ) internal view returns (uint256 unclaimedRewards) { - // Add unrealized rewards - for (uint256 i = 0; i < userAssetBalances.length; i++) { - if (userAssetBalances[i].userBalance == 0) { - unclaimedRewards += _assets[userAssetBalances[i].asset] - .rewards[reward] - .usersData[user] - .accrued; - } else { - unclaimedRewards += - _getPendingRewards(user, reward, userAssetBalances[i]) + - _assets[userAssetBalances[i].asset].rewards[reward].usersData[user].accrued; - } - } - - return unclaimedRewards; - } - - /** - * @dev Calculates the pending (not yet accrued) rewards since the last user action - * @param user The address of the user - * @param reward The address of the reward token - * @param userAssetBalance struct with the user balance and total supply of the incentivized asset - * @return The pending rewards for the user since the last user action - **/ - function _getPendingRewards( - address user, - address reward, - RewardsDataTypes.UserAssetBalance memory userAssetBalance - ) internal view returns (uint256) { - RewardsDataTypes.RewardData storage rewardData = _assets[userAssetBalance.asset].rewards[ - reward - ]; - uint256 assetUnit = 10 ** _assets[userAssetBalance.asset].decimals; - (, uint256 nextIndex) = _getAssetIndex(rewardData, userAssetBalance.totalSupply, assetUnit); - - return - _getRewards( - userAssetBalance.userBalance, - nextIndex, - rewardData.usersData[user].index, - assetUnit - ); - } - - /** - * @dev Internal function for the calculation of user's rewards on a distribution - * @param userBalance Balance of the user asset on a distribution - * @param reserveIndex Current index of the distribution - * @param userIndex Index stored for the user, representation his staking moment - * @param assetUnit One unit of asset (10**decimals) - * @return The rewards - **/ - function _getRewards( - uint256 userBalance, - uint256 reserveIndex, - uint256 userIndex, - uint256 assetUnit - ) internal pure returns (uint256) { - uint256 result = userBalance * (reserveIndex - userIndex); - assembly { - result := div(result, assetUnit) - } - return result; - } - - /** - * @dev Calculates the next value of an specific distribution index, with validations - * @param rewardData Storage pointer to the distribution reward config - * @param totalSupply of the asset being rewarded - * @param assetUnit One unit of asset (10**decimals) - * @return The new index. - **/ - function _getAssetIndex( - RewardsDataTypes.RewardData storage rewardData, - uint256 totalSupply, - uint256 assetUnit - ) internal view returns (uint256, uint256) { - uint256 oldIndex = rewardData.index; - uint256 distributionEnd = rewardData.distributionEnd; - uint256 emissionPerSecond = rewardData.emissionPerSecond; - uint256 lastUpdateTimestamp = rewardData.lastUpdateTimestamp; - - if ( - emissionPerSecond == 0 || - totalSupply == 0 || - lastUpdateTimestamp == block.timestamp || - lastUpdateTimestamp >= distributionEnd - ) { - return (oldIndex, oldIndex); - } - - uint256 currentTimestamp = block.timestamp > distributionEnd - ? distributionEnd - : block.timestamp; - uint256 timeDelta = currentTimestamp - lastUpdateTimestamp; - uint256 firstTerm = emissionPerSecond * timeDelta * assetUnit; - assembly { - firstTerm := div(firstTerm, totalSupply) - } - return (oldIndex, (firstTerm + oldIndex)); - } - - /** - * @dev Get user balances and total supply of all the assets specified by the assets parameter - * @param assets List of assets to retrieve user balance and total supply - * @param user Address of the user - * @return userAssetBalances contains a list of structs with user balance and total supply of the given assets - */ - function _getUserAssetBalances( - address[] calldata assets, - address user - ) internal view virtual returns (RewardsDataTypes.UserAssetBalance[] memory userAssetBalances); - - /// @inheritdoc IRewardsDistributor - function getAssetDecimals(address asset) external view returns (uint8) { - return _assets[asset].decimals; - } - - /// @inheritdoc IRewardsDistributor - function getEmissionManager() external view returns (address) { - return EMISSION_MANAGER; - } -} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsController.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsController.sol deleted file mode 100644 index cdb2ac29..00000000 --- a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsController.sol +++ /dev/null @@ -1,203 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IRewardsDistributor} from './IRewardsDistributor.sol'; -import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; -import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; - -/** - * @title IRewardsController - * @author Aave - * @notice Defines the basic interface for a Rewards Controller. - */ -interface IRewardsController is IRewardsDistributor { - /** - * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user - * @param user The address of the user - * @param claimer The address of the claimer - */ - event ClaimerSet(address indexed user, address indexed claimer); - - /** - * @dev Emitted when rewards are claimed - * @param user The address of the user rewards has been claimed on behalf of - * @param reward The address of the token reward is claimed - * @param to The address of the receiver of the rewards - * @param claimer The address of the claimer - * @param amount The amount of rewards claimed - */ - event RewardsClaimed( - address indexed user, - address indexed reward, - address indexed to, - address claimer, - uint256 amount - ); - - /** - * @dev Emitted when a transfer strategy is installed for the reward distribution - * @param reward The address of the token reward - * @param transferStrategy The address of TransferStrategy contract - */ - event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); - - /** - * @dev Emitted when the reward oracle is updated - * @param reward The address of the token reward - * @param rewardOracle The address of oracle - */ - event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Get the price aggregator oracle address - * @param reward The address of the reward - * @return The price oracle of the reward - */ - function getRewardOracle(address reward) external view returns (address); - - /** - * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) - * @param user The address of the user - * @return The claimer address - */ - function getClaimer(address user) external view returns (address); - - /** - * @dev Returns the Transfer Strategy implementation contract address being used for a reward address - * @param reward The address of the reward - * @return The address of the TransferStrategy contract - */ - function getTransferStrategy(address reward) external view returns (address); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - **/ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - - /** - * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The - * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external returns (uint256); - - /** - * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" - **/ - function claimAllRewards( - address[] calldata assets, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must - * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsToSelf( - address[] calldata assets - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); -} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsDistributor.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsDistributor.sol deleted file mode 100644 index 5cb58856..00000000 --- a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/IRewardsDistributor.sol +++ /dev/null @@ -1,177 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title IRewardsDistributor - * @author Aave - * @notice Defines the basic interface for a Rewards Distributor. - */ -interface IRewardsDistributor { - /** - * @dev Emitted when the configuration of the rewards of an asset is updated. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param oldEmission The old emissions per second value of the reward distribution - * @param newEmission The new emissions per second value of the reward distribution - * @param oldDistributionEnd The old end timestamp of the reward distribution - * @param newDistributionEnd The new end timestamp of the reward distribution - * @param assetIndex The index of the asset distribution - */ - event AssetConfigUpdated( - address indexed asset, - address indexed reward, - uint256 oldEmission, - uint256 newEmission, - uint256 oldDistributionEnd, - uint256 newDistributionEnd, - uint256 assetIndex - ); - - /** - * @dev Emitted when rewards of an asset are accrued on behalf of a user. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param user The address of the user that rewards are accrued on behalf of - * @param assetIndex The index of the asset distribution - * @param userIndex The index of the asset distribution on behalf of the user - * @param rewardsAccrued The amount of rewards accrued - */ - event Accrued( - address indexed asset, - address indexed reward, - address indexed user, - uint256 assetIndex, - uint256 userIndex, - uint256 rewardsAccrued - ); - - /** - * @dev Sets the end date for the distribution - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Gets the end date for the distribution - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The timestamp with the end of the distribution, in unix time format - **/ - function getDistributionEnd(address asset, address reward) external view returns (uint256); - - /** - * @dev Returns the index of a user on a reward distribution - * @param user Address of the user - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The current user asset index, not including new distributions - **/ - function getUserAssetIndex( - address user, - address asset, - address reward - ) external view returns (uint256); - - /** - * @dev Returns the configuration of the distribution reward for a certain asset - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The index of the asset distribution - * @return The emission per second of the reward distribution - * @return The timestamp of the last update of the index - * @return The timestamp of the distribution end - **/ - function getRewardsData( - address asset, - address reward - ) external view returns (uint256, uint256, uint256, uint256); - - /** - * @dev Calculates the next value of an specific distribution index, with validations. - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The old index of the asset distribution - * @return The new index of the asset distribution - **/ - function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); - - /** - * @dev Returns the list of available reward token addresses of an incentivized asset - * @param asset The incentivized asset - * @return List of rewards addresses of the input asset - **/ - function getRewardsByAsset(address asset) external view returns (address[] memory); - - /** - * @dev Returns the list of available reward addresses - * @return List of rewards supported in this contract - **/ - function getRewardsList() external view returns (address[] memory); - - /** - * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. - * @param user The address of the user - * @param reward The address of the reward token - * @return Unclaimed rewards, not including new distributions - **/ - function getUserAccruedRewards(address user, address reward) external view returns (uint256); - - /** - * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @param reward The address of the reward token - * @return The rewards amount - **/ - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view returns (uint256); - - /** - * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @return The list of reward addresses - * @return The list of unclaimed amount of rewards - **/ - function getAllUserRewards( - address[] calldata assets, - address user - ) external view returns (address[] memory, uint256[] memory); - - /** - * @dev Returns the decimals of an asset to calculate the distribution delta - * @param asset The address to retrieve decimals - * @return The decimals of an underlying asset - */ - function getAssetDecimals(address asset) external view returns (uint8); - - /** - * @dev Returns the address of the emission manager - * @return The address of the EmissionManager - */ - function EMISSION_MANAGER() external view returns (address); - - /** - * @dev Returns the address of the emission manager. - * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. - * @return The address of the EmissionManager - */ - function getEmissionManager() external view returns (address); -} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/ITransferStrategyBase.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/ITransferStrategyBase.sol deleted file mode 100644 index d2848fef..00000000 --- a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/interfaces/ITransferStrategyBase.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -interface ITransferStrategyBase { - event EmergencyWithdrawal( - address indexed caller, - address indexed token, - address indexed to, - uint256 amount - ); - - /** - * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation - * @param to Account to transfer rewards - * @param reward Address of the reward token - * @param amount Amount to transfer to the "to" address parameter - * @return Returns true bool if transfer logic succeeds - */ - function performTransfer(address to, address reward, uint256 amount) external returns (bool); - - /** - * @return Returns the address of the Incentives Controller - */ - function getIncentivesController() external view returns (address); - - /** - * @return Returns the address of the Rewards admin - */ - function getRewardsAdmin() external view returns (address); - - /** - * @dev Perform an emergency token withdrawal only callable by the Rewards admin - * @param token Address of the token to withdraw funds from this contract - * @param to Address of the recipient of the withdrawal - * @param amount Amount of the withdrawal - */ - function emergencyWithdrawal(address token, address to, uint256 amount) external; -} diff --git a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/libraries/RewardsDataTypes.sol b/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/libraries/RewardsDataTypes.sol deleted file mode 100644 index 38fe87c5..00000000 --- a/downloads/LINEA/DEFAULT_INCENTIVES_CONTROLLER_IMPL/RewardsController/src/contracts/rewards/libraries/RewardsDataTypes.sol +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; - -library RewardsDataTypes { - struct RewardsConfigInput { - uint88 emissionPerSecond; - uint256 totalSupply; - uint32 distributionEnd; - address asset; - address reward; - ITransferStrategyBase transferStrategy; - IEACAggregatorProxy rewardOracle; - } - - struct UserAssetBalance { - address asset; - uint256 userBalance; - uint256 totalSupply; - } - - struct UserData { - // Liquidity index of the reward distribution for the user - uint104 index; - // Amount of accrued rewards for the user since last user index update - uint128 accrued; - } - - struct RewardData { - // Liquidity index of the reward distribution - uint104 index; - // Amount of reward tokens distributed per second - uint88 emissionPerSecond; - // Timestamp of the last reward index update - uint32 lastUpdateTimestamp; - // The end of the distribution of rewards (in seconds) - uint32 distributionEnd; - // Map of user addresses and their rewards data (userAddress => userData) - mapping(address => UserData) usersData; - } - - struct AssetData { - // Map of reward token addresses and their data (rewardTokenAddress => rewardData) - mapping(address => RewardData) rewards; - // List of reward token addresses for the asset - mapping(uint128 => address) availableRewards; - // Count of reward tokens for the asset - uint128 availableRewardsCount; - // Number of decimals of the asset - uint8 decimals; - } -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol deleted file mode 100644 index 1be027ab..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL.sol +++ /dev/null @@ -1,3230 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/ICreditDelegationToken.sol - -/** - * @title ICreditDelegationToken - * @author Aave - * @notice Defines the basic interface for a token supporting credit delegation. - */ -interface ICreditDelegationToken { - /** - * @dev Emitted on `approveDelegation` and `borrowAllowance - * @param fromUser The address of the delegator - * @param toUser The address of the delegatee - * @param asset The address of the delegated asset - * @param amount The amount being delegated - */ - event BorrowAllowanceDelegated( - address indexed fromUser, - address indexed toUser, - address indexed asset, - uint256 amount - ); - - /** - * @notice Delegates borrowing power to a user on the specific debt token. - * Delegation will still respect the liquidation constraints (even if delegated, a - * delegatee cannot force a delegator HF to go below 1) - * @param delegatee The address receiving the delegated borrowing power - * @param amount The maximum amount being delegated. - */ - function approveDelegation(address delegatee, uint256 amount) external; - - /** - * @notice Returns the borrow allowance of the user - * @param fromUser The user to giving allowance - * @param toUser The user to give allowance to - * @return The current allowance of `toUser` - */ - function borrowAllowance(address fromUser, address toUser) external view returns (uint256); - - /** - * @notice Delegates borrowing power to a user on the specific debt token via ERC712 signature - * @param delegator The delegator of the credit - * @param delegatee The delegatee that can use the credit - * @param value The amount to be delegated - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v The V signature param - * @param s The S signature param - * @param r The R signature param - */ - function delegationWithSig( - address delegator, - address delegatee, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol - -/** - * @title EIP712Base - * @author Aave - * @notice Base contract implementation of EIP712. - */ -abstract contract EIP712Base { - bytes public constant EIP712_REVISION = bytes('1'); - bytes32 internal constant EIP712_DOMAIN = - keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); - - // Map of address nonces (address => nonce) - mapping(address => uint256) internal _nonces; - - bytes32 internal _domainSeparator; - uint256 internal immutable _chainId; - - /** - * @dev Constructor. - */ - constructor() { - _chainId = block.chainid; - } - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { - if (block.chainid == _chainId) { - return _domainSeparator; - } - return _calculateDomainSeparator(); - } - - /** - * @notice Returns the nonce value for address specified as parameter - * @param owner The address for which the nonce is being returned - * @return The nonce value for the input address` - */ - function nonces(address owner) public view virtual returns (uint256) { - return _nonces[owner]; - } - - /** - * @notice Compute the current domain separator - * @return The domain separator for the token - */ - function _calculateDomainSeparator() internal view returns (bytes32) { - return - keccak256( - abi.encode( - EIP712_DOMAIN, - keccak256(bytes(_EIP712BaseId())), - keccak256(EIP712_REVISION), - block.chainid, - address(this) - ) - ); - } - - /** - * @notice Returns the user readable name of signing domain (e.g. token name) - * @return The name of the signing domain - */ - function _EIP712BaseId() internal view virtual returns (string memory); -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/DebtTokenBase.sol - -/** - * @title DebtTokenBase - * @author Aave - * @notice Base contract for different types of debt tokens, like VariableDebtToken - */ -abstract contract DebtTokenBase is - VersionedInitializable, - EIP712Base, - Context, - ICreditDelegationToken -{ - // Map of borrow allowances (delegator => delegatee => borrowAllowanceAmount) - mapping(address => mapping(address => uint256)) internal _borrowAllowances; - - // Credit Delegation Typehash - bytes32 public constant DELEGATION_WITH_SIG_TYPEHASH = - keccak256('DelegationWithSig(address delegatee,uint256 value,uint256 nonce,uint256 deadline)'); - - address internal _underlyingAsset; - - /** - * @dev Constructor. - */ - constructor() EIP712Base() { - // Intentionally left blank - } - - /// @inheritdoc ICreditDelegationToken - function approveDelegation(address delegatee, uint256 amount) external override { - _approveDelegation(_msgSender(), delegatee, amount); - } - - /// @inheritdoc ICreditDelegationToken - function delegationWithSig( - address delegator, - address delegatee, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external { - require(delegator != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - //solium-disable-next-line - require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); - uint256 currentValidNonce = _nonces[delegator]; - bytes32 digest = keccak256( - abi.encodePacked( - '\x19\x01', - DOMAIN_SEPARATOR(), - keccak256( - abi.encode(DELEGATION_WITH_SIG_TYPEHASH, delegatee, value, currentValidNonce, deadline) - ) - ) - ); - require(delegator == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); - _nonces[delegator] = currentValidNonce + 1; - _approveDelegation(delegator, delegatee, value); - } - - /// @inheritdoc ICreditDelegationToken - function borrowAllowance( - address fromUser, - address toUser - ) external view override returns (uint256) { - return _borrowAllowances[fromUser][toUser]; - } - - /** - * @notice Updates the borrow allowance of a user on the specific debt token. - * @param delegator The address delegating the borrowing power - * @param delegatee The address receiving the delegated borrowing power - * @param amount The allowance amount being delegated. - */ - function _approveDelegation(address delegator, address delegatee, uint256 amount) internal { - _borrowAllowances[delegator][delegatee] = amount; - emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, amount); - } - - /** - * @notice Decreases the borrow allowance of a user on the specific debt token. - * @param delegator The address delegating the borrowing power - * @param delegatee The address receiving the delegated borrowing power - * @param amount The amount to subtract from the current allowance - */ - function _decreaseBorrowAllowance(address delegator, address delegatee, uint256 amount) internal { - uint256 newAllowance = _borrowAllowances[delegator][delegatee] - amount; - - _borrowAllowances[delegator][delegatee] = newAllowance; - - emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, newAllowance); - } -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol - -/** - * @title MintableIncentivizedERC20 - * @author Aave - * @notice Implements mint and burn functions for IncentivizedERC20 - */ -abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) IncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /** - * @notice Mints tokens to an account and apply incentives if defined - * @param account The address receiving tokens - * @param amount The amount of tokens to mint - */ - function _mint(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply + amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } - - /** - * @notice Burns tokens from an account and apply incentives if defined - * @param account The account whose tokens are burnt - * @param amount The amount of tokens to burn - */ - function _burn(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply - amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance - amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol - -/** - * @title ScaledBalanceTokenBase - * @author Aave - * @notice Basic ERC20 implementation of scaled balance token - */ -abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) MintableIncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /// @inheritdoc IScaledBalanceToken - function scaledBalanceOf(address user) external view override returns (uint256) { - return super.balanceOf(user); - } - - /// @inheritdoc IScaledBalanceToken - function getScaledUserBalanceAndSupply( - address user - ) external view override returns (uint256, uint256) { - return (super.balanceOf(user), super.totalSupply()); - } - - /// @inheritdoc IScaledBalanceToken - function scaledTotalSupply() public view virtual override returns (uint256) { - return super.totalSupply(); - } - - /// @inheritdoc IScaledBalanceToken - function getPreviousIndex(address user) external view virtual override returns (uint256) { - return _userState[user].additionalData; - } - - /** - * @notice Implements the basic logic to mint a scaled balance token. - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the scaled tokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function _mintScaled( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) internal returns (bool) { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); - - uint256 scaledBalance = super.balanceOf(onBehalfOf); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[onBehalfOf].additionalData); - - _userState[onBehalfOf].additionalData = index.toUint128(); - - _mint(onBehalfOf, amountScaled.toUint128()); - - uint256 amountToMint = amount + balanceIncrease; - emit Transfer(address(0), onBehalfOf, amountToMint); - emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); - - return (scaledBalance == 0); - } - - /** - * @notice Implements the basic logic to burn a scaled balance token. - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param user The user which debt is burnt - * @param target The address that will receive the underlying, if any - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - */ - function _burnScaled(address user, address target, uint256 amount, uint256 index) internal { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); - - uint256 scaledBalance = super.balanceOf(user); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[user].additionalData); - - _userState[user].additionalData = index.toUint128(); - - _burn(user, amountScaled.toUint128()); - - if (balanceIncrease > amount) { - uint256 amountToMint = balanceIncrease - amount; - emit Transfer(address(0), user, amountToMint); - emit Mint(user, user, amountToMint, balanceIncrease, index); - } else { - uint256 amountToBurn = amount - balanceIncrease; - emit Transfer(user, address(0), amountToBurn); - emit Burn(user, target, amountToBurn, balanceIncrease, index); - } - } - - /** - * @notice Implements the basic logic to transfer scaled balance tokens between two users - * @dev It emits a mint event with the interest accrued per user - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - * @param index The next liquidity index of the reserve - */ - function _transfer(address sender, address recipient, uint256 amount, uint256 index) internal { - uint256 senderScaledBalance = super.balanceOf(sender); - uint256 senderBalanceIncrease = senderScaledBalance.rayMul(index) - - senderScaledBalance.rayMul(_userState[sender].additionalData); - - uint256 recipientScaledBalance = super.balanceOf(recipient); - uint256 recipientBalanceIncrease = recipientScaledBalance.rayMul(index) - - recipientScaledBalance.rayMul(_userState[recipient].additionalData); - - _userState[sender].additionalData = index.toUint128(); - _userState[recipient].additionalData = index.toUint128(); - - super._transfer(sender, recipient, amount.rayDiv(index).toUint128()); - - if (senderBalanceIncrease > 0) { - emit Transfer(address(0), sender, senderBalanceIncrease); - emit Mint(_msgSender(), sender, senderBalanceIncrease, senderBalanceIncrease, index); - } - - if (sender != recipient && recipientBalanceIncrease > 0) { - emit Transfer(address(0), recipient, recipientBalanceIncrease); - emit Mint(_msgSender(), recipient, recipientBalanceIncrease, recipientBalanceIncrease, index); - } - - emit Transfer(sender, recipient, amount); - } -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/VariableDebtToken.sol - -/** - * @title VariableDebtToken - * @author Aave - * @notice Implements a variable debt token to track the borrowing positions of users - * at variable rate mode - * @dev Transfer and approve functionalities are disabled since its a non-transferable token - */ -abstract contract VariableDebtToken is DebtTokenBase, ScaledBalanceTokenBase, IVariableDebtToken { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Constructor. - * @param pool The address of the Pool contract - */ - constructor( - IPool pool - ) - DebtTokenBase() - ScaledBalanceTokenBase(pool, 'VARIABLE_DEBT_TOKEN_IMPL', 'VARIABLE_DEBT_TOKEN_IMPL', 0) - { - // Intentionally left blank - } - - /// @inheritdoc IInitializableDebtToken - function initialize( - IPool initializingPool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external virtual; - - /// @inheritdoc IERC20 - function balanceOf(address user) public view virtual override returns (uint256) { - uint256 scaledBalance = super.balanceOf(user); - - if (scaledBalance == 0) { - return 0; - } - - return scaledBalance.rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); - } - - /// @inheritdoc IVariableDebtToken - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external virtual override onlyPool returns (bool, uint256) { - if (user != onBehalfOf) { - _decreaseBorrowAllowance(onBehalfOf, user, amount); - } - return (_mintScaled(user, onBehalfOf, amount, index), scaledTotalSupply()); - } - - /// @inheritdoc IVariableDebtToken - function burn( - address from, - uint256 amount, - uint256 index - ) external virtual override onlyPool returns (uint256) { - _burnScaled(from, address(0), amount, index); - return scaledTotalSupply(); - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return super.totalSupply().rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); - } - - /// @inheritdoc EIP712Base - function _EIP712BaseId() internal view override returns (string memory) { - return name(); - } - - /** - * @dev Being non transferrable, the debt token does not implement any of the - * standard ERC20 functions for transfer and allowance. - */ - function transfer(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function allowance(address, address) external view virtual override returns (uint256) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function approve(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function transferFrom(address, address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function increaseAllowance(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function decreaseAllowance(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - /// @inheritdoc IVariableDebtToken - function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { - return _underlyingAsset; - } -} - -// downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/instances/VariableDebtTokenInstance.sol - -contract VariableDebtTokenInstance is VariableDebtToken { - uint256 public constant DEBT_TOKEN_REVISION = 1; - - constructor(IPool pool) VariableDebtToken(pool) {} - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return DEBT_TOKEN_REVISION; - } - - /// @inheritdoc IInitializableDebtToken - function initialize( - IPool initializingPool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external override initializer { - require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); - _setName(debtTokenName); - _setSymbol(debtTokenSymbol); - _setDecimals(debtTokenDecimals); - - _underlyingAsset = underlyingAsset; - _incentivesController = incentivesController; - - _domainSeparator = _calculateDomainSeparator(); - - emit Initialized( - underlyingAsset, - address(POOL), - address(incentivesController), - debtTokenDecimals, - debtTokenName, - debtTokenSymbol, - params - ); - } -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/instances/VariableDebtTokenInstance.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/instances/VariableDebtTokenInstance.sol deleted file mode 100644 index eeb2f71a..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/instances/VariableDebtTokenInstance.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {VariableDebtToken, IPool, IInitializableDebtToken, VersionedInitializable, IAaveIncentivesController, Errors} from '../protocol/tokenization/VariableDebtToken.sol'; - -contract VariableDebtTokenInstance is VariableDebtToken { - uint256 public constant DEBT_TOKEN_REVISION = 1; - - constructor(IPool pool) VariableDebtToken(pool) {} - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return DEBT_TOKEN_REVISION; - } - - /// @inheritdoc IInitializableDebtToken - function initialize( - IPool initializingPool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external override initializer { - require(initializingPool == POOL, Errors.POOL_ADDRESSES_DO_NOT_MATCH); - _setName(debtTokenName); - _setSymbol(debtTokenSymbol); - _setDecimals(debtTokenDecimals); - - _underlyingAsset = underlyingAsset; - _incentivesController = incentivesController; - - _domainSeparator = _calculateDomainSeparator(); - - emit Initialized( - underlyingAsset, - address(POOL), - address(incentivesController), - debtTokenDecimals, - debtTokenName, - debtTokenSymbol, - params - ); - } -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/ICreditDelegationToken.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/ICreditDelegationToken.sol deleted file mode 100644 index 8fc17a22..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/ICreditDelegationToken.sol +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title ICreditDelegationToken - * @author Aave - * @notice Defines the basic interface for a token supporting credit delegation. - */ -interface ICreditDelegationToken { - /** - * @dev Emitted on `approveDelegation` and `borrowAllowance - * @param fromUser The address of the delegator - * @param toUser The address of the delegatee - * @param asset The address of the delegated asset - * @param amount The amount being delegated - */ - event BorrowAllowanceDelegated( - address indexed fromUser, - address indexed toUser, - address indexed asset, - uint256 amount - ); - - /** - * @notice Delegates borrowing power to a user on the specific debt token. - * Delegation will still respect the liquidation constraints (even if delegated, a - * delegatee cannot force a delegator HF to go below 1) - * @param delegatee The address receiving the delegated borrowing power - * @param amount The maximum amount being delegated. - */ - function approveDelegation(address delegatee, uint256 amount) external; - - /** - * @notice Returns the borrow allowance of the user - * @param fromUser The user to giving allowance - * @param toUser The user to give allowance to - * @return The current allowance of `toUser` - */ - function borrowAllowance(address fromUser, address toUser) external view returns (uint256); - - /** - * @notice Delegates borrowing power to a user on the specific debt token via ERC712 signature - * @param delegator The delegator of the credit - * @param delegatee The delegatee that can use the credit - * @param value The amount to be delegated - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v The V signature param - * @param s The S signature param - * @param r The R signature param - */ - function delegationWithSig( - address delegator, - address delegatee, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPool.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol deleted file mode 100644 index 1070227a..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/VariableDebtToken.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/VariableDebtToken.sol deleted file mode 100644 index 37494c85..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/VariableDebtToken.sol +++ /dev/null @@ -1,128 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {SafeCast} from '../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {VersionedInitializable} from '../../misc/aave-upgradeability/VersionedInitializable.sol'; -import {WadRayMath} from '../libraries/math/WadRayMath.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; -import {IPool} from '../../interfaces/IPool.sol'; -import {IAaveIncentivesController} from '../../interfaces/IAaveIncentivesController.sol'; -import {IInitializableDebtToken} from '../../interfaces/IInitializableDebtToken.sol'; -import {IVariableDebtToken} from '../../interfaces/IVariableDebtToken.sol'; -import {EIP712Base} from './base/EIP712Base.sol'; -import {DebtTokenBase} from './base/DebtTokenBase.sol'; -import {ScaledBalanceTokenBase} from './base/ScaledBalanceTokenBase.sol'; - -/** - * @title VariableDebtToken - * @author Aave - * @notice Implements a variable debt token to track the borrowing positions of users - * at variable rate mode - * @dev Transfer and approve functionalities are disabled since its a non-transferable token - */ -abstract contract VariableDebtToken is DebtTokenBase, ScaledBalanceTokenBase, IVariableDebtToken { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Constructor. - * @param pool The address of the Pool contract - */ - constructor( - IPool pool - ) - DebtTokenBase() - ScaledBalanceTokenBase(pool, 'VARIABLE_DEBT_TOKEN_IMPL', 'VARIABLE_DEBT_TOKEN_IMPL', 0) - { - // Intentionally left blank - } - - /// @inheritdoc IInitializableDebtToken - function initialize( - IPool initializingPool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external virtual; - - /// @inheritdoc IERC20 - function balanceOf(address user) public view virtual override returns (uint256) { - uint256 scaledBalance = super.balanceOf(user); - - if (scaledBalance == 0) { - return 0; - } - - return scaledBalance.rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); - } - - /// @inheritdoc IVariableDebtToken - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external virtual override onlyPool returns (bool, uint256) { - if (user != onBehalfOf) { - _decreaseBorrowAllowance(onBehalfOf, user, amount); - } - return (_mintScaled(user, onBehalfOf, amount, index), scaledTotalSupply()); - } - - /// @inheritdoc IVariableDebtToken - function burn( - address from, - uint256 amount, - uint256 index - ) external virtual override onlyPool returns (uint256) { - _burnScaled(from, address(0), amount, index); - return scaledTotalSupply(); - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return super.totalSupply().rayMul(POOL.getReserveNormalizedVariableDebt(_underlyingAsset)); - } - - /// @inheritdoc EIP712Base - function _EIP712BaseId() internal view override returns (string memory) { - return name(); - } - - /** - * @dev Being non transferrable, the debt token does not implement any of the - * standard ERC20 functions for transfer and allowance. - */ - function transfer(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function allowance(address, address) external view virtual override returns (uint256) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function approve(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function transferFrom(address, address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function increaseAllowance(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - function decreaseAllowance(address, uint256) external virtual override returns (bool) { - revert(Errors.OPERATION_NOT_SUPPORTED); - } - - /// @inheritdoc IVariableDebtToken - function UNDERLYING_ASSET_ADDRESS() external view override returns (address) { - return _underlyingAsset; - } -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/DebtTokenBase.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/DebtTokenBase.sol deleted file mode 100644 index 626b6d8b..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/DebtTokenBase.sol +++ /dev/null @@ -1,102 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {VersionedInitializable} from '../../../misc/aave-upgradeability/VersionedInitializable.sol'; -import {ICreditDelegationToken} from '../../../interfaces/ICreditDelegationToken.sol'; -import {EIP712Base} from './EIP712Base.sol'; - -/** - * @title DebtTokenBase - * @author Aave - * @notice Base contract for different types of debt tokens, like VariableDebtToken - */ -abstract contract DebtTokenBase is - VersionedInitializable, - EIP712Base, - Context, - ICreditDelegationToken -{ - // Map of borrow allowances (delegator => delegatee => borrowAllowanceAmount) - mapping(address => mapping(address => uint256)) internal _borrowAllowances; - - // Credit Delegation Typehash - bytes32 public constant DELEGATION_WITH_SIG_TYPEHASH = - keccak256('DelegationWithSig(address delegatee,uint256 value,uint256 nonce,uint256 deadline)'); - - address internal _underlyingAsset; - - /** - * @dev Constructor. - */ - constructor() EIP712Base() { - // Intentionally left blank - } - - /// @inheritdoc ICreditDelegationToken - function approveDelegation(address delegatee, uint256 amount) external override { - _approveDelegation(_msgSender(), delegatee, amount); - } - - /// @inheritdoc ICreditDelegationToken - function delegationWithSig( - address delegator, - address delegatee, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external { - require(delegator != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - //solium-disable-next-line - require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION); - uint256 currentValidNonce = _nonces[delegator]; - bytes32 digest = keccak256( - abi.encodePacked( - '\x19\x01', - DOMAIN_SEPARATOR(), - keccak256( - abi.encode(DELEGATION_WITH_SIG_TYPEHASH, delegatee, value, currentValidNonce, deadline) - ) - ) - ); - require(delegator == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE); - _nonces[delegator] = currentValidNonce + 1; - _approveDelegation(delegator, delegatee, value); - } - - /// @inheritdoc ICreditDelegationToken - function borrowAllowance( - address fromUser, - address toUser - ) external view override returns (uint256) { - return _borrowAllowances[fromUser][toUser]; - } - - /** - * @notice Updates the borrow allowance of a user on the specific debt token. - * @param delegator The address delegating the borrowing power - * @param delegatee The address receiving the delegated borrowing power - * @param amount The allowance amount being delegated. - */ - function _approveDelegation(address delegator, address delegatee, uint256 amount) internal { - _borrowAllowances[delegator][delegatee] = amount; - emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, amount); - } - - /** - * @notice Decreases the borrow allowance of a user on the specific debt token. - * @param delegator The address delegating the borrowing power - * @param delegatee The address receiving the delegated borrowing power - * @param amount The amount to subtract from the current allowance - */ - function _decreaseBorrowAllowance(address delegator, address delegatee, uint256 amount) internal { - uint256 newAllowance = _borrowAllowances[delegator][delegatee] - amount; - - _borrowAllowances[delegator][delegatee] = newAllowance; - - emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, newAllowance); - } -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol deleted file mode 100644 index 97abc425..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/EIP712Base.sol +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title EIP712Base - * @author Aave - * @notice Base contract implementation of EIP712. - */ -abstract contract EIP712Base { - bytes public constant EIP712_REVISION = bytes('1'); - bytes32 internal constant EIP712_DOMAIN = - keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); - - // Map of address nonces (address => nonce) - mapping(address => uint256) internal _nonces; - - bytes32 internal _domainSeparator; - uint256 internal immutable _chainId; - - /** - * @dev Constructor. - */ - constructor() { - _chainId = block.chainid; - } - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { - if (block.chainid == _chainId) { - return _domainSeparator; - } - return _calculateDomainSeparator(); - } - - /** - * @notice Returns the nonce value for address specified as parameter - * @param owner The address for which the nonce is being returned - * @return The nonce value for the input address` - */ - function nonces(address owner) public view virtual returns (uint256) { - return _nonces[owner]; - } - - /** - * @notice Compute the current domain separator - * @return The domain separator for the token - */ - function _calculateDomainSeparator() internal view returns (bytes32) { - return - keccak256( - abi.encode( - EIP712_DOMAIN, - keccak256(bytes(_EIP712BaseId())), - keccak256(EIP712_REVISION), - block.chainid, - address(this) - ) - ); - } - - /** - * @notice Returns the user readable name of signing domain (e.g. token name) - * @return The name of the signing domain - */ - function _EIP712BaseId() internal view virtual returns (string memory); -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol deleted file mode 100644 index b07b1673..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/MintableIncentivizedERC20.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IncentivizedERC20} from './IncentivizedERC20.sol'; - -/** - * @title MintableIncentivizedERC20 - * @author Aave - * @notice Implements mint and burn functions for IncentivizedERC20 - */ -abstract contract MintableIncentivizedERC20 is IncentivizedERC20 { - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) IncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /** - * @notice Mints tokens to an account and apply incentives if defined - * @param account The address receiving tokens - * @param amount The amount of tokens to mint - */ - function _mint(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply + amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } - - /** - * @notice Burns tokens from an account and apply incentives if defined - * @param account The account whose tokens are burnt - * @param amount The amount of tokens to burn - */ - function _burn(address account, uint128 amount) internal virtual { - uint256 oldTotalSupply = _totalSupply; - _totalSupply = oldTotalSupply - amount; - - uint128 oldAccountBalance = _userState[account].balance; - _userState[account].balance = oldAccountBalance - amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - - if (address(incentivesControllerLocal) != address(0)) { - incentivesControllerLocal.handleAction(account, oldTotalSupply, oldAccountBalance); - } - } -} diff --git a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol b/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol deleted file mode 100644 index a79d8917..00000000 --- a/downloads/LINEA/DEFAULT_VARIABLE_DEBT_TOKEN_IMPL/VariableDebtTokenInstance/src/contracts/protocol/tokenization/base/ScaledBalanceTokenBase.sol +++ /dev/null @@ -1,156 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {MintableIncentivizedERC20} from './MintableIncentivizedERC20.sol'; - -/** - * @title ScaledBalanceTokenBase - * @author Aave - * @notice Basic ERC20 implementation of scaled balance token - */ -abstract contract ScaledBalanceTokenBase is MintableIncentivizedERC20, IScaledBalanceToken { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name The name of the token - * @param symbol The symbol of the token - * @param decimals The number of decimals of the token - */ - constructor( - IPool pool, - string memory name, - string memory symbol, - uint8 decimals - ) MintableIncentivizedERC20(pool, name, symbol, decimals) { - // Intentionally left blank - } - - /// @inheritdoc IScaledBalanceToken - function scaledBalanceOf(address user) external view override returns (uint256) { - return super.balanceOf(user); - } - - /// @inheritdoc IScaledBalanceToken - function getScaledUserBalanceAndSupply( - address user - ) external view override returns (uint256, uint256) { - return (super.balanceOf(user), super.totalSupply()); - } - - /// @inheritdoc IScaledBalanceToken - function scaledTotalSupply() public view virtual override returns (uint256) { - return super.totalSupply(); - } - - /// @inheritdoc IScaledBalanceToken - function getPreviousIndex(address user) external view virtual override returns (uint256) { - return _userState[user].additionalData; - } - - /** - * @notice Implements the basic logic to mint a scaled balance token. - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the scaled tokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function _mintScaled( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) internal returns (bool) { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_MINT_AMOUNT); - - uint256 scaledBalance = super.balanceOf(onBehalfOf); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[onBehalfOf].additionalData); - - _userState[onBehalfOf].additionalData = index.toUint128(); - - _mint(onBehalfOf, amountScaled.toUint128()); - - uint256 amountToMint = amount + balanceIncrease; - emit Transfer(address(0), onBehalfOf, amountToMint); - emit Mint(caller, onBehalfOf, amountToMint, balanceIncrease, index); - - return (scaledBalance == 0); - } - - /** - * @notice Implements the basic logic to burn a scaled balance token. - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param user The user which debt is burnt - * @param target The address that will receive the underlying, if any - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - */ - function _burnScaled(address user, address target, uint256 amount, uint256 index) internal { - uint256 amountScaled = amount.rayDiv(index); - require(amountScaled != 0, Errors.INVALID_BURN_AMOUNT); - - uint256 scaledBalance = super.balanceOf(user); - uint256 balanceIncrease = scaledBalance.rayMul(index) - - scaledBalance.rayMul(_userState[user].additionalData); - - _userState[user].additionalData = index.toUint128(); - - _burn(user, amountScaled.toUint128()); - - if (balanceIncrease > amount) { - uint256 amountToMint = balanceIncrease - amount; - emit Transfer(address(0), user, amountToMint); - emit Mint(user, user, amountToMint, balanceIncrease, index); - } else { - uint256 amountToBurn = amount - balanceIncrease; - emit Transfer(user, address(0), amountToBurn); - emit Burn(user, target, amountToBurn, balanceIncrease, index); - } - } - - /** - * @notice Implements the basic logic to transfer scaled balance tokens between two users - * @dev It emits a mint event with the interest accrued per user - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - * @param index The next liquidity index of the reserve - */ - function _transfer(address sender, address recipient, uint256 amount, uint256 index) internal { - uint256 senderScaledBalance = super.balanceOf(sender); - uint256 senderBalanceIncrease = senderScaledBalance.rayMul(index) - - senderScaledBalance.rayMul(_userState[sender].additionalData); - - uint256 recipientScaledBalance = super.balanceOf(recipient); - uint256 recipientBalanceIncrease = recipientScaledBalance.rayMul(index) - - recipientScaledBalance.rayMul(_userState[recipient].additionalData); - - _userState[sender].additionalData = index.toUint128(); - _userState[recipient].additionalData = index.toUint128(); - - super._transfer(sender, recipient, amount.rayDiv(index).toUint128()); - - if (senderBalanceIncrease > 0) { - emit Transfer(address(0), sender, senderBalanceIncrease); - emit Mint(_msgSender(), sender, senderBalanceIncrease, senderBalanceIncrease, index); - } - - if (sender != recipient && recipientBalanceIncrease > 0) { - emit Transfer(address(0), recipient, recipientBalanceIncrease); - emit Mint(_msgSender(), recipient, recipientBalanceIncrease, recipientBalanceIncrease, index); - } - - emit Transfer(sender, recipient, amount); - } -} diff --git a/downloads/LINEA/EMISSION_MANAGER.sol b/downloads/LINEA/EMISSION_MANAGER.sol deleted file mode 100644 index 9de846c4..00000000 --- a/downloads/LINEA/EMISSION_MANAGER.sol +++ /dev/null @@ -1,789 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} - -// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsDistributor.sol - -/** - * @title IRewardsDistributor - * @author Aave - * @notice Defines the basic interface for a Rewards Distributor. - */ -interface IRewardsDistributor { - /** - * @dev Emitted when the configuration of the rewards of an asset is updated. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param oldEmission The old emissions per second value of the reward distribution - * @param newEmission The new emissions per second value of the reward distribution - * @param oldDistributionEnd The old end timestamp of the reward distribution - * @param newDistributionEnd The new end timestamp of the reward distribution - * @param assetIndex The index of the asset distribution - */ - event AssetConfigUpdated( - address indexed asset, - address indexed reward, - uint256 oldEmission, - uint256 newEmission, - uint256 oldDistributionEnd, - uint256 newDistributionEnd, - uint256 assetIndex - ); - - /** - * @dev Emitted when rewards of an asset are accrued on behalf of a user. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param user The address of the user that rewards are accrued on behalf of - * @param assetIndex The index of the asset distribution - * @param userIndex The index of the asset distribution on behalf of the user - * @param rewardsAccrued The amount of rewards accrued - */ - event Accrued( - address indexed asset, - address indexed reward, - address indexed user, - uint256 assetIndex, - uint256 userIndex, - uint256 rewardsAccrued - ); - - /** - * @dev Sets the end date for the distribution - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Gets the end date for the distribution - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The timestamp with the end of the distribution, in unix time format - **/ - function getDistributionEnd(address asset, address reward) external view returns (uint256); - - /** - * @dev Returns the index of a user on a reward distribution - * @param user Address of the user - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The current user asset index, not including new distributions - **/ - function getUserAssetIndex( - address user, - address asset, - address reward - ) external view returns (uint256); - - /** - * @dev Returns the configuration of the distribution reward for a certain asset - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The index of the asset distribution - * @return The emission per second of the reward distribution - * @return The timestamp of the last update of the index - * @return The timestamp of the distribution end - **/ - function getRewardsData( - address asset, - address reward - ) external view returns (uint256, uint256, uint256, uint256); - - /** - * @dev Calculates the next value of an specific distribution index, with validations. - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The old index of the asset distribution - * @return The new index of the asset distribution - **/ - function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); - - /** - * @dev Returns the list of available reward token addresses of an incentivized asset - * @param asset The incentivized asset - * @return List of rewards addresses of the input asset - **/ - function getRewardsByAsset(address asset) external view returns (address[] memory); - - /** - * @dev Returns the list of available reward addresses - * @return List of rewards supported in this contract - **/ - function getRewardsList() external view returns (address[] memory); - - /** - * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. - * @param user The address of the user - * @param reward The address of the reward token - * @return Unclaimed rewards, not including new distributions - **/ - function getUserAccruedRewards(address user, address reward) external view returns (uint256); - - /** - * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @param reward The address of the reward token - * @return The rewards amount - **/ - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view returns (uint256); - - /** - * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @return The list of reward addresses - * @return The list of unclaimed amount of rewards - **/ - function getAllUserRewards( - address[] calldata assets, - address user - ) external view returns (address[] memory, uint256[] memory); - - /** - * @dev Returns the decimals of an asset to calculate the distribution delta - * @param asset The address to retrieve decimals - * @return The decimals of an underlying asset - */ - function getAssetDecimals(address asset) external view returns (uint8); - - /** - * @dev Returns the address of the emission manager - * @return The address of the EmissionManager - */ - function EMISSION_MANAGER() external view returns (address); - - /** - * @dev Returns the address of the emission manager. - * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. - * @return The address of the EmissionManager - */ - function getEmissionManager() external view returns (address); -} - -// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/ITransferStrategyBase.sol - -interface ITransferStrategyBase { - event EmergencyWithdrawal( - address indexed caller, - address indexed token, - address indexed to, - uint256 amount - ); - - /** - * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation - * @param to Account to transfer rewards - * @param reward Address of the reward token - * @param amount Amount to transfer to the "to" address parameter - * @return Returns true bool if transfer logic succeeds - */ - function performTransfer(address to, address reward, uint256 amount) external returns (bool); - - /** - * @return Returns the address of the Incentives Controller - */ - function getIncentivesController() external view returns (address); - - /** - * @return Returns the address of the Rewards admin - */ - function getRewardsAdmin() external view returns (address); - - /** - * @dev Perform an emergency token withdrawal only callable by the Rewards admin - * @param token Address of the token to withdraw funds from this contract - * @param to Address of the recipient of the withdrawal - * @param amount Amount of the withdrawal - */ - function emergencyWithdrawal(address token, address to, uint256 amount) external; -} - -// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} - -// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/libraries/RewardsDataTypes.sol - -library RewardsDataTypes { - struct RewardsConfigInput { - uint88 emissionPerSecond; - uint256 totalSupply; - uint32 distributionEnd; - address asset; - address reward; - ITransferStrategyBase transferStrategy; - IEACAggregatorProxy rewardOracle; - } - - struct UserAssetBalance { - address asset; - uint256 userBalance; - uint256 totalSupply; - } - - struct UserData { - // Liquidity index of the reward distribution for the user - uint104 index; - // Amount of accrued rewards for the user since last user index update - uint128 accrued; - } - - struct RewardData { - // Liquidity index of the reward distribution - uint104 index; - // Amount of reward tokens distributed per second - uint88 emissionPerSecond; - // Timestamp of the last reward index update - uint32 lastUpdateTimestamp; - // The end of the distribution of rewards (in seconds) - uint32 distributionEnd; - // Map of user addresses and their rewards data (userAddress => userData) - mapping(address => UserData) usersData; - } - - struct AssetData { - // Map of reward token addresses and their data (rewardTokenAddress => rewardData) - mapping(address => RewardData) rewards; - // List of reward token addresses for the asset - mapping(uint128 => address) availableRewards; - // Count of reward tokens for the asset - uint128 availableRewardsCount; - // Number of decimals of the asset - uint8 decimals; - } -} - -// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsController.sol - -/** - * @title IRewardsController - * @author Aave - * @notice Defines the basic interface for a Rewards Controller. - */ -interface IRewardsController is IRewardsDistributor { - /** - * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user - * @param user The address of the user - * @param claimer The address of the claimer - */ - event ClaimerSet(address indexed user, address indexed claimer); - - /** - * @dev Emitted when rewards are claimed - * @param user The address of the user rewards has been claimed on behalf of - * @param reward The address of the token reward is claimed - * @param to The address of the receiver of the rewards - * @param claimer The address of the claimer - * @param amount The amount of rewards claimed - */ - event RewardsClaimed( - address indexed user, - address indexed reward, - address indexed to, - address claimer, - uint256 amount - ); - - /** - * @dev Emitted when a transfer strategy is installed for the reward distribution - * @param reward The address of the token reward - * @param transferStrategy The address of TransferStrategy contract - */ - event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); - - /** - * @dev Emitted when the reward oracle is updated - * @param reward The address of the token reward - * @param rewardOracle The address of oracle - */ - event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Get the price aggregator oracle address - * @param reward The address of the reward - * @return The price oracle of the reward - */ - function getRewardOracle(address reward) external view returns (address); - - /** - * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) - * @param user The address of the user - * @return The claimer address - */ - function getClaimer(address user) external view returns (address); - - /** - * @dev Returns the Transfer Strategy implementation contract address being used for a reward address - * @param reward The address of the reward - * @return The address of the TransferStrategy contract - */ - function getTransferStrategy(address reward) external view returns (address); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - **/ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - - /** - * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The - * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external returns (uint256); - - /** - * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" - **/ - function claimAllRewards( - address[] calldata assets, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must - * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsToSelf( - address[] calldata assets - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); -} - -// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IEmissionManager.sol - -/** - * @title IEmissionManager - * @author Aave - * @notice Defines the basic interface for the Emission Manager - */ -interface IEmissionManager { - /** - * @dev Emitted when the admin of a reward emission is updated. - * @param reward The address of the rewarding token - * @param oldAdmin The address of the old emission admin - * @param newAdmin The address of the new emission admin - */ - event EmissionAdminUpdated( - address indexed reward, - address indexed oldAdmin, - address indexed newAdmin - ); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @dev Only callable by the emission admin of the given rewards - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @dev Only callable by the emission admin of the given reward - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @dev Only callable by the emission admin of the given reward - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Sets the end date for the distribution - * @dev Only callable by the emission admin of the given reward - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @dev Only callable by the owner of the EmissionManager - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Updates the admin of the reward emission - * @dev Only callable by the owner of the EmissionManager - * @param reward The address of the reward token - * @param admin The address of the new admin of the emission - */ - function setEmissionAdmin(address reward, address admin) external; - - /** - * @dev Updates the address of the rewards controller - * @dev Only callable by the owner of the EmissionManager - * @param controller the address of the RewardsController contract - */ - function setRewardsController(address controller) external; - - /** - * @dev Returns the rewards controller address - * @return The address of the RewardsController contract - */ - function getRewardsController() external view returns (IRewardsController); - - /** - * @dev Returns the admin of the given reward emission - * @param reward The address of the reward token - * @return The address of the emission admin - */ - function getEmissionAdmin(address reward) external view returns (address); -} - -// downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/EmissionManager.sol - -/** - * @title EmissionManager - * @author Aave - * @notice It manages the list of admins of reward emissions and provides functions to control reward emissions. - */ -contract EmissionManager is Ownable, IEmissionManager { - // reward => emissionAdmin - mapping(address => address) internal _emissionAdmins; - - IRewardsController internal _rewardsController; - - /** - * @dev Only emission admin of the given reward can call functions marked by this modifier. - **/ - modifier onlyEmissionAdmin(address reward) { - require(msg.sender == _emissionAdmins[reward], 'ONLY_EMISSION_ADMIN'); - _; - } - - /** - * Constructor. - * @param owner The address of the owner - */ - constructor(address owner) { - transferOwnership(owner); - } - - /// @inheritdoc IEmissionManager - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external override { - for (uint256 i = 0; i < config.length; i++) { - require(_emissionAdmins[config[i].reward] == msg.sender, 'ONLY_EMISSION_ADMIN'); - } - _rewardsController.configureAssets(config); - } - - /// @inheritdoc IEmissionManager - function setTransferStrategy( - address reward, - ITransferStrategyBase transferStrategy - ) external override onlyEmissionAdmin(reward) { - _rewardsController.setTransferStrategy(reward, transferStrategy); - } - - /// @inheritdoc IEmissionManager - function setRewardOracle( - address reward, - IEACAggregatorProxy rewardOracle - ) external override onlyEmissionAdmin(reward) { - _rewardsController.setRewardOracle(reward, rewardOracle); - } - - /// @inheritdoc IEmissionManager - function setDistributionEnd( - address asset, - address reward, - uint32 newDistributionEnd - ) external override onlyEmissionAdmin(reward) { - _rewardsController.setDistributionEnd(asset, reward, newDistributionEnd); - } - - /// @inheritdoc IEmissionManager - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external override { - for (uint256 i = 0; i < rewards.length; i++) { - require(_emissionAdmins[rewards[i]] == msg.sender, 'ONLY_EMISSION_ADMIN'); - } - _rewardsController.setEmissionPerSecond(asset, rewards, newEmissionsPerSecond); - } - - /// @inheritdoc IEmissionManager - function setClaimer(address user, address claimer) external override onlyOwner { - _rewardsController.setClaimer(user, claimer); - } - - /// @inheritdoc IEmissionManager - function setEmissionAdmin(address reward, address admin) external override onlyOwner { - address oldAdmin = _emissionAdmins[reward]; - _emissionAdmins[reward] = admin; - emit EmissionAdminUpdated(reward, oldAdmin, admin); - } - - /// @inheritdoc IEmissionManager - function setRewardsController(address controller) external override onlyOwner { - _rewardsController = IRewardsController(controller); - } - - /// @inheritdoc IEmissionManager - function getRewardsController() external view override returns (IRewardsController) { - return _rewardsController; - } - - /// @inheritdoc IEmissionManager - function getEmissionAdmin(address reward) external view override returns (address) { - return _emissionAdmins[reward]; - } -} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol deleted file mode 100644 index 7917b722..00000000 --- a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -import './Context.sol'; - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol deleted file mode 100644 index c89baee6..00000000 --- a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/EmissionManager.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/EmissionManager.sol deleted file mode 100644 index b18473ff..00000000 --- a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/EmissionManager.sol +++ /dev/null @@ -1,109 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {Ownable} from '../dependencies/openzeppelin/contracts/Ownable.sol'; -import {IEACAggregatorProxy} from '../helpers/interfaces/IEACAggregatorProxy.sol'; -import {IEmissionManager} from './interfaces/IEmissionManager.sol'; -import {ITransferStrategyBase} from './interfaces/ITransferStrategyBase.sol'; -import {IRewardsController} from './interfaces/IRewardsController.sol'; -import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol'; - -/** - * @title EmissionManager - * @author Aave - * @notice It manages the list of admins of reward emissions and provides functions to control reward emissions. - */ -contract EmissionManager is Ownable, IEmissionManager { - // reward => emissionAdmin - mapping(address => address) internal _emissionAdmins; - - IRewardsController internal _rewardsController; - - /** - * @dev Only emission admin of the given reward can call functions marked by this modifier. - **/ - modifier onlyEmissionAdmin(address reward) { - require(msg.sender == _emissionAdmins[reward], 'ONLY_EMISSION_ADMIN'); - _; - } - - /** - * Constructor. - * @param owner The address of the owner - */ - constructor(address owner) { - transferOwnership(owner); - } - - /// @inheritdoc IEmissionManager - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external override { - for (uint256 i = 0; i < config.length; i++) { - require(_emissionAdmins[config[i].reward] == msg.sender, 'ONLY_EMISSION_ADMIN'); - } - _rewardsController.configureAssets(config); - } - - /// @inheritdoc IEmissionManager - function setTransferStrategy( - address reward, - ITransferStrategyBase transferStrategy - ) external override onlyEmissionAdmin(reward) { - _rewardsController.setTransferStrategy(reward, transferStrategy); - } - - /// @inheritdoc IEmissionManager - function setRewardOracle( - address reward, - IEACAggregatorProxy rewardOracle - ) external override onlyEmissionAdmin(reward) { - _rewardsController.setRewardOracle(reward, rewardOracle); - } - - /// @inheritdoc IEmissionManager - function setDistributionEnd( - address asset, - address reward, - uint32 newDistributionEnd - ) external override onlyEmissionAdmin(reward) { - _rewardsController.setDistributionEnd(asset, reward, newDistributionEnd); - } - - /// @inheritdoc IEmissionManager - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external override { - for (uint256 i = 0; i < rewards.length; i++) { - require(_emissionAdmins[rewards[i]] == msg.sender, 'ONLY_EMISSION_ADMIN'); - } - _rewardsController.setEmissionPerSecond(asset, rewards, newEmissionsPerSecond); - } - - /// @inheritdoc IEmissionManager - function setClaimer(address user, address claimer) external override onlyOwner { - _rewardsController.setClaimer(user, claimer); - } - - /// @inheritdoc IEmissionManager - function setEmissionAdmin(address reward, address admin) external override onlyOwner { - address oldAdmin = _emissionAdmins[reward]; - _emissionAdmins[reward] = admin; - emit EmissionAdminUpdated(reward, oldAdmin, admin); - } - - /// @inheritdoc IEmissionManager - function setRewardsController(address controller) external override onlyOwner { - _rewardsController = IRewardsController(controller); - } - - /// @inheritdoc IEmissionManager - function getRewardsController() external view override returns (IRewardsController) { - return _rewardsController; - } - - /// @inheritdoc IEmissionManager - function getEmissionAdmin(address reward) external view override returns (address) { - return _emissionAdmins[reward]; - } -} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IEmissionManager.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IEmissionManager.sol deleted file mode 100644 index 4853af21..00000000 --- a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IEmissionManager.sol +++ /dev/null @@ -1,118 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; -import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; -import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; -import {IRewardsController} from './IRewardsController.sol'; - -/** - * @title IEmissionManager - * @author Aave - * @notice Defines the basic interface for the Emission Manager - */ -interface IEmissionManager { - /** - * @dev Emitted when the admin of a reward emission is updated. - * @param reward The address of the rewarding token - * @param oldAdmin The address of the old emission admin - * @param newAdmin The address of the new emission admin - */ - event EmissionAdminUpdated( - address indexed reward, - address indexed oldAdmin, - address indexed newAdmin - ); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @dev Only callable by the emission admin of the given rewards - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @dev Only callable by the emission admin of the given reward - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @dev Only callable by the emission admin of the given reward - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Sets the end date for the distribution - * @dev Only callable by the emission admin of the given reward - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @dev Only callable by the owner of the EmissionManager - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Updates the admin of the reward emission - * @dev Only callable by the owner of the EmissionManager - * @param reward The address of the reward token - * @param admin The address of the new admin of the emission - */ - function setEmissionAdmin(address reward, address admin) external; - - /** - * @dev Updates the address of the rewards controller - * @dev Only callable by the owner of the EmissionManager - * @param controller the address of the RewardsController contract - */ - function setRewardsController(address controller) external; - - /** - * @dev Returns the rewards controller address - * @return The address of the RewardsController contract - */ - function getRewardsController() external view returns (IRewardsController); - - /** - * @dev Returns the admin of the given reward emission - * @param reward The address of the reward token - * @return The address of the emission admin - */ - function getEmissionAdmin(address reward) external view returns (address); -} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsController.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsController.sol deleted file mode 100644 index cdb2ac29..00000000 --- a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsController.sol +++ /dev/null @@ -1,203 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IRewardsDistributor} from './IRewardsDistributor.sol'; -import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; -import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; - -/** - * @title IRewardsController - * @author Aave - * @notice Defines the basic interface for a Rewards Controller. - */ -interface IRewardsController is IRewardsDistributor { - /** - * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user - * @param user The address of the user - * @param claimer The address of the claimer - */ - event ClaimerSet(address indexed user, address indexed claimer); - - /** - * @dev Emitted when rewards are claimed - * @param user The address of the user rewards has been claimed on behalf of - * @param reward The address of the token reward is claimed - * @param to The address of the receiver of the rewards - * @param claimer The address of the claimer - * @param amount The amount of rewards claimed - */ - event RewardsClaimed( - address indexed user, - address indexed reward, - address indexed to, - address claimer, - uint256 amount - ); - - /** - * @dev Emitted when a transfer strategy is installed for the reward distribution - * @param reward The address of the token reward - * @param transferStrategy The address of TransferStrategy contract - */ - event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); - - /** - * @dev Emitted when the reward oracle is updated - * @param reward The address of the token reward - * @param rewardOracle The address of oracle - */ - event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Get the price aggregator oracle address - * @param reward The address of the reward - * @return The price oracle of the reward - */ - function getRewardOracle(address reward) external view returns (address); - - /** - * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) - * @param user The address of the user - * @return The claimer address - */ - function getClaimer(address user) external view returns (address); - - /** - * @dev Returns the Transfer Strategy implementation contract address being used for a reward address - * @param reward The address of the reward - * @return The address of the TransferStrategy contract - */ - function getTransferStrategy(address reward) external view returns (address); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - **/ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - - /** - * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The - * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external returns (uint256); - - /** - * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" - **/ - function claimAllRewards( - address[] calldata assets, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must - * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsToSelf( - address[] calldata assets - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); -} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsDistributor.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsDistributor.sol deleted file mode 100644 index 5cb58856..00000000 --- a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/IRewardsDistributor.sol +++ /dev/null @@ -1,177 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title IRewardsDistributor - * @author Aave - * @notice Defines the basic interface for a Rewards Distributor. - */ -interface IRewardsDistributor { - /** - * @dev Emitted when the configuration of the rewards of an asset is updated. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param oldEmission The old emissions per second value of the reward distribution - * @param newEmission The new emissions per second value of the reward distribution - * @param oldDistributionEnd The old end timestamp of the reward distribution - * @param newDistributionEnd The new end timestamp of the reward distribution - * @param assetIndex The index of the asset distribution - */ - event AssetConfigUpdated( - address indexed asset, - address indexed reward, - uint256 oldEmission, - uint256 newEmission, - uint256 oldDistributionEnd, - uint256 newDistributionEnd, - uint256 assetIndex - ); - - /** - * @dev Emitted when rewards of an asset are accrued on behalf of a user. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param user The address of the user that rewards are accrued on behalf of - * @param assetIndex The index of the asset distribution - * @param userIndex The index of the asset distribution on behalf of the user - * @param rewardsAccrued The amount of rewards accrued - */ - event Accrued( - address indexed asset, - address indexed reward, - address indexed user, - uint256 assetIndex, - uint256 userIndex, - uint256 rewardsAccrued - ); - - /** - * @dev Sets the end date for the distribution - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Gets the end date for the distribution - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The timestamp with the end of the distribution, in unix time format - **/ - function getDistributionEnd(address asset, address reward) external view returns (uint256); - - /** - * @dev Returns the index of a user on a reward distribution - * @param user Address of the user - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The current user asset index, not including new distributions - **/ - function getUserAssetIndex( - address user, - address asset, - address reward - ) external view returns (uint256); - - /** - * @dev Returns the configuration of the distribution reward for a certain asset - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The index of the asset distribution - * @return The emission per second of the reward distribution - * @return The timestamp of the last update of the index - * @return The timestamp of the distribution end - **/ - function getRewardsData( - address asset, - address reward - ) external view returns (uint256, uint256, uint256, uint256); - - /** - * @dev Calculates the next value of an specific distribution index, with validations. - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The old index of the asset distribution - * @return The new index of the asset distribution - **/ - function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); - - /** - * @dev Returns the list of available reward token addresses of an incentivized asset - * @param asset The incentivized asset - * @return List of rewards addresses of the input asset - **/ - function getRewardsByAsset(address asset) external view returns (address[] memory); - - /** - * @dev Returns the list of available reward addresses - * @return List of rewards supported in this contract - **/ - function getRewardsList() external view returns (address[] memory); - - /** - * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. - * @param user The address of the user - * @param reward The address of the reward token - * @return Unclaimed rewards, not including new distributions - **/ - function getUserAccruedRewards(address user, address reward) external view returns (uint256); - - /** - * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @param reward The address of the reward token - * @return The rewards amount - **/ - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view returns (uint256); - - /** - * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @return The list of reward addresses - * @return The list of unclaimed amount of rewards - **/ - function getAllUserRewards( - address[] calldata assets, - address user - ) external view returns (address[] memory, uint256[] memory); - - /** - * @dev Returns the decimals of an asset to calculate the distribution delta - * @param asset The address to retrieve decimals - * @return The decimals of an underlying asset - */ - function getAssetDecimals(address asset) external view returns (uint8); - - /** - * @dev Returns the address of the emission manager - * @return The address of the EmissionManager - */ - function EMISSION_MANAGER() external view returns (address); - - /** - * @dev Returns the address of the emission manager. - * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. - * @return The address of the EmissionManager - */ - function getEmissionManager() external view returns (address); -} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/ITransferStrategyBase.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/ITransferStrategyBase.sol deleted file mode 100644 index d2848fef..00000000 --- a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/interfaces/ITransferStrategyBase.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -interface ITransferStrategyBase { - event EmergencyWithdrawal( - address indexed caller, - address indexed token, - address indexed to, - uint256 amount - ); - - /** - * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation - * @param to Account to transfer rewards - * @param reward Address of the reward token - * @param amount Amount to transfer to the "to" address parameter - * @return Returns true bool if transfer logic succeeds - */ - function performTransfer(address to, address reward, uint256 amount) external returns (bool); - - /** - * @return Returns the address of the Incentives Controller - */ - function getIncentivesController() external view returns (address); - - /** - * @return Returns the address of the Rewards admin - */ - function getRewardsAdmin() external view returns (address); - - /** - * @dev Perform an emergency token withdrawal only callable by the Rewards admin - * @param token Address of the token to withdraw funds from this contract - * @param to Address of the recipient of the withdrawal - * @param amount Amount of the withdrawal - */ - function emergencyWithdrawal(address token, address to, uint256 amount) external; -} diff --git a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/libraries/RewardsDataTypes.sol b/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/libraries/RewardsDataTypes.sol deleted file mode 100644 index 38fe87c5..00000000 --- a/downloads/LINEA/EMISSION_MANAGER/EmissionManager/src/contracts/rewards/libraries/RewardsDataTypes.sol +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; - -library RewardsDataTypes { - struct RewardsConfigInput { - uint88 emissionPerSecond; - uint256 totalSupply; - uint32 distributionEnd; - address asset; - address reward; - ITransferStrategyBase transferStrategy; - IEACAggregatorProxy rewardOracle; - } - - struct UserAssetBalance { - address asset; - uint256 userBalance; - uint256 totalSupply; - } - - struct UserData { - // Liquidity index of the reward distribution for the user - uint104 index; - // Amount of accrued rewards for the user since last user index update - uint128 accrued; - } - - struct RewardData { - // Liquidity index of the reward distribution - uint104 index; - // Amount of reward tokens distributed per second - uint88 emissionPerSecond; - // Timestamp of the last reward index update - uint32 lastUpdateTimestamp; - // The end of the distribution of rewards (in seconds) - uint32 distributionEnd; - // Map of user addresses and their rewards data (userAddress => userData) - mapping(address => UserData) usersData; - } - - struct AssetData { - // Map of reward token addresses and their data (rewardTokenAddress => rewardData) - mapping(address => RewardData) rewards; - // List of reward token addresses for the asset - mapping(uint128 => address) availableRewards; - // Count of reward tokens for the asset - uint128 availableRewardsCount; - // Number of decimals of the asset - uint8 decimals; - } -} diff --git a/downloads/LINEA/EMODE_LOGIC.sol b/downloads/LINEA/EMODE_LOGIC.sol deleted file mode 100644 index 948a894b..00000000 --- a/downloads/LINEA/EMODE_LOGIC.sol +++ /dev/null @@ -1,5536 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} - -// downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index e7ba8f7a..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index 647fc7e7..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index cd5b83c6..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index dd5c637d..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index e08a30e8..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index 9adca939..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/LINEA/EMODE_LOGIC/EModeLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC.sol b/downloads/LINEA/FLASHLOAN_LOGIC.sol deleted file mode 100644 index 639a33a3..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC.sol +++ /dev/null @@ -1,6143 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol - -/** - * @title IFlashLoanReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - */ -interface IFlashLoanReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed assets - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param assets The addresses of the flash-borrowed assets - * @param amounts The amounts of the flash-borrowed assets - * @param premiums The fee of each flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata premiums, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol - -/** - * @title IFlashLoanSimpleReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - */ -interface IFlashLoanSimpleReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed asset - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param asset The address of the flash-borrowed asset - * @param amount The amount of the flash-borrowed asset - * @param premium The fee of the flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address asset, - uint256 amount, - uint256 premium, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol - -/** - * @title BorrowLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to borrowing - */ -library BorrowLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the - * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the - * isolated debt. - * @dev Emits the `Borrow()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the borrow function - */ - function executeBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteBorrowParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ( - bool isolationModeActive, - address isolationModeCollateralAddress, - uint256 isolationModeDebtCeiling - ) = userConfig.getIsolationModeState(reservesData, reservesList); - - ValidationLogic.validateBorrow( - reservesData, - reservesList, - eModeCategories, - DataTypes.ValidateBorrowParams({ - reserveCache: reserveCache, - userConfig: userConfig, - asset: params.asset, - userAddress: params.onBehalfOf, - amount: params.amount, - interestRateMode: params.interestRateMode, - reservesCount: params.reservesCount, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory, - priceOracleSentinel: params.priceOracleSentinel, - isolationModeActive: isolationModeActive, - isolationModeCollateralAddress: isolationModeCollateralAddress, - isolationModeDebtCeiling: isolationModeDebtCeiling - }) - ); - - bool isFirstBorrowing = false; - - (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); - - if (isFirstBorrowing) { - userConfig.setBorrowing(reserve.id, true); - } - - if (isolationModeActive) { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt += (params.amount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - 0, - params.releaseUnderlying ? params.amount : 0 - ); - - if (params.releaseUnderlying) { - IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); - } - - emit Borrow( - params.asset, - params.user, - params.onBehalfOf, - params.amount, - DataTypes.InterestRateMode.VARIABLE, - reserve.currentVariableBorrowRate, - params.referralCode - ); - } - - /** - * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the - * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also - * reduces the isolated debt. - * @dev Emits the `Repay()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the repay function - * @return The actual amount being repaid - */ - function executeRepay( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteRepayParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - - uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( - params.onBehalfOf - ); - - ValidationLogic.validateRepay( - reserveCache, - params.amount, - params.interestRateMode, - params.onBehalfOf, - variableDebt - ); - - uint256 paybackAmount = variableDebt; - - // Allows a user to repay with aTokens without leaving dust from interest. - if (params.useATokens && params.amount == type(uint256).max) { - params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); - } - - if (params.amount < paybackAmount) { - paybackAmount = params.amount; - } - - reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) - .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - params.useATokens ? 0 : paybackAmount, - 0 - ); - - if (variableDebt - paybackAmount == 0) { - userConfig.setBorrowing(reserve.id, false); - } - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - reserveCache, - paybackAmount - ); - - if (params.useATokens) { - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - reserveCache.aTokenAddress, - paybackAmount, - reserveCache.nextLiquidityIndex - ); - // in case of aToken repayment the msg.sender must always repay on behalf of itself - if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - } else { - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); - IAToken(reserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.onBehalfOf, - paybackAmount - ); - } - - emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); - - return paybackAmount; - } -} - -// downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol - -/** - * @title FlashLoanLogic library - * @author Aave - * @notice Implements the logic for the flash loans - */ -library FlashLoanLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - - // See `IPool` for descriptions - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - // Helper struct for internal variables used in the `executeFlashLoan` function - struct FlashLoanLocalVars { - IFlashLoanReceiver receiver; - address currentAsset; - uint256 currentAmount; - uint256[] totalPremiums; - uint256 flashloanPremiumTotal; - uint256 flashloanPremiumToProtocol; - } - - /** - * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction - * as long as the amount taken plus fee is returned or debt is opened. - * @dev For authorized flashborrowers the fee is waived - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the flashloan function - */ - function executeFlashLoan( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.FlashloanParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); - - FlashLoanLocalVars memory vars; - - vars.totalPremiums = new uint256[](params.assets.length); - - vars.receiver = IFlashLoanReceiver(params.receiverAddress); - (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower - ? (0, 0) - : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); - - for (uint256 i = 0; i < params.assets.length; i++) { - vars.currentAmount = params.amounts[i]; - vars.totalPremiums[i] = DataTypes.InterestRateMode(params.interestRateModes[i]) == - DataTypes.InterestRateMode.NONE - ? vars.currentAmount.percentMul(vars.flashloanPremiumTotal) - : 0; - - if (reservesData[params.assets[i]].configuration.getIsVirtualAccActive()) { - reservesData[params.assets[i]].virtualUnderlyingBalance -= vars.currentAmount.toUint128(); - } - - IAToken(reservesData[params.assets[i]].aTokenAddress).transferUnderlyingTo( - params.receiverAddress, - vars.currentAmount - ); - } - - require( - vars.receiver.executeOperation( - params.assets, - params.amounts, - vars.totalPremiums, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - for (uint256 i = 0; i < params.assets.length; i++) { - vars.currentAsset = params.assets[i]; - vars.currentAmount = params.amounts[i]; - - if ( - DataTypes.InterestRateMode(params.interestRateModes[i]) == DataTypes.InterestRateMode.NONE - ) { - _handleFlashLoanRepayment( - reservesData[vars.currentAsset], - DataTypes.FlashLoanRepaymentParams({ - asset: vars.currentAsset, - receiverAddress: params.receiverAddress, - amount: vars.currentAmount, - totalPremium: vars.totalPremiums[i], - flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } else { - // If the user chose to not return the funds, the system checks if there is enough collateral and - // eventually opens a debt position - BorrowLogic.executeBorrow( - reservesData, - reservesList, - eModeCategories, - userConfig, - DataTypes.ExecuteBorrowParams({ - asset: vars.currentAsset, - user: msg.sender, - onBehalfOf: params.onBehalfOf, - amount: vars.currentAmount, - interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[i]), - referralCode: params.referralCode, - releaseUnderlying: false, - reservesCount: IPool(params.pool).getReservesCount(), - oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), - userEModeCategory: IPool(params.pool).getUserEMode(params.onBehalfOf).toUint8(), - priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) - .getPriceOracleSentinel() - }) - ); - // no premium is paid when taking on the flashloan as debt - emit FlashLoan( - params.receiverAddress, - msg.sender, - vars.currentAsset, - vars.currentAmount, - DataTypes.InterestRateMode(params.interestRateModes[i]), - 0, - params.referralCode - ); - } - } - } - - /** - * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one - * transaction as long as the amount taken plus fee is returned. - * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the simple flashloan function - */ - function executeFlashLoanSimple( - DataTypes.ReserveData storage reserve, - DataTypes.FlashloanSimpleParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloanSimple(reserve, params.amount); - - IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); - uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); - - if (reserve.configuration.getIsVirtualAccActive()) { - reserve.virtualUnderlyingBalance -= params.amount.toUint128(); - } - - IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); - - require( - receiver.executeOperation( - params.asset, - params.amount, - totalPremium, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - _handleFlashLoanRepayment( - reserve, - DataTypes.FlashLoanRepaymentParams({ - asset: params.asset, - receiverAddress: params.receiverAddress, - amount: params.amount, - totalPremium: totalPremium, - flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } - - /** - * @notice Handles repayment of flashloaned assets + premium - * @dev Will pull the amount + premium from the receiver, so must have approved pool - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the repayment function - */ - function _handleFlashLoanRepayment( - DataTypes.ReserveData storage reserve, - DataTypes.FlashLoanRepaymentParams memory params - ) internal { - uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); - uint256 premiumToLP = params.totalPremium - premiumToProtocol; - uint256 amountPlusPremium = params.amount + params.totalPremium; - - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply() + - uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), - premiumToLP - ); - - reserve.accruedToTreasury += premiumToProtocol - .rayDiv(reserveCache.nextLiquidityIndex) - .toUint128(); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, amountPlusPremium, 0); - - IERC20(params.asset).safeTransferFrom( - params.receiverAddress, - reserveCache.aTokenAddress, - amountPlusPremium - ); - - IAToken(reserveCache.aTokenAddress).handleRepayment( - params.receiverAddress, - params.receiverAddress, - amountPlusPremium - ); - - emit FlashLoan( - params.receiverAddress, - msg.sender, - params.asset, - params.amount, - DataTypes.InterestRateMode.NONE, - params.totalPremium, - params.referralCode - ); - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index e7ba8f7a..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol deleted file mode 100644 index a3a55684..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; - -/** - * @title IFlashLoanReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - */ -interface IFlashLoanReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed assets - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param assets The addresses of the flash-borrowed assets - * @param amounts The amounts of the flash-borrowed assets - * @param premiums The fee of each flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata premiums, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol deleted file mode 100644 index bff21ae4..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; - -/** - * @title IFlashLoanSimpleReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - */ -interface IFlashLoanSimpleReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed asset - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param asset The address of the flash-borrowed asset - * @param amount The amount of the flash-borrowed asset - * @param premium The fee of the flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address asset, - uint256 amount, - uint256 premium, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol deleted file mode 100644 index c4ed26ed..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/BorrowLogic.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {IsolationModeLogic} from './IsolationModeLogic.sol'; - -/** - * @title BorrowLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to borrowing - */ -library BorrowLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the - * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the - * isolated debt. - * @dev Emits the `Borrow()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the borrow function - */ - function executeBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteBorrowParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ( - bool isolationModeActive, - address isolationModeCollateralAddress, - uint256 isolationModeDebtCeiling - ) = userConfig.getIsolationModeState(reservesData, reservesList); - - ValidationLogic.validateBorrow( - reservesData, - reservesList, - eModeCategories, - DataTypes.ValidateBorrowParams({ - reserveCache: reserveCache, - userConfig: userConfig, - asset: params.asset, - userAddress: params.onBehalfOf, - amount: params.amount, - interestRateMode: params.interestRateMode, - reservesCount: params.reservesCount, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory, - priceOracleSentinel: params.priceOracleSentinel, - isolationModeActive: isolationModeActive, - isolationModeCollateralAddress: isolationModeCollateralAddress, - isolationModeDebtCeiling: isolationModeDebtCeiling - }) - ); - - bool isFirstBorrowing = false; - - (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); - - if (isFirstBorrowing) { - userConfig.setBorrowing(reserve.id, true); - } - - if (isolationModeActive) { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt += (params.amount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - 0, - params.releaseUnderlying ? params.amount : 0 - ); - - if (params.releaseUnderlying) { - IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); - } - - emit Borrow( - params.asset, - params.user, - params.onBehalfOf, - params.amount, - DataTypes.InterestRateMode.VARIABLE, - reserve.currentVariableBorrowRate, - params.referralCode - ); - } - - /** - * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the - * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also - * reduces the isolated debt. - * @dev Emits the `Repay()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the repay function - * @return The actual amount being repaid - */ - function executeRepay( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteRepayParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - - uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( - params.onBehalfOf - ); - - ValidationLogic.validateRepay( - reserveCache, - params.amount, - params.interestRateMode, - params.onBehalfOf, - variableDebt - ); - - uint256 paybackAmount = variableDebt; - - // Allows a user to repay with aTokens without leaving dust from interest. - if (params.useATokens && params.amount == type(uint256).max) { - params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); - } - - if (params.amount < paybackAmount) { - paybackAmount = params.amount; - } - - reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) - .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - params.useATokens ? 0 : paybackAmount, - 0 - ); - - if (variableDebt - paybackAmount == 0) { - userConfig.setBorrowing(reserve.id, false); - } - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - reserveCache, - paybackAmount - ); - - if (params.useATokens) { - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - reserveCache.aTokenAddress, - paybackAmount, - reserveCache.nextLiquidityIndex - ); - // in case of aToken repayment the msg.sender must always repay on behalf of itself - if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - } else { - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); - IAToken(reserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.onBehalfOf, - paybackAmount - ); - } - - emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); - - return paybackAmount; - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index 647fc7e7..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol deleted file mode 100644 index 31ffb288..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol +++ /dev/null @@ -1,277 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IFlashLoanReceiver} from '../../../misc/flashloan/interfaces/IFlashLoanReceiver.sol'; -import {IFlashLoanSimpleReceiver} from '../../../misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {BorrowLogic} from './BorrowLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title FlashLoanLogic library - * @author Aave - * @notice Implements the logic for the flash loans - */ -library FlashLoanLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - - // See `IPool` for descriptions - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - // Helper struct for internal variables used in the `executeFlashLoan` function - struct FlashLoanLocalVars { - IFlashLoanReceiver receiver; - address currentAsset; - uint256 currentAmount; - uint256[] totalPremiums; - uint256 flashloanPremiumTotal; - uint256 flashloanPremiumToProtocol; - } - - /** - * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction - * as long as the amount taken plus fee is returned or debt is opened. - * @dev For authorized flashborrowers the fee is waived - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the flashloan function - */ - function executeFlashLoan( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.FlashloanParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); - - FlashLoanLocalVars memory vars; - - vars.totalPremiums = new uint256[](params.assets.length); - - vars.receiver = IFlashLoanReceiver(params.receiverAddress); - (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower - ? (0, 0) - : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); - - for (uint256 i = 0; i < params.assets.length; i++) { - vars.currentAmount = params.amounts[i]; - vars.totalPremiums[i] = DataTypes.InterestRateMode(params.interestRateModes[i]) == - DataTypes.InterestRateMode.NONE - ? vars.currentAmount.percentMul(vars.flashloanPremiumTotal) - : 0; - - if (reservesData[params.assets[i]].configuration.getIsVirtualAccActive()) { - reservesData[params.assets[i]].virtualUnderlyingBalance -= vars.currentAmount.toUint128(); - } - - IAToken(reservesData[params.assets[i]].aTokenAddress).transferUnderlyingTo( - params.receiverAddress, - vars.currentAmount - ); - } - - require( - vars.receiver.executeOperation( - params.assets, - params.amounts, - vars.totalPremiums, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - for (uint256 i = 0; i < params.assets.length; i++) { - vars.currentAsset = params.assets[i]; - vars.currentAmount = params.amounts[i]; - - if ( - DataTypes.InterestRateMode(params.interestRateModes[i]) == DataTypes.InterestRateMode.NONE - ) { - _handleFlashLoanRepayment( - reservesData[vars.currentAsset], - DataTypes.FlashLoanRepaymentParams({ - asset: vars.currentAsset, - receiverAddress: params.receiverAddress, - amount: vars.currentAmount, - totalPremium: vars.totalPremiums[i], - flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } else { - // If the user chose to not return the funds, the system checks if there is enough collateral and - // eventually opens a debt position - BorrowLogic.executeBorrow( - reservesData, - reservesList, - eModeCategories, - userConfig, - DataTypes.ExecuteBorrowParams({ - asset: vars.currentAsset, - user: msg.sender, - onBehalfOf: params.onBehalfOf, - amount: vars.currentAmount, - interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[i]), - referralCode: params.referralCode, - releaseUnderlying: false, - reservesCount: IPool(params.pool).getReservesCount(), - oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), - userEModeCategory: IPool(params.pool).getUserEMode(params.onBehalfOf).toUint8(), - priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) - .getPriceOracleSentinel() - }) - ); - // no premium is paid when taking on the flashloan as debt - emit FlashLoan( - params.receiverAddress, - msg.sender, - vars.currentAsset, - vars.currentAmount, - DataTypes.InterestRateMode(params.interestRateModes[i]), - 0, - params.referralCode - ); - } - } - } - - /** - * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one - * transaction as long as the amount taken plus fee is returned. - * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the simple flashloan function - */ - function executeFlashLoanSimple( - DataTypes.ReserveData storage reserve, - DataTypes.FlashloanSimpleParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloanSimple(reserve, params.amount); - - IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); - uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); - - if (reserve.configuration.getIsVirtualAccActive()) { - reserve.virtualUnderlyingBalance -= params.amount.toUint128(); - } - - IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); - - require( - receiver.executeOperation( - params.asset, - params.amount, - totalPremium, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - _handleFlashLoanRepayment( - reserve, - DataTypes.FlashLoanRepaymentParams({ - asset: params.asset, - receiverAddress: params.receiverAddress, - amount: params.amount, - totalPremium: totalPremium, - flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } - - /** - * @notice Handles repayment of flashloaned assets + premium - * @dev Will pull the amount + premium from the receiver, so must have approved pool - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the repayment function - */ - function _handleFlashLoanRepayment( - DataTypes.ReserveData storage reserve, - DataTypes.FlashLoanRepaymentParams memory params - ) internal { - uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); - uint256 premiumToLP = params.totalPremium - premiumToProtocol; - uint256 amountPlusPremium = params.amount + params.totalPremium; - - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply() + - uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), - premiumToLP - ); - - reserve.accruedToTreasury += premiumToProtocol - .rayDiv(reserveCache.nextLiquidityIndex) - .toUint128(); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, amountPlusPremium, 0); - - IERC20(params.asset).safeTransferFrom( - params.receiverAddress, - reserveCache.aTokenAddress, - amountPlusPremium - ); - - IAToken(reserveCache.aTokenAddress).handleRepayment( - params.receiverAddress, - params.receiverAddress, - amountPlusPremium - ); - - emit FlashLoan( - params.receiverAddress, - msg.sender, - params.asset, - params.amount, - DataTypes.InterestRateMode.NONE, - params.totalPremium, - params.referralCode - ); - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index cd5b83c6..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol deleted file mode 100644 index 473840ea..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index dd5c637d..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index e08a30e8..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index 9adca939..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/LINEA/FLASHLOAN_LOGIC/FlashLoanLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/LINEA/L2_ENCODER.sol b/downloads/LINEA/L2_ENCODER.sol deleted file mode 100644 index 42a55800..00000000 --- a/downloads/LINEA/L2_ENCODER.sol +++ /dev/null @@ -1,1932 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/helpers/L2Encoder.sol - -/** - * @title L2Encoder - * @author Aave - * @notice Helper contract to encode calldata, used to optimize calldata size in L2Pool for transaction cost reduction - * only indented to help generate calldata for uses/frontends. - */ -contract L2Encoder { - using SafeCast for uint256; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The address of the Pool contract - */ - constructor(IPool pool) { - POOL = pool; - } - - /** - * @notice Encodes supply parameters from standard input to compact representation of 1 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param referralCode referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @return compact representation of supply parameters - */ - function encodeSupplyParams( - address asset, - uint256 amount, - uint16 referralCode - ) external view returns (bytes32) { - DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount.toUint128(); - bytes32 res; - - assembly { - res := add(assetId, add(shl(16, shortenedAmount), shl(144, referralCode))) - } - return res; - } - - /** - * @notice Encodes supplyWithPermit parameters from standard input to compact representation of 3 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param referralCode referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return compact representation of supplyWithPermit parameters - * @return The R parameter of ERC712 permit sig - * @return The S parameter of ERC712 permit sig - */ - function encodeSupplyWithPermitParams( - address asset, - uint256 amount, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external view returns (bytes32, bytes32, bytes32) { - DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount.toUint128(); - uint32 shortenedDeadline = deadline.toUint32(); - - bytes32 res; - assembly { - res := add( - assetId, - add( - shl(16, shortenedAmount), - add(shl(144, referralCode), add(shl(160, shortenedDeadline), shl(192, permitV))) - ) - ) - } - - return (res, permitR, permitS); - } - - /** - * @notice Encodes withdraw parameters from standard input to compact representation of 1 bytes32 - * @dev Without a to parameter as the compact calls to L2Pool will use msg.sender as to - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * @return compact representation of withdraw parameters - */ - function encodeWithdrawParams(address asset, uint256 amount) external view returns (bytes32) { - DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); - - bytes32 res; - assembly { - res := add(assetId, shl(16, shortenedAmount)) - } - return res; - } - - /** - * @notice Encodes borrow parameters from standard input to compact representation of 1 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode The interest rate mode at which the user wants to borrow: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @return compact representation of withdraw parameters - */ - function encodeBorrowParams( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode - ) external view returns (bytes32) { - DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount.toUint128(); - uint8 shortenedInterestRateMode = interestRateMode.toUint8(); - bytes32 res; - assembly { - res := add( - assetId, - add( - shl(16, shortenedAmount), - add(shl(144, shortenedInterestRateMode), shl(152, referralCode)) - ) - ) - } - return res; - } - - /** - * @notice Encodes repay parameters from standard input to compact representation of 1 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `interestRateMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @return compact representation of repay parameters - */ - function encodeRepayParams( - address asset, - uint256 amount, - uint256 interestRateMode - ) public view returns (bytes32) { - DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); - uint8 shortenedInterestRateMode = interestRateMode.toUint8(); - - bytes32 res; - assembly { - res := add(assetId, add(shl(16, shortenedAmount), shl(144, shortenedInterestRateMode))) - } - return res; - } - - /** - * @notice Encodes repayWithPermit parameters from standard input to compact representation of 3 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return compact representation of repayWithPermit parameters - * @return The R parameter of ERC712 permit sig - * @return The S parameter of ERC712 permit sig - */ - function encodeRepayWithPermitParams( - address asset, - uint256 amount, - uint256 interestRateMode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external view returns (bytes32, bytes32, bytes32) { - DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); - uint8 shortenedInterestRateMode = interestRateMode.toUint8(); - uint32 shortenedDeadline = deadline.toUint32(); - - bytes32 res; - assembly { - res := add( - assetId, - add( - shl(16, shortenedAmount), - add( - shl(144, shortenedInterestRateMode), - add(shl(152, shortenedDeadline), shl(184, permitV)) - ) - ) - ) - } - return (res, permitR, permitS); - } - - /** - * @notice Encodes repay with aToken parameters from standard input to compact representation of 1 bytes32 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @return compact representation of repay with aToken parameters - */ - function encodeRepayWithATokensParams( - address asset, - uint256 amount, - uint256 interestRateMode - ) external view returns (bytes32) { - return encodeRepayParams(asset, amount, interestRateMode); - } - - /** - * @notice Encodes set user use reserve as collateral parameters from standard input to compact representation of 1 bytes32 - * @param asset The address of the underlying asset borrowed - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - * @return compact representation of set user use reserve as collateral parameters - */ - function encodeSetUserUseReserveAsCollateral( - address asset, - bool useAsCollateral - ) external view returns (bytes32) { - DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - uint16 assetId = data.id; - bytes32 res; - assembly { - res := add(assetId, shl(16, useAsCollateral)) - } - return res; - } - - /** - * @notice Encodes liquidation call parameters from standard input to compact representation of 2 bytes32 - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - * @return First half ot compact representation of liquidation call parameters - * @return Second half ot compact representation of liquidation call parameters - */ - function encodeLiquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external view returns (bytes32, bytes32) { - DataTypes.ReserveDataLegacy memory collateralData = POOL.getReserveData(collateralAsset); - uint16 collateralAssetId = collateralData.id; - - DataTypes.ReserveDataLegacy memory debtData = POOL.getReserveData(debtAsset); - uint16 debtAssetId = debtData.id; - - uint128 shortenedDebtToCover = debtToCover == type(uint256).max - ? type(uint128).max - : debtToCover.toUint128(); - - bytes32 res1; - bytes32 res2; - - assembly { - res1 := add(add(collateralAssetId, shl(16, debtAssetId)), shl(32, user)) - res2 := add(shortenedDebtToCover, shl(128, receiveAToken)) - } - return (res1, res2); - } -} diff --git a/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/helpers/L2Encoder.sol b/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/helpers/L2Encoder.sol deleted file mode 100644 index 7c1bd96c..00000000 --- a/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/helpers/L2Encoder.sol +++ /dev/null @@ -1,296 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {SafeCast} from '../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IPool} from '../interfaces/IPool.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title L2Encoder - * @author Aave - * @notice Helper contract to encode calldata, used to optimize calldata size in L2Pool for transaction cost reduction - * only indented to help generate calldata for uses/frontends. - */ -contract L2Encoder { - using SafeCast for uint256; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The address of the Pool contract - */ - constructor(IPool pool) { - POOL = pool; - } - - /** - * @notice Encodes supply parameters from standard input to compact representation of 1 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param referralCode referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @return compact representation of supply parameters - */ - function encodeSupplyParams( - address asset, - uint256 amount, - uint16 referralCode - ) external view returns (bytes32) { - DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount.toUint128(); - bytes32 res; - - assembly { - res := add(assetId, add(shl(16, shortenedAmount), shl(144, referralCode))) - } - return res; - } - - /** - * @notice Encodes supplyWithPermit parameters from standard input to compact representation of 3 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param referralCode referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return compact representation of supplyWithPermit parameters - * @return The R parameter of ERC712 permit sig - * @return The S parameter of ERC712 permit sig - */ - function encodeSupplyWithPermitParams( - address asset, - uint256 amount, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external view returns (bytes32, bytes32, bytes32) { - DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount.toUint128(); - uint32 shortenedDeadline = deadline.toUint32(); - - bytes32 res; - assembly { - res := add( - assetId, - add( - shl(16, shortenedAmount), - add(shl(144, referralCode), add(shl(160, shortenedDeadline), shl(192, permitV))) - ) - ) - } - - return (res, permitR, permitS); - } - - /** - * @notice Encodes withdraw parameters from standard input to compact representation of 1 bytes32 - * @dev Without a to parameter as the compact calls to L2Pool will use msg.sender as to - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * @return compact representation of withdraw parameters - */ - function encodeWithdrawParams(address asset, uint256 amount) external view returns (bytes32) { - DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); - - bytes32 res; - assembly { - res := add(assetId, shl(16, shortenedAmount)) - } - return res; - } - - /** - * @notice Encodes borrow parameters from standard input to compact representation of 1 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode The interest rate mode at which the user wants to borrow: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @return compact representation of withdraw parameters - */ - function encodeBorrowParams( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode - ) external view returns (bytes32) { - DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount.toUint128(); - uint8 shortenedInterestRateMode = interestRateMode.toUint8(); - bytes32 res; - assembly { - res := add( - assetId, - add( - shl(16, shortenedAmount), - add(shl(144, shortenedInterestRateMode), shl(152, referralCode)) - ) - ) - } - return res; - } - - /** - * @notice Encodes repay parameters from standard input to compact representation of 1 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `interestRateMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @return compact representation of repay parameters - */ - function encodeRepayParams( - address asset, - uint256 amount, - uint256 interestRateMode - ) public view returns (bytes32) { - DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); - uint8 shortenedInterestRateMode = interestRateMode.toUint8(); - - bytes32 res; - assembly { - res := add(assetId, add(shl(16, shortenedAmount), shl(144, shortenedInterestRateMode))) - } - return res; - } - - /** - * @notice Encodes repayWithPermit parameters from standard input to compact representation of 3 bytes32 - * @dev Without an onBehalfOf parameter as the compact calls to L2Pool will use msg.sender as onBehalfOf - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return compact representation of repayWithPermit parameters - * @return The R parameter of ERC712 permit sig - * @return The S parameter of ERC712 permit sig - */ - function encodeRepayWithPermitParams( - address asset, - uint256 amount, - uint256 interestRateMode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external view returns (bytes32, bytes32, bytes32) { - DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - - uint16 assetId = data.id; - uint128 shortenedAmount = amount == type(uint256).max ? type(uint128).max : amount.toUint128(); - uint8 shortenedInterestRateMode = interestRateMode.toUint8(); - uint32 shortenedDeadline = deadline.toUint32(); - - bytes32 res; - assembly { - res := add( - assetId, - add( - shl(16, shortenedAmount), - add( - shl(144, shortenedInterestRateMode), - add(shl(152, shortenedDeadline), shl(184, permitV)) - ) - ) - ) - } - return (res, permitR, permitS); - } - - /** - * @notice Encodes repay with aToken parameters from standard input to compact representation of 1 bytes32 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode The interest rate mode at of the debt the user wants to repay: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @return compact representation of repay with aToken parameters - */ - function encodeRepayWithATokensParams( - address asset, - uint256 amount, - uint256 interestRateMode - ) external view returns (bytes32) { - return encodeRepayParams(asset, amount, interestRateMode); - } - - /** - * @notice Encodes set user use reserve as collateral parameters from standard input to compact representation of 1 bytes32 - * @param asset The address of the underlying asset borrowed - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - * @return compact representation of set user use reserve as collateral parameters - */ - function encodeSetUserUseReserveAsCollateral( - address asset, - bool useAsCollateral - ) external view returns (bytes32) { - DataTypes.ReserveDataLegacy memory data = POOL.getReserveData(asset); - uint16 assetId = data.id; - bytes32 res; - assembly { - res := add(assetId, shl(16, useAsCollateral)) - } - return res; - } - - /** - * @notice Encodes liquidation call parameters from standard input to compact representation of 2 bytes32 - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - * @return First half ot compact representation of liquidation call parameters - * @return Second half ot compact representation of liquidation call parameters - */ - function encodeLiquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external view returns (bytes32, bytes32) { - DataTypes.ReserveDataLegacy memory collateralData = POOL.getReserveData(collateralAsset); - uint16 collateralAssetId = collateralData.id; - - DataTypes.ReserveDataLegacy memory debtData = POOL.getReserveData(debtAsset); - uint16 debtAssetId = debtData.id; - - uint128 shortenedDebtToCover = debtToCover == type(uint256).max - ? type(uint128).max - : debtToCover.toUint128(); - - bytes32 res1; - bytes32 res2; - - assembly { - res1 := add(add(collateralAssetId, shl(16, debtAssetId)), shl(32, user)) - res2 := add(shortenedDebtToCover, shl(128, receiveAToken)) - } - return (res1, res2); - } -} diff --git a/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPool.sol b/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/L2_ENCODER/L2Encoder/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL.sol b/downloads/LINEA/L2_POOL_IMPL.sol deleted file mode 100644 index 8f4817d9..00000000 --- a/downloads/LINEA/L2_POOL_IMPL.sol +++ /dev/null @@ -1,8682 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IL2Pool.sol - -/** - * @title IL2Pool - * @author Aave - * @notice Defines the basic extension interface for an L2 Aave Pool. - */ -interface IL2Pool { - /** - * @notice Calldata efficient wrapper of the supply function on behalf of the caller - * @param args Arguments for the supply function packed in one bytes32 - * 96 bits 16 bits 128 bits 16 bits - * | 0-padding | referralCode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - */ - function supply(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the supplyWithPermit function on behalf of the caller - * @param args Arguments for the supply function packed in one bytes32 - * 56 bits 8 bits 32 bits 16 bits 128 bits 16 bits - * | 0-padding | permitV | shortenedDeadline | referralCode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @param r The R parameter of ERC712 permit sig - * @param s The S parameter of ERC712 permit sig - */ - function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s) external; - - /** - * @notice Calldata efficient wrapper of the withdraw function, withdrawing to the caller - * @param args Arguments for the withdraw function packed in one bytes32 - * 112 bits 128 bits 16 bits - * | 0-padding | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @return The final amount withdrawn - */ - function withdraw(bytes32 args) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the borrow function, borrowing on behalf of the caller - * @param args Arguments for the borrow function packed in one bytes32 - * 88 bits 16 bits 8 bits 128 bits 16 bits - * | 0-padding | referralCode | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - */ - function borrow(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the repay function, repaying on behalf of the caller - * @param args Arguments for the repay function packed in one bytes32 - * 104 bits 8 bits 128 bits 16 bits - * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @return The final amount repaid - */ - function repay(bytes32 args) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the repayWithPermit function, repaying on behalf of the caller - * @param args Arguments for the repayWithPermit function packed in one bytes32 - * 64 bits 8 bits 32 bits 8 bits 128 bits 16 bits - * | 0-padding | permitV | shortenedDeadline | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @param r The R parameter of ERC712 permit sig - * @param s The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the repayWithATokens function - * @param args Arguments for the repayWithATokens function packed in one bytes32 - * 104 bits 8 bits 128 bits 16 bits - * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @return The final amount repaid - */ - function repayWithATokens(bytes32 args) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the setUserUseReserveAsCollateral function - * @param args Arguments for the setUserUseReserveAsCollateral function packed in one bytes32 - * 239 bits 1 bit 16 bits - * | 0-padding | useAsCollateral | assetId | - * @dev assetId is the index of the asset in the reservesList. - */ - function setUserUseReserveAsCollateral(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the liquidationCall function - * @param args1 part of the arguments for the liquidationCall function packed in one bytes32 - * 64 bits 160 bits 16 bits 16 bits - * | 0-padding | user address | debtAssetId | collateralAssetId | - * @param args2 part of the arguments for the liquidationCall function packed in one bytes32 - * 127 bits 1 bit 128 bits - * | 0-padding | receiveAToken | shortenedDebtToCover | - * @dev the shortenedDebtToCover is cast to 256 bits at decode time, - * if type(uint128).max the value will be expanded to type(uint256).max - */ - function liquidationCall(bytes32 args1, bytes32 args2) external; -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/CalldataLogic.sol - -/** - * @title CalldataLogic library - * @author Aave - * @notice Library to decode calldata, used to optimize calldata size in L2Pool for transaction cost reduction - */ -library CalldataLogic { - /** - * @notice Decodes compressed supply params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed supply params - * @return The address of the underlying reserve - * @return The amount to supply - * @return The referralCode - */ - function decodeSupplyParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint16) { - uint16 assetId; - uint256 amount; - uint16 referralCode; - - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - referralCode := and(shr(144, args), 0xFFFF) - } - return (reservesList[assetId], amount, referralCode); - } - - /** - * @notice Decodes compressed supply params to standard params along with permit params - * @param reservesList The addresses of all the active reserves - * @param args The packed supply with permit params - * @return The address of the underlying reserve - * @return The amount to supply - * @return The referralCode - * @return The deadline of the permit - * @return The V value of the permit signature - */ - function decodeSupplyWithPermitParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint16, uint256, uint8) { - uint256 deadline; - uint8 permitV; - - assembly { - deadline := and(shr(160, args), 0xFFFFFFFF) - permitV := and(shr(192, args), 0xFF) - } - (address asset, uint256 amount, uint16 referralCode) = decodeSupplyParams(reservesList, args); - - return (asset, amount, referralCode, deadline, permitV); - } - - /** - * @notice Decodes compressed withdraw params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed withdraw params - * @return The address of the underlying reserve - * @return The amount to withdraw - */ - function decodeWithdrawParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256) { - uint16 assetId; - uint256 amount; - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - } - if (amount == type(uint128).max) { - amount = type(uint256).max; - } - return (reservesList[assetId], amount); - } - - /** - * @notice Decodes compressed borrow params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed borrow params - * @return The address of the underlying reserve - * @return The amount to borrow - * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) - * @return The referralCode - */ - function decodeBorrowParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint256, uint16) { - uint16 assetId; - uint256 amount; - uint256 interestRateMode; - uint16 referralCode; - - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - interestRateMode := and(shr(144, args), 0xFF) - referralCode := and(shr(152, args), 0xFFFF) - } - - return (reservesList[assetId], amount, interestRateMode, referralCode); - } - - /** - * @notice Decodes compressed repay params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed repay params - * @return The address of the underlying reserve - * @return The amount to repay - * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) - */ - function decodeRepayParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint256) { - uint16 assetId; - uint256 amount; - uint256 interestRateMode; - - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - interestRateMode := and(shr(144, args), 0xFF) - } - - if (amount == type(uint128).max) { - amount = type(uint256).max; - } - - return (reservesList[assetId], amount, interestRateMode); - } - - /** - * @notice Decodes compressed repay params to standard params along with permit params - * @param reservesList The addresses of all the active reserves - * @param args The packed repay with permit params - * @return The address of the underlying reserve - * @return The amount to repay - * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) - * @return The deadline of the permit - * @return The V value of the permit signature - */ - function decodeRepayWithPermitParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint256, uint256, uint8) { - uint256 deadline; - uint8 permitV; - - (address asset, uint256 amount, uint256 interestRateMode) = decodeRepayParams( - reservesList, - args - ); - - assembly { - deadline := and(shr(152, args), 0xFFFFFFFF) - permitV := and(shr(184, args), 0xFF) - } - - return (asset, amount, interestRateMode, deadline, permitV); - } - - /** - * @notice Decodes compressed set user use reserve as collateral params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed set user use reserve as collateral params - * @return The address of the underlying reserve - * @return True if to set using as collateral, false otherwise - */ - function decodeSetUserUseReserveAsCollateralParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, bool) { - uint16 assetId; - bool useAsCollateral; - assembly { - assetId := and(args, 0xFFFF) - useAsCollateral := and(shr(16, args), 0x1) - } - return (reservesList[assetId], useAsCollateral); - } - - /** - * @notice Decodes compressed liquidation call params to standard params - * @param reservesList The addresses of all the active reserves - * @param args1 The first half of packed liquidation call params - * @param args2 The second half of the packed liquidation call params - * @return The address of the underlying collateral asset - * @return The address of the underlying debt asset - * @return The address of the user to liquidate - * @return The amount of debt to cover - * @return True if receiving aTokens, false otherwise - */ - function decodeLiquidationCallParams( - mapping(uint256 => address) storage reservesList, - bytes32 args1, - bytes32 args2 - ) internal view returns (address, address, address, uint256, bool) { - uint16 collateralAssetId; - uint16 debtAssetId; - address user; - uint256 debtToCover; - bool receiveAToken; - - assembly { - collateralAssetId := and(args1, 0xFFFF) - debtAssetId := and(shr(16, args1), 0xFFFF) - user := and(shr(32, args1), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - - debtToCover := and(args2, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - receiveAToken := and(shr(128, args2), 0x1) - } - - if (debtToCover == type(uint128).max) { - debtToCover = type(uint256).max; - } - - return ( - reservesList[collateralAssetId], - reservesList[debtAssetId], - user, - debtToCover, - receiveAToken - ); - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IERC20WithPermit.sol - -/** - * @title IERC20WithPermit - * @author Aave - * @notice Interface for the permit function (EIP-2612) - */ -interface IERC20WithPermit is IERC20 { - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleSentinel.sol - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/MathUtils.sol - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol - -/** - * @title IFlashLoanReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - */ -interface IFlashLoanReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed assets - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param assets The addresses of the flash-borrowed assets - * @param amounts The amounts of the flash-borrowed assets - * @param premiums The fee of each flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata premiums, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol - -/** - * @title IFlashLoanSimpleReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - */ -interface IFlashLoanSimpleReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed asset - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param asset The address of the flash-borrowed asset - * @param amount The amount of the flash-borrowed asset - * @param premium The fee of the flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address asset, - uint256 amount, - uint256 premium, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ReserveLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/PoolStorage.sol - -/** - * @title PoolStorage - * @author Aave - * @notice Contract used as storage of the Pool contract. - * @dev It defines the storage layout of the Pool contract. - */ -contract PoolStorage { - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - // Map of reserves and their data (underlyingAssetOfReserve => reserveData) - mapping(address => DataTypes.ReserveData) internal _reserves; - - // Map of users address and their configuration data (userAddress => userConfiguration) - mapping(address => DataTypes.UserConfigurationMap) internal _usersConfig; - - // List of reserves as a map (reserveId => reserve). - // It is structured as a mapping for gas savings reasons, using the reserve id as index - mapping(uint256 => address) internal _reservesList; - - // List of eMode categories as a map (eModeCategoryId => eModeCategory). - // It is structured as a mapping for gas savings reasons, using the eModeCategoryId as index - mapping(uint8 => DataTypes.EModeCategory) internal _eModeCategories; - - // Map of users address and their eMode category (userAddress => eModeCategoryId) - mapping(address => uint8) internal _usersEModeCategory; - - // Fee of the protocol bridge, expressed in bps - uint256 internal _bridgeProtocolFee; - - // Total FlashLoan Premium, expressed in bps - uint128 internal _flashLoanPremiumTotal; - - // FlashLoan premium paid to protocol treasury, expressed in bps - uint128 internal _flashLoanPremiumToProtocol; - - // DEPRECATED on v3.2.0 - uint64 internal __DEPRECATED_maxStableRateBorrowSizePercent; - - // Maximum number of active reserves there have been in the protocol. It is the upper bound of the reserves list - uint16 internal _reservesCount; -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/EModeLogic.sol - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/GenericLogic.sol - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ValidationLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BridgeLogic.sol - -library BridgeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. - * @dev Essentially a supply without transferring the underlying. - * @dev Emits the `MintUnbacked` event - * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param asset The address of the underlying asset to mint aTokens of - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function executeMintUnbacked( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, reserve, amount, onBehalfOf); - - uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); - uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); - - uint256 unbacked = reserve.unbacked += amount.toUint128(); - - require( - unbacked <= unbackedMintCap * (10 ** reserveDecimals), - Errors.UNBACKED_MINT_CAP_EXCEEDED - ); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, 0, 0); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - onBehalfOf, - amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration, - reserveCache.aTokenAddress - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); - } - } - - emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); - } - - /** - * @notice Back the current unbacked with `amount` and pay `fee`. - * @dev It is not possible to back more than the existing unbacked amount of the reserve - * @dev Emits the `BackUnbacked` event - * @param reserve The reserve to back unbacked for - * @param asset The address of the underlying asset to repay - * @param amount The amount to back - * @param fee The amount paid in fees - * @param protocolFeeBps The fraction of fees in basis points paid to the protocol - * @return The backed amount - */ - function executeBackUnbacked( - DataTypes.ReserveData storage reserve, - address asset, - uint256 amount, - uint256 fee, - uint256 protocolFeeBps - ) external returns (uint256) { - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; - - uint256 feeToProtocol = fee.percentMul(protocolFeeBps); - uint256 feeToLP = fee - feeToProtocol; - uint256 added = backingAmount + fee; - - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply() + - uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), - feeToLP - ); - - reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - - reserve.unbacked -= backingAmount.toUint128(); - reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, added, 0); - - IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); - - emit BackUnbacked(asset, msg.sender, backingAmount, fee); - - return backingAmount; - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/PoolLogic.sol - -/** - * @title PoolLogic library - * @author Aave - * @notice Implements the logic for Pool specific functions - */ -library PoolLogic { - using GPv2SafeERC20 for IERC20; - using WadRayMath for uint256; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice Initialize an asset reserve and add the reserve to the list of reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param params Additional parameters needed for initiation - * @return true if appended, false if inserted at existing empty spot - */ - function executeInitReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.InitReserveParams memory params - ) external returns (bool) { - require(Address.isContract(params.asset), Errors.NOT_CONTRACT); - reservesData[params.asset].init( - params.aTokenAddress, - params.variableDebtAddress, - params.interestRateStrategyAddress - ); - - bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || - reservesList[0] == params.asset; - require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); - - for (uint16 i = 0; i < params.reservesCount; i++) { - if (reservesList[i] == address(0)) { - reservesData[params.asset].id = i; - reservesList[i] = params.asset; - return false; - } - } - - require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); - reservesData[params.asset].id = params.reservesCount; - reservesList[params.reservesCount] = params.asset; - return true; - } - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function executeRescueTokens(address token, address to, uint256 amount) external { - IERC20(token).safeTransfer(to, amount); - } - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param reservesData The state of all the reserves - * @param assets The list of reserves for which the minting needs to be executed - */ - function executeMintToTreasury( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] calldata assets - ) external { - for (uint256 i = 0; i < assets.length; i++) { - address assetAddress = assets[i]; - - DataTypes.ReserveData storage reserve = reservesData[assetAddress]; - - // this cover both inactive reserves and invalid reserves since the flag will be 0 for both - if (!reserve.configuration.getActive()) { - continue; - } - - uint256 accruedToTreasury = reserve.accruedToTreasury; - - if (accruedToTreasury != 0) { - reserve.accruedToTreasury = 0; - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); - IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); - - emit MintedToTreasury(assetAddress, amountToMint); - } - } - } - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function executeResetIsolationModeTotalDebt( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset - ) external { - require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); - reservesData[asset].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(asset, 0); - } - - /** - * @notice Sets the liquidation grace period of the asset - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - */ - function executeSetLiquidationGracePeriod( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset, - uint40 until - ) external { - reservesData[asset].liquidationGracePeriodUntil = until; - } - - /** - * @notice Drop a reserve - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param asset The address of the underlying asset of the reserve - */ - function executeDropReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - address asset - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - ValidationLogic.validateDropReserve(reservesList, reserve, asset); - reservesList[reservesData[asset].id] = address(0); - delete reservesData[asset]; - } - - /** - * @notice Returns the user account data across all the reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the calculation - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function executeGetUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ) - { - ( - totalCollateralBase, - totalDebtBase, - ltv, - currentLiquidationThreshold, - healthFactor, - - ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); - - availableBorrowsBase = GenericLogic.calculateAvailableBorrows( - totalCollateralBase, - totalDebtBase, - ltv - ); - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/SupplyLogic.sol - -/** - * @title SupplyLogic library - * @author Aave - * @notice Implements the base logic for supply/withdraw - */ -library SupplyLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. - * @dev Emits the `Supply()` event. - * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as - * collateral. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the supply function - */ - function executeSupply( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSupplyParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, reserve, params.amount, params.onBehalfOf); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, params.amount, 0); - - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - params.onBehalfOf, - params.amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration, - reserveCache.aTokenAddress - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); - } - } - - emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); - } - - /** - * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset - * previously supplied in the Aave protocol. - * @dev Emits the `Withdraw()` event. - * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the withdraw function - * @return The actual amount withdrawn - */ - function executeWithdraw( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteWithdrawParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - require(params.to != reserveCache.aTokenAddress, Errors.WITHDRAW_TO_ATOKEN); - - reserve.updateState(reserveCache); - - uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( - reserveCache.nextLiquidityIndex - ); - - uint256 amountToWithdraw = params.amount; - - if (params.amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - - ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, amountToWithdraw); - - bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); - - if (isCollateral && amountToWithdraw == userBalance) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - params.to, - amountToWithdraw, - reserveCache.nextLiquidityIndex - ); - - if (isCollateral && userConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - params.asset, - msg.sender, - params.reservesCount, - params.oracle, - params.userEModeCategory - ); - } - - emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); - - return amountToWithdraw; - } - - /** - * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid - * collateralization constraints violation. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as - * collateral. - * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param params The additional parameters needed to execute the finalizeTransfer function - */ - function executeFinalizeTransfer( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.FinalizeTransferParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - - ValidationLogic.validateTransfer(reserve); - - uint256 reserveId = reserve.id; - uint256 scaledAmount = params.amount.rayDiv(reserve.getNormalizedIncome()); - - if (params.from != params.to && scaledAmount != 0) { - DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; - - if (fromConfig.isUsingAsCollateral(reserveId)) { - if (fromConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - usersConfig[params.from], - params.asset, - params.from, - params.reservesCount, - params.oracle, - params.fromEModeCategory - ); - } - if (params.balanceFromBefore == params.amount) { - fromConfig.setUsingAsCollateral(reserveId, false); - emit ReserveUsedAsCollateralDisabled(params.asset, params.from); - } - } - - if (params.balanceToBefore == 0) { - DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - toConfig, - reserve.configuration, - reserve.aTokenAddress - ) - ) { - toConfig.setUsingAsCollateral(reserveId, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.to); - } - } - } - } - - /** - * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as - * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor - * checks to ensure collateralization. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. - * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The users configuration mapping that track the supplied/borrowed assets - * @param asset The address of the asset being configured as collateral - * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise - * @param reservesCount The number of initialized reserves - * @param priceOracle The address of the price oracle - * @param userEModeCategory The eMode category chosen by the user - */ - function executeUseReserveAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - bool useAsCollateral, - uint256 reservesCount, - address priceOracle, - uint8 userEModeCategory - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); - - ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); - - if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; - - if (useAsCollateral) { - require( - ValidationLogic.validateUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration - ), - Errors.USER_IN_ISOLATION_MODE_OR_LTV_ZERO - ); - - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, msg.sender); - } else { - userConfig.setUsingAsCollateral(reserve.id, false); - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - asset, - msg.sender, - reservesCount, - priceOracle, - userEModeCategory - ); - - emit ReserveUsedAsCollateralDisabled(asset, msg.sender); - } - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BorrowLogic.sol - -/** - * @title BorrowLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to borrowing - */ -library BorrowLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the - * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the - * isolated debt. - * @dev Emits the `Borrow()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the borrow function - */ - function executeBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteBorrowParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ( - bool isolationModeActive, - address isolationModeCollateralAddress, - uint256 isolationModeDebtCeiling - ) = userConfig.getIsolationModeState(reservesData, reservesList); - - ValidationLogic.validateBorrow( - reservesData, - reservesList, - eModeCategories, - DataTypes.ValidateBorrowParams({ - reserveCache: reserveCache, - userConfig: userConfig, - asset: params.asset, - userAddress: params.onBehalfOf, - amount: params.amount, - interestRateMode: params.interestRateMode, - reservesCount: params.reservesCount, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory, - priceOracleSentinel: params.priceOracleSentinel, - isolationModeActive: isolationModeActive, - isolationModeCollateralAddress: isolationModeCollateralAddress, - isolationModeDebtCeiling: isolationModeDebtCeiling - }) - ); - - bool isFirstBorrowing = false; - - (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); - - if (isFirstBorrowing) { - userConfig.setBorrowing(reserve.id, true); - } - - if (isolationModeActive) { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt += (params.amount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - 0, - params.releaseUnderlying ? params.amount : 0 - ); - - if (params.releaseUnderlying) { - IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); - } - - emit Borrow( - params.asset, - params.user, - params.onBehalfOf, - params.amount, - DataTypes.InterestRateMode.VARIABLE, - reserve.currentVariableBorrowRate, - params.referralCode - ); - } - - /** - * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the - * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also - * reduces the isolated debt. - * @dev Emits the `Repay()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the repay function - * @return The actual amount being repaid - */ - function executeRepay( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteRepayParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - - uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( - params.onBehalfOf - ); - - ValidationLogic.validateRepay( - reserveCache, - params.amount, - params.interestRateMode, - params.onBehalfOf, - variableDebt - ); - - uint256 paybackAmount = variableDebt; - - // Allows a user to repay with aTokens without leaving dust from interest. - if (params.useATokens && params.amount == type(uint256).max) { - params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); - } - - if (params.amount < paybackAmount) { - paybackAmount = params.amount; - } - - reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) - .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - params.useATokens ? 0 : paybackAmount, - 0 - ); - - if (variableDebt - paybackAmount == 0) { - userConfig.setBorrowing(reserve.id, false); - } - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - reserveCache, - paybackAmount - ); - - if (params.useATokens) { - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - reserveCache.aTokenAddress, - paybackAmount, - reserveCache.nextLiquidityIndex - ); - // in case of aToken repayment the msg.sender must always repay on behalf of itself - if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - } else { - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); - IAToken(reserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.onBehalfOf, - paybackAmount - ); - } - - emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); - - return paybackAmount; - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/LiquidationLogic.sol - -/** - * @title LiquidationLogic library - * @author Aave - * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations - */ -library LiquidationLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Default percentage of borrower's debt to be repaid in a liquidation. - * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 0.5e4 results in 50.00% - */ - uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; - - /** - * @dev Maximum percentage of borrower's debt to be repaid in a liquidation - * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 1e4 results in 100.00% - */ - uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; - - /** - * @dev This constant represents below which health factor value it is possible to liquidate - * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. - * A value of 0.95e18 results in 0.95 - */ - uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; - - struct LiquidationCallLocalVars { - uint256 userCollateralBalance; - uint256 userTotalDebt; - uint256 actualDebtToLiquidate; - uint256 actualCollateralToLiquidate; - uint256 liquidationBonus; - uint256 healthFactor; - uint256 liquidationProtocolFeeAmount; - IAToken collateralAToken; - DataTypes.ReserveCache debtReserveCache; - } - - /** - * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) - * covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportional amount of the `collateralAsset` plus a bonus to cover market risk - * @dev Emits the `LiquidationCall()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params The additional parameters needed to execute the liquidation function - */ - function executeLiquidationCall( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ExecuteLiquidationCallParams memory params - ) external { - LiquidationCallLocalVars memory vars; - - DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; - DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; - DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; - vars.debtReserveCache = debtReserve.cache(); - debtReserve.updateState(vars.debtReserveCache); - - (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: params.reservesCount, - user: params.user, - oracle: params.priceOracle, - userEModeCategory: params.userEModeCategory - }) - ); - - (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( - vars.debtReserveCache, - params, - vars.healthFactor - ); - - ValidationLogic.validateLiquidationCall( - userConfig, - collateralReserve, - debtReserve, - DataTypes.ValidateLiquidationCallParams({ - debtReserveCache: vars.debtReserveCache, - totalDebt: vars.userTotalDebt, - healthFactor: vars.healthFactor, - priceOracleSentinel: params.priceOracleSentinel - }) - ); - - vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); - if ( - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - collateralReserve.id - ) - ) { - vars.liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; - } else { - vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); - } - - vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); - - ( - vars.actualCollateralToLiquidate, - vars.actualDebtToLiquidate, - vars.liquidationProtocolFeeAmount - ) = _calculateAvailableCollateralToLiquidate( - collateralReserve, - vars.debtReserveCache, - params.collateralAsset, - params.debtAsset, - vars.actualDebtToLiquidate, - vars.userCollateralBalance, - vars.liquidationBonus, - IPriceOracleGetter(params.priceOracle) - ); - - if (vars.userTotalDebt == vars.actualDebtToLiquidate) { - userConfig.setBorrowing(debtReserve.id, false); - } - - // If the collateral being liquidated is equal to the user balance, - // we set the currency as not being used as collateral anymore - if ( - vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == - vars.userCollateralBalance - ) { - userConfig.setUsingAsCollateral(collateralReserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); - } - - _burnDebtTokens(params, vars); - - debtReserve.updateInterestRatesAndVirtualBalance( - vars.debtReserveCache, - params.debtAsset, - vars.actualDebtToLiquidate, - 0 - ); - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - vars.debtReserveCache, - vars.actualDebtToLiquidate - ); - - if (params.receiveAToken) { - _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); - } else { - _burnCollateralATokens(collateralReserve, params, vars); - } - - // Transfer fee to treasury if it is non-zero - if (vars.liquidationProtocolFeeAmount != 0) { - uint256 liquidityIndex = collateralReserve.getNormalizedIncome(); - uint256 scaledDownLiquidationProtocolFee = vars.liquidationProtocolFeeAmount.rayDiv( - liquidityIndex - ); - uint256 scaledDownUserBalance = vars.collateralAToken.scaledBalanceOf(params.user); - // To avoid trying to send more aTokens than available on balance, due to 1 wei imprecision - if (scaledDownLiquidationProtocolFee > scaledDownUserBalance) { - vars.liquidationProtocolFeeAmount = scaledDownUserBalance.rayMul(liquidityIndex); - } - vars.collateralAToken.transferOnLiquidation( - params.user, - vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), - vars.liquidationProtocolFeeAmount - ); - } - - // Transfers the debt asset being repaid to the aToken, where the liquidity is kept - IERC20(params.debtAsset).safeTransferFrom( - msg.sender, - vars.debtReserveCache.aTokenAddress, - vars.actualDebtToLiquidate - ); - - IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.user, - vars.actualDebtToLiquidate - ); - - emit LiquidationCall( - params.collateralAsset, - params.debtAsset, - params.user, - vars.actualDebtToLiquidate, - vars.actualCollateralToLiquidate, - msg.sender, - params.receiveAToken - ); - } - - /** - * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. - * @dev The function also updates the state and the interest rate of the collateral reserve. - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _burnCollateralATokens( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); - collateralReserve.updateState(collateralReserveCache); - collateralReserve.updateInterestRatesAndVirtualBalance( - collateralReserveCache, - params.collateralAsset, - 0, - vars.actualCollateralToLiquidate - ); - - // Burn the equivalent amount of aToken, sending the underlying to the liquidator - vars.collateralAToken.burn( - params.user, - msg.sender, - vars.actualCollateralToLiquidate, - collateralReserveCache.nextLiquidityIndex - ); - } - - /** - * @notice Liquidates the user aTokens by transferring them to the liquidator. - * @dev The function also checks the state of the liquidator and activates the aToken as collateral - * as in standard transfers if the isolation mode constraints are respected. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _liquidateATokens( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); - vars.collateralAToken.transferOnLiquidation( - params.user, - msg.sender, - vars.actualCollateralToLiquidate - ); - - if (liquidatorPreviousATokenBalance == 0) { - DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - liquidatorConfig, - collateralReserve.configuration, - collateralReserve.aTokenAddress - ) - ) { - liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); - } - } - } - - /** - * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. - * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. - * @param params The additional parameters needed to execute the liquidation function - * @param vars the executeLiquidationCall() function local vars - */ - function _burnDebtTokens( - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( - vars.debtReserveCache.variableDebtTokenAddress - ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); - } - - /** - * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor - * and corresponding close factor. - * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR - * @param debtReserveCache The reserve cache data object of the debt reserve - * @param params The additional parameters needed to execute the liquidation function - * @param healthFactor The health factor of the position - * @return The total debt of the user - * @return The actual debt to liquidate as a function of the closeFactor - */ - function _calculateDebt( - DataTypes.ReserveCache memory debtReserveCache, - DataTypes.ExecuteLiquidationCallParams memory params, - uint256 healthFactor - ) internal view returns (uint256, uint256) { - uint256 userVariableDebt = IERC20(debtReserveCache.variableDebtTokenAddress).balanceOf( - params.user - ); - - uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD - ? DEFAULT_LIQUIDATION_CLOSE_FACTOR - : MAX_LIQUIDATION_CLOSE_FACTOR; - - uint256 maxLiquidatableDebt = userVariableDebt.percentMul(closeFactor); - - uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt - ? maxLiquidatableDebt - : params.debtToCover; - - return (userVariableDebt, actualDebtToLiquidate); - } - - struct AvailableCollateralToLiquidateLocalVars { - uint256 collateralPrice; - uint256 debtAssetPrice; - uint256 maxCollateralToLiquidate; - uint256 baseCollateral; - uint256 bonusCollateral; - uint256 debtAssetDecimals; - uint256 collateralDecimals; - uint256 collateralAssetUnit; - uint256 debtAssetUnit; - uint256 collateralAmount; - uint256 debtAmountNeeded; - uint256 liquidationProtocolFeePercentage; - uint256 liquidationProtocolFee; - } - - /** - * @notice Calculates how much of a specific collateral can be liquidated, given - * a certain amount of debt asset. - * @dev This function needs to be called after all the checks to validate the liquidation have been performed, - * otherwise it might fail. - * @param collateralReserve The data of the collateral reserve - * @param debtReserveCache The cached data of the debt reserve - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated - * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation - * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) - * @return The amount to repay with the liquidation - * @return The fee taken from the liquidation bonus amount to be paid to the protocol - */ - function _calculateAvailableCollateralToLiquidate( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveCache memory debtReserveCache, - address collateralAsset, - address debtAsset, - uint256 debtToCover, - uint256 userCollateralBalance, - uint256 liquidationBonus, - IPriceOracleGetter oracle - ) internal view returns (uint256, uint256, uint256) { - AvailableCollateralToLiquidateLocalVars memory vars; - - vars.collateralPrice = oracle.getAssetPrice(collateralAsset); - vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); - - vars.collateralDecimals = collateralReserve.configuration.getDecimals(); - vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); - - unchecked { - vars.collateralAssetUnit = 10 ** vars.collateralDecimals; - vars.debtAssetUnit = 10 ** vars.debtAssetDecimals; - } - - vars.liquidationProtocolFeePercentage = collateralReserve - .configuration - .getLiquidationProtocolFee(); - - // This is the base collateral to liquidate based on the given debt to cover - vars.baseCollateral = - ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / - (vars.collateralPrice * vars.debtAssetUnit); - - vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); - - if (vars.maxCollateralToLiquidate > userCollateralBalance) { - vars.collateralAmount = userCollateralBalance; - vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / - (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); - } else { - vars.collateralAmount = vars.maxCollateralToLiquidate; - vars.debtAmountNeeded = debtToCover; - } - - if (vars.liquidationProtocolFeePercentage != 0) { - vars.bonusCollateral = - vars.collateralAmount - - vars.collateralAmount.percentDiv(liquidationBonus); - - vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( - vars.liquidationProtocolFeePercentage - ); - - return ( - vars.collateralAmount - vars.liquidationProtocolFee, - vars.debtAmountNeeded, - vars.liquidationProtocolFee - ); - } else { - return (vars.collateralAmount, vars.debtAmountNeeded, 0); - } - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol - -/** - * @title FlashLoanLogic library - * @author Aave - * @notice Implements the logic for the flash loans - */ -library FlashLoanLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - - // See `IPool` for descriptions - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - // Helper struct for internal variables used in the `executeFlashLoan` function - struct FlashLoanLocalVars { - IFlashLoanReceiver receiver; - address currentAsset; - uint256 currentAmount; - uint256[] totalPremiums; - uint256 flashloanPremiumTotal; - uint256 flashloanPremiumToProtocol; - } - - /** - * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction - * as long as the amount taken plus fee is returned or debt is opened. - * @dev For authorized flashborrowers the fee is waived - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the flashloan function - */ - function executeFlashLoan( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.FlashloanParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); - - FlashLoanLocalVars memory vars; - - vars.totalPremiums = new uint256[](params.assets.length); - - vars.receiver = IFlashLoanReceiver(params.receiverAddress); - (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower - ? (0, 0) - : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); - - for (uint256 i = 0; i < params.assets.length; i++) { - vars.currentAmount = params.amounts[i]; - vars.totalPremiums[i] = DataTypes.InterestRateMode(params.interestRateModes[i]) == - DataTypes.InterestRateMode.NONE - ? vars.currentAmount.percentMul(vars.flashloanPremiumTotal) - : 0; - - if (reservesData[params.assets[i]].configuration.getIsVirtualAccActive()) { - reservesData[params.assets[i]].virtualUnderlyingBalance -= vars.currentAmount.toUint128(); - } - - IAToken(reservesData[params.assets[i]].aTokenAddress).transferUnderlyingTo( - params.receiverAddress, - vars.currentAmount - ); - } - - require( - vars.receiver.executeOperation( - params.assets, - params.amounts, - vars.totalPremiums, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - for (uint256 i = 0; i < params.assets.length; i++) { - vars.currentAsset = params.assets[i]; - vars.currentAmount = params.amounts[i]; - - if ( - DataTypes.InterestRateMode(params.interestRateModes[i]) == DataTypes.InterestRateMode.NONE - ) { - _handleFlashLoanRepayment( - reservesData[vars.currentAsset], - DataTypes.FlashLoanRepaymentParams({ - asset: vars.currentAsset, - receiverAddress: params.receiverAddress, - amount: vars.currentAmount, - totalPremium: vars.totalPremiums[i], - flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } else { - // If the user chose to not return the funds, the system checks if there is enough collateral and - // eventually opens a debt position - BorrowLogic.executeBorrow( - reservesData, - reservesList, - eModeCategories, - userConfig, - DataTypes.ExecuteBorrowParams({ - asset: vars.currentAsset, - user: msg.sender, - onBehalfOf: params.onBehalfOf, - amount: vars.currentAmount, - interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[i]), - referralCode: params.referralCode, - releaseUnderlying: false, - reservesCount: IPool(params.pool).getReservesCount(), - oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), - userEModeCategory: IPool(params.pool).getUserEMode(params.onBehalfOf).toUint8(), - priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) - .getPriceOracleSentinel() - }) - ); - // no premium is paid when taking on the flashloan as debt - emit FlashLoan( - params.receiverAddress, - msg.sender, - vars.currentAsset, - vars.currentAmount, - DataTypes.InterestRateMode(params.interestRateModes[i]), - 0, - params.referralCode - ); - } - } - } - - /** - * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one - * transaction as long as the amount taken plus fee is returned. - * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the simple flashloan function - */ - function executeFlashLoanSimple( - DataTypes.ReserveData storage reserve, - DataTypes.FlashloanSimpleParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloanSimple(reserve, params.amount); - - IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); - uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); - - if (reserve.configuration.getIsVirtualAccActive()) { - reserve.virtualUnderlyingBalance -= params.amount.toUint128(); - } - - IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); - - require( - receiver.executeOperation( - params.asset, - params.amount, - totalPremium, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - _handleFlashLoanRepayment( - reserve, - DataTypes.FlashLoanRepaymentParams({ - asset: params.asset, - receiverAddress: params.receiverAddress, - amount: params.amount, - totalPremium: totalPremium, - flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } - - /** - * @notice Handles repayment of flashloaned assets + premium - * @dev Will pull the amount + premium from the receiver, so must have approved pool - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the repayment function - */ - function _handleFlashLoanRepayment( - DataTypes.ReserveData storage reserve, - DataTypes.FlashLoanRepaymentParams memory params - ) internal { - uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); - uint256 premiumToLP = params.totalPremium - premiumToProtocol; - uint256 amountPlusPremium = params.amount + params.totalPremium; - - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply() + - uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), - premiumToLP - ); - - reserve.accruedToTreasury += premiumToProtocol - .rayDiv(reserveCache.nextLiquidityIndex) - .toUint128(); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, amountPlusPremium, 0); - - IERC20(params.asset).safeTransferFrom( - params.receiverAddress, - reserveCache.aTokenAddress, - amountPlusPremium - ); - - IAToken(reserveCache.aTokenAddress).handleRepayment( - params.receiverAddress, - params.receiverAddress, - amountPlusPremium - ); - - emit FlashLoan( - params.receiverAddress, - msg.sender, - params.asset, - params.amount, - DataTypes.InterestRateMode.NONE, - params.totalPremium, - params.referralCode - ); - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/Pool.sol - -/** - * @title Pool contract - * @author Aave - * @notice Main point of interaction with an Aave protocol's market - * - Users can: - * # Supply - * # Withdraw - * # Borrow - * # Repay - * # Enable/disable their supplied assets as collateral - * # Liquidate positions - * # Execute Flash Loans - * @dev To be covered by a proxy contract, owned by the PoolAddressesProvider of the specific market - * @dev All admin functions are callable by the PoolConfigurator contract defined also in the - * PoolAddressesProvider - */ -abstract contract Pool is VersionedInitializable, PoolStorage, IPool { - using ReserveLogic for DataTypes.ReserveData; - - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @dev Only pool configurator can call functions marked by this modifier. - */ - modifier onlyPoolConfigurator() { - _onlyPoolConfigurator(); - _; - } - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - _onlyPoolAdmin(); - _; - } - - /** - * @dev Only bridge can call functions marked by this modifier. - */ - modifier onlyBridge() { - _onlyBridge(); - _; - } - - function _onlyPoolConfigurator() internal view virtual { - require( - ADDRESSES_PROVIDER.getPoolConfigurator() == msg.sender, - Errors.CALLER_NOT_POOL_CONFIGURATOR - ); - } - - function _onlyPoolAdmin() internal view virtual { - require( - IACLManager(ADDRESSES_PROVIDER.getACLManager()).isPoolAdmin(msg.sender), - Errors.CALLER_NOT_POOL_ADMIN - ); - } - - function _onlyBridge() internal view virtual { - require( - IACLManager(ADDRESSES_PROVIDER.getACLManager()).isBridge(msg.sender), - Errors.CALLER_NOT_BRIDGE - ); - } - - /** - * @dev Constructor. - * @param provider The address of the PoolAddressesProvider contract - */ - constructor(IPoolAddressesProvider provider) { - ADDRESSES_PROVIDER = provider; - } - - /** - * @notice Initializes the Pool. - * @dev Function is invoked by the proxy contract when the Pool contract is added to the - * PoolAddressesProvider of the market. - * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations - * @param provider The address of the PoolAddressesProvider - */ - function initialize(IPoolAddressesProvider provider) external virtual; - - /// @inheritdoc IPool - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external virtual override onlyBridge { - BridgeLogic.executeMintUnbacked( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - asset, - amount, - onBehalfOf, - referralCode - ); - } - - /// @inheritdoc IPool - function backUnbacked( - address asset, - uint256 amount, - uint256 fee - ) external virtual override onlyBridge returns (uint256) { - return - BridgeLogic.executeBackUnbacked(_reserves[asset], asset, amount, fee, _bridgeProtocolFee); - } - - /// @inheritdoc IPool - function supply( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) public virtual override { - SupplyLogic.executeSupply( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteSupplyParams({ - asset: asset, - amount: amount, - onBehalfOf: onBehalfOf, - referralCode: referralCode - }) - ); - } - - /// @inheritdoc IPool - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) public virtual override { - try - IERC20WithPermit(asset).permit( - msg.sender, - address(this), - amount, - deadline, - permitV, - permitR, - permitS - ) - {} catch {} - SupplyLogic.executeSupply( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteSupplyParams({ - asset: asset, - amount: amount, - onBehalfOf: onBehalfOf, - referralCode: referralCode - }) - ); - } - - /// @inheritdoc IPool - function withdraw( - address asset, - uint256 amount, - address to - ) public virtual override returns (uint256) { - return - SupplyLogic.executeWithdraw( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[msg.sender], - DataTypes.ExecuteWithdrawParams({ - asset: asset, - amount: amount, - to: to, - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[msg.sender] - }) - ); - } - - /// @inheritdoc IPool - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) public virtual override { - BorrowLogic.executeBorrow( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[onBehalfOf], - DataTypes.ExecuteBorrowParams({ - asset: asset, - user: msg.sender, - onBehalfOf: onBehalfOf, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - referralCode: referralCode, - releaseUnderlying: true, - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[onBehalfOf], - priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() - }) - ); - } - - /// @inheritdoc IPool - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) public virtual override returns (uint256) { - return - BorrowLogic.executeRepay( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteRepayParams({ - asset: asset, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - onBehalfOf: onBehalfOf, - useATokens: false - }) - ); - } - - /// @inheritdoc IPool - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) public virtual override returns (uint256) { - try - IERC20WithPermit(asset).permit( - msg.sender, - address(this), - amount, - deadline, - permitV, - permitR, - permitS - ) - {} catch {} - - { - DataTypes.ExecuteRepayParams memory params = DataTypes.ExecuteRepayParams({ - asset: asset, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - onBehalfOf: onBehalfOf, - useATokens: false - }); - return BorrowLogic.executeRepay(_reserves, _reservesList, _usersConfig[onBehalfOf], params); - } - } - - /// @inheritdoc IPool - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) public virtual override returns (uint256) { - return - BorrowLogic.executeRepay( - _reserves, - _reservesList, - _usersConfig[msg.sender], - DataTypes.ExecuteRepayParams({ - asset: asset, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - onBehalfOf: msg.sender, - useATokens: true - }) - ); - } - - /// @inheritdoc IPool - function setUserUseReserveAsCollateral( - address asset, - bool useAsCollateral - ) public virtual override { - SupplyLogic.executeUseReserveAsCollateral( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[msg.sender], - asset, - useAsCollateral, - _reservesCount, - ADDRESSES_PROVIDER.getPriceOracle(), - _usersEModeCategory[msg.sender] - ); - } - - /// @inheritdoc IPool - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) public virtual override { - LiquidationLogic.executeLiquidationCall( - _reserves, - _reservesList, - _usersConfig, - _eModeCategories, - DataTypes.ExecuteLiquidationCallParams({ - reservesCount: _reservesCount, - debtToCover: debtToCover, - collateralAsset: collateralAsset, - debtAsset: debtAsset, - user: user, - receiveAToken: receiveAToken, - priceOracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[user], - priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() - }) - ); - } - - /// @inheritdoc IPool - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) public virtual override { - DataTypes.FlashloanParams memory flashParams = DataTypes.FlashloanParams({ - receiverAddress: receiverAddress, - assets: assets, - amounts: amounts, - interestRateModes: interestRateModes, - onBehalfOf: onBehalfOf, - params: params, - referralCode: referralCode, - flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, - flashLoanPremiumTotal: _flashLoanPremiumTotal, - reservesCount: _reservesCount, - addressesProvider: address(ADDRESSES_PROVIDER), - pool: address(this), - userEModeCategory: _usersEModeCategory[onBehalfOf], - isAuthorizedFlashBorrower: IACLManager(ADDRESSES_PROVIDER.getACLManager()).isFlashBorrower( - msg.sender - ) - }); - - FlashLoanLogic.executeFlashLoan( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[onBehalfOf], - flashParams - ); - } - - /// @inheritdoc IPool - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) public virtual override { - DataTypes.FlashloanSimpleParams memory flashParams = DataTypes.FlashloanSimpleParams({ - receiverAddress: receiverAddress, - asset: asset, - amount: amount, - params: params, - referralCode: referralCode, - flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, - flashLoanPremiumTotal: _flashLoanPremiumTotal - }); - FlashLoanLogic.executeFlashLoanSimple(_reserves[asset], flashParams); - } - - /// @inheritdoc IPool - function mintToTreasury(address[] calldata assets) external virtual override { - PoolLogic.executeMintToTreasury(_reserves, assets); - } - - /// @inheritdoc IPool - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory) { - return _reserves[asset]; - } - - /// @inheritdoc IPool - function getReserveData( - address asset - ) external view virtual override returns (DataTypes.ReserveDataLegacy memory) { - DataTypes.ReserveData memory reserve = _reserves[asset]; - DataTypes.ReserveDataLegacy memory res; - - res.configuration = reserve.configuration; - res.liquidityIndex = reserve.liquidityIndex; - res.currentLiquidityRate = reserve.currentLiquidityRate; - res.variableBorrowIndex = reserve.variableBorrowIndex; - res.currentVariableBorrowRate = reserve.currentVariableBorrowRate; - res.lastUpdateTimestamp = reserve.lastUpdateTimestamp; - res.id = reserve.id; - res.aTokenAddress = reserve.aTokenAddress; - res.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - res.interestRateStrategyAddress = reserve.interestRateStrategyAddress; - res.accruedToTreasury = reserve.accruedToTreasury; - res.unbacked = reserve.unbacked; - res.isolationModeTotalDebt = reserve.isolationModeTotalDebt; - // This is a temporary workaround for integrations that are broken by Aave 3.2 - // While the new pool data provider is backward compatible, some integrations hard-code an old implementation - // To allow them to not have any infrastructural blocker, a mock must be configured in the Aave Pool Addresses Provider, returning zero on all required view methods, instead of reverting - res.stableDebtTokenAddress = ADDRESSES_PROVIDER.getAddress(bytes32('MOCK_STABLE_DEBT')); - return res; - } - - /// @inheritdoc IPool - function getVirtualUnderlyingBalance( - address asset - ) external view virtual override returns (uint128) { - return _reserves[asset].virtualUnderlyingBalance; - } - - /// @inheritdoc IPool - function getUserAccountData( - address user - ) - external - view - virtual - override - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ) - { - return - PoolLogic.executeGetUserAccountData( - _reserves, - _reservesList, - _eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: _usersConfig[user], - reservesCount: _reservesCount, - user: user, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[user] - }) - ); - } - - /// @inheritdoc IPool - function getConfiguration( - address asset - ) external view virtual override returns (DataTypes.ReserveConfigurationMap memory) { - return _reserves[asset].configuration; - } - - /// @inheritdoc IPool - function getUserConfiguration( - address user - ) external view virtual override returns (DataTypes.UserConfigurationMap memory) { - return _usersConfig[user]; - } - - /// @inheritdoc IPool - function getReserveNormalizedIncome( - address asset - ) external view virtual override returns (uint256) { - return _reserves[asset].getNormalizedIncome(); - } - - /// @inheritdoc IPool - function getReserveNormalizedVariableDebt( - address asset - ) external view virtual override returns (uint256) { - return _reserves[asset].getNormalizedDebt(); - } - - /// @inheritdoc IPool - function getReservesList() external view virtual override returns (address[] memory) { - uint256 reservesListCount = _reservesCount; - uint256 droppedReservesCount = 0; - address[] memory reservesList = new address[](reservesListCount); - - for (uint256 i = 0; i < reservesListCount; i++) { - if (_reservesList[i] != address(0)) { - reservesList[i - droppedReservesCount] = _reservesList[i]; - } else { - droppedReservesCount++; - } - } - - // Reduces the length of the reserves array by `droppedReservesCount` - assembly { - mstore(reservesList, sub(reservesListCount, droppedReservesCount)) - } - return reservesList; - } - - /// @inheritdoc IPool - function getReservesCount() external view virtual override returns (uint256) { - return _reservesCount; - } - - /// @inheritdoc IPool - function getReserveAddressById(uint16 id) external view returns (address) { - return _reservesList[id]; - } - - /// @inheritdoc IPool - function BRIDGE_PROTOCOL_FEE() public view virtual override returns (uint256) { - return _bridgeProtocolFee; - } - - /// @inheritdoc IPool - function FLASHLOAN_PREMIUM_TOTAL() public view virtual override returns (uint128) { - return _flashLoanPremiumTotal; - } - - /// @inheritdoc IPool - function FLASHLOAN_PREMIUM_TO_PROTOCOL() public view virtual override returns (uint128) { - return _flashLoanPremiumToProtocol; - } - - /// @inheritdoc IPool - function MAX_NUMBER_RESERVES() public view virtual override returns (uint16) { - return ReserveConfiguration.MAX_RESERVES_COUNT; - } - - /// @inheritdoc IPool - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external virtual override { - require(msg.sender == _reserves[asset].aTokenAddress, Errors.CALLER_NOT_ATOKEN); - SupplyLogic.executeFinalizeTransfer( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig, - DataTypes.FinalizeTransferParams({ - asset: asset, - from: from, - to: to, - amount: amount, - balanceFromBefore: balanceFromBefore, - balanceToBefore: balanceToBefore, - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - fromEModeCategory: _usersEModeCategory[from] - }) - ); - } - - /// @inheritdoc IPool - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external virtual override onlyPoolConfigurator { - if ( - PoolLogic.executeInitReserve( - _reserves, - _reservesList, - DataTypes.InitReserveParams({ - asset: asset, - aTokenAddress: aTokenAddress, - variableDebtAddress: variableDebtAddress, - interestRateStrategyAddress: interestRateStrategyAddress, - reservesCount: _reservesCount, - maxNumberReserves: MAX_NUMBER_RESERVES() - }) - ) - ) { - _reservesCount++; - } - } - - /// @inheritdoc IPool - function dropReserve(address asset) external virtual override onlyPoolConfigurator { - PoolLogic.executeDropReserve(_reserves, _reservesList, asset); - } - - /// @inheritdoc IPool - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external virtual override onlyPoolConfigurator { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - - _reserves[asset].interestRateStrategyAddress = rateStrategyAddress; - } - - /// @inheritdoc IPool - function syncIndexesState(address asset) external virtual override onlyPoolConfigurator { - DataTypes.ReserveData storage reserve = _reserves[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - } - - /// @inheritdoc IPool - function syncRatesState(address asset) external virtual override onlyPoolConfigurator { - DataTypes.ReserveData storage reserve = _reserves[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - ReserveLogic.updateInterestRatesAndVirtualBalance(reserve, reserveCache, asset, 0, 0); - } - - /// @inheritdoc IPool - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external virtual override onlyPoolConfigurator { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - _reserves[asset].configuration = configuration; - } - - /// @inheritdoc IPool - function updateBridgeProtocolFee( - uint256 protocolFee - ) external virtual override onlyPoolConfigurator { - _bridgeProtocolFee = protocolFee; - } - - /// @inheritdoc IPool - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external virtual override onlyPoolConfigurator { - _flashLoanPremiumTotal = flashLoanPremiumTotal; - _flashLoanPremiumToProtocol = flashLoanPremiumToProtocol; - } - - /// @inheritdoc IPool - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory category - ) external virtual override onlyPoolConfigurator { - // category 0 is reserved for volatile heterogeneous assets and it's always disabled - require(id != 0, Errors.EMODE_CATEGORY_RESERVED); - _eModeCategories[id].ltv = category.ltv; - _eModeCategories[id].liquidationThreshold = category.liquidationThreshold; - _eModeCategories[id].liquidationBonus = category.liquidationBonus; - _eModeCategories[id].label = category.label; - } - - /// @inheritdoc IPool - function configureEModeCategoryCollateralBitmap( - uint8 id, - uint128 collateralBitmap - ) external virtual override onlyPoolConfigurator { - // category 0 is reserved for volatile heterogeneous assets and it's always disabled - require(id != 0, Errors.EMODE_CATEGORY_RESERVED); - _eModeCategories[id].collateralBitmap = collateralBitmap; - } - - /// @inheritdoc IPool - function configureEModeCategoryBorrowableBitmap( - uint8 id, - uint128 borrowableBitmap - ) external virtual override onlyPoolConfigurator { - // category 0 is reserved for volatile heterogeneous assets and it's always disabled - require(id != 0, Errors.EMODE_CATEGORY_RESERVED); - _eModeCategories[id].borrowableBitmap = borrowableBitmap; - } - - /// @inheritdoc IPool - function getEModeCategoryData( - uint8 id - ) external view virtual override returns (DataTypes.EModeCategoryLegacy memory) { - DataTypes.EModeCategory memory category = _eModeCategories[id]; - return - DataTypes.EModeCategoryLegacy({ - ltv: category.ltv, - liquidationThreshold: category.liquidationThreshold, - liquidationBonus: category.liquidationBonus, - priceSource: address(0), - label: category.label - }); - } - - /// @inheritdoc IPool - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory) { - return - DataTypes.CollateralConfig({ - ltv: _eModeCategories[id].ltv, - liquidationThreshold: _eModeCategories[id].liquidationThreshold, - liquidationBonus: _eModeCategories[id].liquidationBonus - }); - } - - /// @inheritdoc IPool - function getEModeCategoryLabel(uint8 id) external view returns (string memory) { - return _eModeCategories[id].label; - } - - /// @inheritdoc IPool - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128) { - return _eModeCategories[id].collateralBitmap; - } - - /// @inheritdoc IPool - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128) { - return _eModeCategories[id].borrowableBitmap; - } - - /// @inheritdoc IPool - function setUserEMode(uint8 categoryId) external virtual override { - EModeLogic.executeSetUserEMode( - _reserves, - _reservesList, - _eModeCategories, - _usersEModeCategory, - _usersConfig[msg.sender], - DataTypes.ExecuteSetUserEModeParams({ - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - categoryId: categoryId - }) - ); - } - - /// @inheritdoc IPool - function getUserEMode(address user) external view virtual override returns (uint256) { - return _usersEModeCategory[user]; - } - - /// @inheritdoc IPool - function resetIsolationModeTotalDebt( - address asset - ) external virtual override onlyPoolConfigurator { - PoolLogic.executeResetIsolationModeTotalDebt(_reserves, asset); - } - - /// @inheritdoc IPool - function getLiquidationGracePeriod(address asset) external virtual override returns (uint40) { - return _reserves[asset].liquidationGracePeriodUntil; - } - - /// @inheritdoc IPool - function setLiquidationGracePeriod( - address asset, - uint40 until - ) external virtual override onlyPoolConfigurator { - require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - PoolLogic.executeSetLiquidationGracePeriod(_reserves, asset, until); - } - - /// @inheritdoc IPool - function rescueTokens( - address token, - address to, - uint256 amount - ) external virtual override onlyPoolAdmin { - PoolLogic.executeRescueTokens(token, to, amount); - } - - /// @inheritdoc IPool - /// @dev Deprecated: maintained for compatibility purposes - function deposit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external virtual override { - SupplyLogic.executeSupply( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteSupplyParams({ - asset: asset, - amount: amount, - onBehalfOf: onBehalfOf, - referralCode: referralCode - }) - ); - } - - /// @inheritdoc IPool - function getFlashLoanLogic() external pure returns (address) { - return address(FlashLoanLogic); - } - - /// @inheritdoc IPool - function getBorrowLogic() external pure returns (address) { - return address(BorrowLogic); - } - - /// @inheritdoc IPool - function getBridgeLogic() external pure returns (address) { - return address(BridgeLogic); - } - - /// @inheritdoc IPool - function getEModeLogic() external pure returns (address) { - return address(EModeLogic); - } - - /// @inheritdoc IPool - function getLiquidationLogic() external pure returns (address) { - return address(LiquidationLogic); - } - - /// @inheritdoc IPool - function getPoolLogic() external pure returns (address) { - return address(PoolLogic); - } - - /// @inheritdoc IPool - function getSupplyLogic() external pure returns (address) { - return address(SupplyLogic); - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/PoolInstance.sol - -contract PoolInstance is Pool { - uint256 public constant POOL_REVISION = 6; - - constructor(IPoolAddressesProvider provider) Pool(provider) {} - - /** - * @notice Initializes the Pool. - * @dev Function is invoked by the proxy contract when the Pool contract is added to the - * PoolAddressesProvider of the market. - * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations - * @param provider The address of the PoolAddressesProvider - */ - function initialize(IPoolAddressesProvider provider) external virtual override initializer { - require(provider == ADDRESSES_PROVIDER, Errors.INVALID_ADDRESSES_PROVIDER); - } - - function getRevision() internal pure virtual override returns (uint256) { - return POOL_REVISION; - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/L2Pool.sol - -/** - * @title L2Pool - * @author Aave - * @notice Calldata optimized extension of the Pool contract allowing users to pass compact calldata representation - * to reduce transaction costs on rollups. - */ -abstract contract L2Pool is Pool, IL2Pool { - /// @inheritdoc IL2Pool - function supply(bytes32 args) external override { - (address asset, uint256 amount, uint16 referralCode) = CalldataLogic.decodeSupplyParams( - _reservesList, - args - ); - - supply(asset, amount, msg.sender, referralCode); - } - - /// @inheritdoc IL2Pool - function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s) external override { - (address asset, uint256 amount, uint16 referralCode, uint256 deadline, uint8 v) = CalldataLogic - .decodeSupplyWithPermitParams(_reservesList, args); - - supplyWithPermit(asset, amount, msg.sender, referralCode, deadline, v, r, s); - } - - /// @inheritdoc IL2Pool - function withdraw(bytes32 args) external override returns (uint256) { - (address asset, uint256 amount) = CalldataLogic.decodeWithdrawParams(_reservesList, args); - - return withdraw(asset, amount, msg.sender); - } - - /// @inheritdoc IL2Pool - function borrow(bytes32 args) external override { - (address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode) = CalldataLogic - .decodeBorrowParams(_reservesList, args); - - borrow(asset, amount, interestRateMode, referralCode, msg.sender); - } - - /// @inheritdoc IL2Pool - function repay(bytes32 args) external override returns (uint256) { - (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( - _reservesList, - args - ); - - return repay(asset, amount, interestRateMode, msg.sender); - } - - /// @inheritdoc IL2Pool - function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) external override returns (uint256) { - ( - address asset, - uint256 amount, - uint256 interestRateMode, - uint256 deadline, - uint8 v - ) = CalldataLogic.decodeRepayWithPermitParams(_reservesList, args); - - return repayWithPermit(asset, amount, interestRateMode, msg.sender, deadline, v, r, s); - } - - /// @inheritdoc IL2Pool - function repayWithATokens(bytes32 args) external override returns (uint256) { - (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( - _reservesList, - args - ); - - return repayWithATokens(asset, amount, interestRateMode); - } - - /// @inheritdoc IL2Pool - function setUserUseReserveAsCollateral(bytes32 args) external override { - (address asset, bool useAsCollateral) = CalldataLogic.decodeSetUserUseReserveAsCollateralParams( - _reservesList, - args - ); - setUserUseReserveAsCollateral(asset, useAsCollateral); - } - - /// @inheritdoc IL2Pool - function liquidationCall(bytes32 args1, bytes32 args2) external override { - ( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) = CalldataLogic.decodeLiquidationCallParams(_reservesList, args1, args2); - liquidationCall(collateralAsset, debtAsset, user, debtToCover, receiveAToken); - } -} - -// downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/L2PoolInstance.sol - -contract L2PoolInstance is L2Pool, PoolInstance { - constructor(IPoolAddressesProvider provider) PoolInstance(provider) {} -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/L2PoolInstance.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/L2PoolInstance.sol deleted file mode 100644 index f323d4bd..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/L2PoolInstance.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {L2Pool} from '../protocol/pool/L2Pool.sol'; -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {PoolInstance} from './PoolInstance.sol'; - -contract L2PoolInstance is L2Pool, PoolInstance { - constructor(IPoolAddressesProvider provider) PoolInstance(provider) {} -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/PoolInstance.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/PoolInstance.sol deleted file mode 100644 index 02eafdd1..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/instances/PoolInstance.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {Pool} from '../protocol/pool/Pool.sol'; -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {Errors} from '../protocol/libraries/helpers/Errors.sol'; - -contract PoolInstance is Pool { - uint256 public constant POOL_REVISION = 6; - - constructor(IPoolAddressesProvider provider) Pool(provider) {} - - /** - * @notice Initializes the Pool. - * @dev Function is invoked by the proxy contract when the Pool contract is added to the - * PoolAddressesProvider of the market. - * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations - * @param provider The address of the PoolAddressesProvider - */ - function initialize(IPoolAddressesProvider provider) external virtual override initializer { - require(provider == ADDRESSES_PROVIDER, Errors.INVALID_ADDRESSES_PROVIDER); - } - - function getRevision() internal pure virtual override returns (uint256) { - return POOL_REVISION; - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IERC20WithPermit.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IERC20WithPermit.sol deleted file mode 100644 index 0fceb8c5..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IERC20WithPermit.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; - -/** - * @title IERC20WithPermit - * @author Aave - * @notice Interface for the permit function (EIP-2612) - */ -interface IERC20WithPermit is IERC20 { - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IL2Pool.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IL2Pool.sol deleted file mode 100644 index 56dee912..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IL2Pool.sol +++ /dev/null @@ -1,116 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IL2Pool - * @author Aave - * @notice Defines the basic extension interface for an L2 Aave Pool. - */ -interface IL2Pool { - /** - * @notice Calldata efficient wrapper of the supply function on behalf of the caller - * @param args Arguments for the supply function packed in one bytes32 - * 96 bits 16 bits 128 bits 16 bits - * | 0-padding | referralCode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - */ - function supply(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the supplyWithPermit function on behalf of the caller - * @param args Arguments for the supply function packed in one bytes32 - * 56 bits 8 bits 32 bits 16 bits 128 bits 16 bits - * | 0-padding | permitV | shortenedDeadline | referralCode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @param r The R parameter of ERC712 permit sig - * @param s The S parameter of ERC712 permit sig - */ - function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s) external; - - /** - * @notice Calldata efficient wrapper of the withdraw function, withdrawing to the caller - * @param args Arguments for the withdraw function packed in one bytes32 - * 112 bits 128 bits 16 bits - * | 0-padding | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @return The final amount withdrawn - */ - function withdraw(bytes32 args) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the borrow function, borrowing on behalf of the caller - * @param args Arguments for the borrow function packed in one bytes32 - * 88 bits 16 bits 8 bits 128 bits 16 bits - * | 0-padding | referralCode | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - */ - function borrow(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the repay function, repaying on behalf of the caller - * @param args Arguments for the repay function packed in one bytes32 - * 104 bits 8 bits 128 bits 16 bits - * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @return The final amount repaid - */ - function repay(bytes32 args) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the repayWithPermit function, repaying on behalf of the caller - * @param args Arguments for the repayWithPermit function packed in one bytes32 - * 64 bits 8 bits 32 bits 8 bits 128 bits 16 bits - * | 0-padding | permitV | shortenedDeadline | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @param r The R parameter of ERC712 permit sig - * @param s The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the repayWithATokens function - * @param args Arguments for the repayWithATokens function packed in one bytes32 - * 104 bits 8 bits 128 bits 16 bits - * | 0-padding | shortenedInterestRateMode | shortenedAmount | assetId | - * @dev the shortenedAmount is cast to 256 bits at decode time, if type(uint128).max the value will be expanded to - * type(uint256).max - * @dev assetId is the index of the asset in the reservesList. - * @return The final amount repaid - */ - function repayWithATokens(bytes32 args) external returns (uint256); - - /** - * @notice Calldata efficient wrapper of the setUserUseReserveAsCollateral function - * @param args Arguments for the setUserUseReserveAsCollateral function packed in one bytes32 - * 239 bits 1 bit 16 bits - * | 0-padding | useAsCollateral | assetId | - * @dev assetId is the index of the asset in the reservesList. - */ - function setUserUseReserveAsCollateral(bytes32 args) external; - - /** - * @notice Calldata efficient wrapper of the liquidationCall function - * @param args1 part of the arguments for the liquidationCall function packed in one bytes32 - * 64 bits 160 bits 16 bits 16 bits - * | 0-padding | user address | debtAssetId | collateralAssetId | - * @param args2 part of the arguments for the liquidationCall function packed in one bytes32 - * 127 bits 1 bit 128 bits - * | 0-padding | receiveAToken | shortenedDebtToCover | - * @dev the shortenedDebtToCover is cast to 256 bits at decode time, - * if type(uint128).max the value will be expanded to type(uint256).max - */ - function liquidationCall(bytes32 args1, bytes32 args2) external; -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPool.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index e7ba8f7a..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol deleted file mode 100644 index 1070227a..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol deleted file mode 100644 index a3a55684..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanReceiver.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; - -/** - * @title IFlashLoanReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - */ -interface IFlashLoanReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed assets - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param assets The addresses of the flash-borrowed assets - * @param amounts The amounts of the flash-borrowed assets - * @param premiums The fee of each flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata premiums, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol deleted file mode 100644 index bff21ae4..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; - -/** - * @title IFlashLoanSimpleReceiver - * @author Aave - * @notice Defines the basic interface of a flashloan-receiver contract. - * @dev Implement this interface to develop a flashloan-compatible flashLoanReceiver contract - */ -interface IFlashLoanSimpleReceiver { - /** - * @notice Executes an operation after receiving the flash-borrowed asset - * @dev Ensure that the contract can return the debt + premium, e.g., has - * enough funds to repay and has approved the Pool to pull the total amount - * @param asset The address of the flash-borrowed asset - * @param amount The amount of the flash-borrowed asset - * @param premium The fee of the flash-borrowed asset - * @param initiator The address of the flashloan initiator - * @param params The byte-encoded params passed when initiating the flashloan - * @return True if the execution of the operation succeeds, false otherwise - */ - function executeOperation( - address asset, - uint256 amount, - uint256 premium, - address initiator, - bytes calldata params - ) external returns (bool); - - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - function POOL() external view returns (IPool); -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BorrowLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BorrowLogic.sol deleted file mode 100644 index c4ed26ed..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BorrowLogic.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {IsolationModeLogic} from './IsolationModeLogic.sol'; - -/** - * @title BorrowLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to borrowing - */ -library BorrowLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the - * Aave protocol proportionally to their collateralization power. For isolated positions, it also increases the - * isolated debt. - * @dev Emits the `Borrow()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the borrow function - */ - function executeBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteBorrowParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ( - bool isolationModeActive, - address isolationModeCollateralAddress, - uint256 isolationModeDebtCeiling - ) = userConfig.getIsolationModeState(reservesData, reservesList); - - ValidationLogic.validateBorrow( - reservesData, - reservesList, - eModeCategories, - DataTypes.ValidateBorrowParams({ - reserveCache: reserveCache, - userConfig: userConfig, - asset: params.asset, - userAddress: params.onBehalfOf, - amount: params.amount, - interestRateMode: params.interestRateMode, - reservesCount: params.reservesCount, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory, - priceOracleSentinel: params.priceOracleSentinel, - isolationModeActive: isolationModeActive, - isolationModeCollateralAddress: isolationModeCollateralAddress, - isolationModeDebtCeiling: isolationModeDebtCeiling - }) - ); - - bool isFirstBorrowing = false; - - (isFirstBorrowing, reserveCache.nextScaledVariableDebt) = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).mint(params.user, params.onBehalfOf, params.amount, reserveCache.nextVariableBorrowIndex); - - if (isFirstBorrowing) { - userConfig.setBorrowing(reserve.id, true); - } - - if (isolationModeActive) { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt += (params.amount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - 0, - params.releaseUnderlying ? params.amount : 0 - ); - - if (params.releaseUnderlying) { - IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(params.user, params.amount); - } - - emit Borrow( - params.asset, - params.user, - params.onBehalfOf, - params.amount, - DataTypes.InterestRateMode.VARIABLE, - reserve.currentVariableBorrowRate, - params.referralCode - ); - } - - /** - * @notice Implements the repay feature. Repaying transfers the underlying back to the aToken and clears the - * equivalent amount of debt for the user by burning the corresponding debt token. For isolated positions, it also - * reduces the isolated debt. - * @dev Emits the `Repay()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the repay function - * @return The actual amount being repaid - */ - function executeRepay( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteRepayParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - - uint256 variableDebt = IERC20(reserveCache.variableDebtTokenAddress).balanceOf( - params.onBehalfOf - ); - - ValidationLogic.validateRepay( - reserveCache, - params.amount, - params.interestRateMode, - params.onBehalfOf, - variableDebt - ); - - uint256 paybackAmount = variableDebt; - - // Allows a user to repay with aTokens without leaving dust from interest. - if (params.useATokens && params.amount == type(uint256).max) { - params.amount = IAToken(reserveCache.aTokenAddress).balanceOf(msg.sender); - } - - if (params.amount < paybackAmount) { - paybackAmount = params.amount; - } - - reserveCache.nextScaledVariableDebt = IVariableDebtToken(reserveCache.variableDebtTokenAddress) - .burn(params.onBehalfOf, paybackAmount, reserveCache.nextVariableBorrowIndex); - - reserve.updateInterestRatesAndVirtualBalance( - reserveCache, - params.asset, - params.useATokens ? 0 : paybackAmount, - 0 - ); - - if (variableDebt - paybackAmount == 0) { - userConfig.setBorrowing(reserve.id, false); - } - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - reserveCache, - paybackAmount - ); - - if (params.useATokens) { - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - reserveCache.aTokenAddress, - paybackAmount, - reserveCache.nextLiquidityIndex - ); - // in case of aToken repayment the msg.sender must always repay on behalf of itself - if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - } else { - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, paybackAmount); - IAToken(reserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.onBehalfOf, - paybackAmount - ); - } - - emit Repay(params.asset, params.onBehalfOf, msg.sender, paybackAmount, params.useATokens); - - return paybackAmount; - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BridgeLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BridgeLogic.sol deleted file mode 100644 index 3b4d469b..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/BridgeLogic.sol +++ /dev/null @@ -1,150 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -library BridgeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @notice Mint unbacked aTokens to a user and updates the unbacked for the reserve. - * @dev Essentially a supply without transferring the underlying. - * @dev Emits the `MintUnbacked` event - * @dev Emits the `ReserveUsedAsCollateralEnabled` if asset is set as collateral - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param asset The address of the underlying asset to mint aTokens of - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function executeMintUnbacked( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, reserve, amount, onBehalfOf); - - uint256 unbackedMintCap = reserveCache.reserveConfiguration.getUnbackedMintCap(); - uint256 reserveDecimals = reserveCache.reserveConfiguration.getDecimals(); - - uint256 unbacked = reserve.unbacked += amount.toUint128(); - - require( - unbacked <= unbackedMintCap * (10 ** reserveDecimals), - Errors.UNBACKED_MINT_CAP_EXCEEDED - ); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, 0, 0); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - onBehalfOf, - amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration, - reserveCache.aTokenAddress - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); - } - } - - emit MintUnbacked(asset, msg.sender, onBehalfOf, amount, referralCode); - } - - /** - * @notice Back the current unbacked with `amount` and pay `fee`. - * @dev It is not possible to back more than the existing unbacked amount of the reserve - * @dev Emits the `BackUnbacked` event - * @param reserve The reserve to back unbacked for - * @param asset The address of the underlying asset to repay - * @param amount The amount to back - * @param fee The amount paid in fees - * @param protocolFeeBps The fraction of fees in basis points paid to the protocol - * @return The backed amount - */ - function executeBackUnbacked( - DataTypes.ReserveData storage reserve, - address asset, - uint256 amount, - uint256 fee, - uint256 protocolFeeBps - ) external returns (uint256) { - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - uint256 backingAmount = (amount < reserve.unbacked) ? amount : reserve.unbacked; - - uint256 feeToProtocol = fee.percentMul(protocolFeeBps); - uint256 feeToLP = fee - feeToProtocol; - uint256 added = backingAmount + fee; - - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply() + - uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), - feeToLP - ); - - reserve.accruedToTreasury += feeToProtocol.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - - reserve.unbacked -= backingAmount.toUint128(); - reserve.updateInterestRatesAndVirtualBalance(reserveCache, asset, added, 0); - - IERC20(asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, added); - - emit BackUnbacked(asset, msg.sender, backingAmount, fee); - - return backingAmount; - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/CalldataLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/CalldataLogic.sol deleted file mode 100644 index 742cbcbf..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/CalldataLogic.sol +++ /dev/null @@ -1,233 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title CalldataLogic library - * @author Aave - * @notice Library to decode calldata, used to optimize calldata size in L2Pool for transaction cost reduction - */ -library CalldataLogic { - /** - * @notice Decodes compressed supply params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed supply params - * @return The address of the underlying reserve - * @return The amount to supply - * @return The referralCode - */ - function decodeSupplyParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint16) { - uint16 assetId; - uint256 amount; - uint16 referralCode; - - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - referralCode := and(shr(144, args), 0xFFFF) - } - return (reservesList[assetId], amount, referralCode); - } - - /** - * @notice Decodes compressed supply params to standard params along with permit params - * @param reservesList The addresses of all the active reserves - * @param args The packed supply with permit params - * @return The address of the underlying reserve - * @return The amount to supply - * @return The referralCode - * @return The deadline of the permit - * @return The V value of the permit signature - */ - function decodeSupplyWithPermitParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint16, uint256, uint8) { - uint256 deadline; - uint8 permitV; - - assembly { - deadline := and(shr(160, args), 0xFFFFFFFF) - permitV := and(shr(192, args), 0xFF) - } - (address asset, uint256 amount, uint16 referralCode) = decodeSupplyParams(reservesList, args); - - return (asset, amount, referralCode, deadline, permitV); - } - - /** - * @notice Decodes compressed withdraw params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed withdraw params - * @return The address of the underlying reserve - * @return The amount to withdraw - */ - function decodeWithdrawParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256) { - uint16 assetId; - uint256 amount; - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - } - if (amount == type(uint128).max) { - amount = type(uint256).max; - } - return (reservesList[assetId], amount); - } - - /** - * @notice Decodes compressed borrow params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed borrow params - * @return The address of the underlying reserve - * @return The amount to borrow - * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) - * @return The referralCode - */ - function decodeBorrowParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint256, uint16) { - uint16 assetId; - uint256 amount; - uint256 interestRateMode; - uint16 referralCode; - - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - interestRateMode := and(shr(144, args), 0xFF) - referralCode := and(shr(152, args), 0xFFFF) - } - - return (reservesList[assetId], amount, interestRateMode, referralCode); - } - - /** - * @notice Decodes compressed repay params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed repay params - * @return The address of the underlying reserve - * @return The amount to repay - * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) - */ - function decodeRepayParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint256) { - uint16 assetId; - uint256 amount; - uint256 interestRateMode; - - assembly { - assetId := and(args, 0xFFFF) - amount := and(shr(16, args), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - interestRateMode := and(shr(144, args), 0xFF) - } - - if (amount == type(uint128).max) { - amount = type(uint256).max; - } - - return (reservesList[assetId], amount, interestRateMode); - } - - /** - * @notice Decodes compressed repay params to standard params along with permit params - * @param reservesList The addresses of all the active reserves - * @param args The packed repay with permit params - * @return The address of the underlying reserve - * @return The amount to repay - * @return The interestRateMode, 2 for variable debt, 1 is deprecated (changed on v3.2.0) - * @return The deadline of the permit - * @return The V value of the permit signature - */ - function decodeRepayWithPermitParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, uint256, uint256, uint256, uint8) { - uint256 deadline; - uint8 permitV; - - (address asset, uint256 amount, uint256 interestRateMode) = decodeRepayParams( - reservesList, - args - ); - - assembly { - deadline := and(shr(152, args), 0xFFFFFFFF) - permitV := and(shr(184, args), 0xFF) - } - - return (asset, amount, interestRateMode, deadline, permitV); - } - - /** - * @notice Decodes compressed set user use reserve as collateral params to standard params - * @param reservesList The addresses of all the active reserves - * @param args The packed set user use reserve as collateral params - * @return The address of the underlying reserve - * @return True if to set using as collateral, false otherwise - */ - function decodeSetUserUseReserveAsCollateralParams( - mapping(uint256 => address) storage reservesList, - bytes32 args - ) internal view returns (address, bool) { - uint16 assetId; - bool useAsCollateral; - assembly { - assetId := and(args, 0xFFFF) - useAsCollateral := and(shr(16, args), 0x1) - } - return (reservesList[assetId], useAsCollateral); - } - - /** - * @notice Decodes compressed liquidation call params to standard params - * @param reservesList The addresses of all the active reserves - * @param args1 The first half of packed liquidation call params - * @param args2 The second half of the packed liquidation call params - * @return The address of the underlying collateral asset - * @return The address of the underlying debt asset - * @return The address of the user to liquidate - * @return The amount of debt to cover - * @return True if receiving aTokens, false otherwise - */ - function decodeLiquidationCallParams( - mapping(uint256 => address) storage reservesList, - bytes32 args1, - bytes32 args2 - ) internal view returns (address, address, address, uint256, bool) { - uint16 collateralAssetId; - uint16 debtAssetId; - address user; - uint256 debtToCover; - bool receiveAToken; - - assembly { - collateralAssetId := and(args1, 0xFFFF) - debtAssetId := and(shr(16, args1), 0xFFFF) - user := and(shr(32, args1), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - - debtToCover := and(args2, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) - receiveAToken := and(shr(128, args2), 0x1) - } - - if (debtToCover == type(uint128).max) { - debtToCover = type(uint256).max; - } - - return ( - reservesList[collateralAssetId], - reservesList[debtAssetId], - user, - debtToCover, - receiveAToken - ); - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index 647fc7e7..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol deleted file mode 100644 index 31ffb288..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol +++ /dev/null @@ -1,277 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IFlashLoanReceiver} from '../../../misc/flashloan/interfaces/IFlashLoanReceiver.sol'; -import {IFlashLoanSimpleReceiver} from '../../../misc/flashloan/interfaces/IFlashLoanSimpleReceiver.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {BorrowLogic} from './BorrowLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title FlashLoanLogic library - * @author Aave - * @notice Implements the logic for the flash loans - */ -library FlashLoanLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - - // See `IPool` for descriptions - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - // Helper struct for internal variables used in the `executeFlashLoan` function - struct FlashLoanLocalVars { - IFlashLoanReceiver receiver; - address currentAsset; - uint256 currentAmount; - uint256[] totalPremiums; - uint256 flashloanPremiumTotal; - uint256 flashloanPremiumToProtocol; - } - - /** - * @notice Implements the flashloan feature that allow users to access liquidity of the pool for one transaction - * as long as the amount taken plus fee is returned or debt is opened. - * @dev For authorized flashborrowers the fee is waived - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the flashloan function - */ - function executeFlashLoan( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.FlashloanParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloan(reservesData, params.assets, params.amounts); - - FlashLoanLocalVars memory vars; - - vars.totalPremiums = new uint256[](params.assets.length); - - vars.receiver = IFlashLoanReceiver(params.receiverAddress); - (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = params.isAuthorizedFlashBorrower - ? (0, 0) - : (params.flashLoanPremiumTotal, params.flashLoanPremiumToProtocol); - - for (uint256 i = 0; i < params.assets.length; i++) { - vars.currentAmount = params.amounts[i]; - vars.totalPremiums[i] = DataTypes.InterestRateMode(params.interestRateModes[i]) == - DataTypes.InterestRateMode.NONE - ? vars.currentAmount.percentMul(vars.flashloanPremiumTotal) - : 0; - - if (reservesData[params.assets[i]].configuration.getIsVirtualAccActive()) { - reservesData[params.assets[i]].virtualUnderlyingBalance -= vars.currentAmount.toUint128(); - } - - IAToken(reservesData[params.assets[i]].aTokenAddress).transferUnderlyingTo( - params.receiverAddress, - vars.currentAmount - ); - } - - require( - vars.receiver.executeOperation( - params.assets, - params.amounts, - vars.totalPremiums, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - for (uint256 i = 0; i < params.assets.length; i++) { - vars.currentAsset = params.assets[i]; - vars.currentAmount = params.amounts[i]; - - if ( - DataTypes.InterestRateMode(params.interestRateModes[i]) == DataTypes.InterestRateMode.NONE - ) { - _handleFlashLoanRepayment( - reservesData[vars.currentAsset], - DataTypes.FlashLoanRepaymentParams({ - asset: vars.currentAsset, - receiverAddress: params.receiverAddress, - amount: vars.currentAmount, - totalPremium: vars.totalPremiums[i], - flashLoanPremiumToProtocol: vars.flashloanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } else { - // If the user chose to not return the funds, the system checks if there is enough collateral and - // eventually opens a debt position - BorrowLogic.executeBorrow( - reservesData, - reservesList, - eModeCategories, - userConfig, - DataTypes.ExecuteBorrowParams({ - asset: vars.currentAsset, - user: msg.sender, - onBehalfOf: params.onBehalfOf, - amount: vars.currentAmount, - interestRateMode: DataTypes.InterestRateMode(params.interestRateModes[i]), - referralCode: params.referralCode, - releaseUnderlying: false, - reservesCount: IPool(params.pool).getReservesCount(), - oracle: IPoolAddressesProvider(params.addressesProvider).getPriceOracle(), - userEModeCategory: IPool(params.pool).getUserEMode(params.onBehalfOf).toUint8(), - priceOracleSentinel: IPoolAddressesProvider(params.addressesProvider) - .getPriceOracleSentinel() - }) - ); - // no premium is paid when taking on the flashloan as debt - emit FlashLoan( - params.receiverAddress, - msg.sender, - vars.currentAsset, - vars.currentAmount, - DataTypes.InterestRateMode(params.interestRateModes[i]), - 0, - params.referralCode - ); - } - } - } - - /** - * @notice Implements the simple flashloan feature that allow users to access liquidity of ONE reserve for one - * transaction as long as the amount taken plus fee is returned. - * @dev Does not waive fee for approved flashborrowers nor allow taking on debt instead of repaying to save gas - * @dev At the end of the transaction the pool will pull amount borrowed + fee from the receiver, - * if the receiver have not approved the pool the transaction will revert. - * @dev Emits the `FlashLoan()` event - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the simple flashloan function - */ - function executeFlashLoanSimple( - DataTypes.ReserveData storage reserve, - DataTypes.FlashloanSimpleParams memory params - ) external { - // The usual action flow (cache -> updateState -> validation -> changeState -> updateRates) - // is altered to (validation -> user payload -> cache -> updateState -> changeState -> updateRates) for flashloans. - // This is done to protect against reentrance and rate manipulation within the user specified payload. - - ValidationLogic.validateFlashloanSimple(reserve, params.amount); - - IFlashLoanSimpleReceiver receiver = IFlashLoanSimpleReceiver(params.receiverAddress); - uint256 totalPremium = params.amount.percentMul(params.flashLoanPremiumTotal); - - if (reserve.configuration.getIsVirtualAccActive()) { - reserve.virtualUnderlyingBalance -= params.amount.toUint128(); - } - - IAToken(reserve.aTokenAddress).transferUnderlyingTo(params.receiverAddress, params.amount); - - require( - receiver.executeOperation( - params.asset, - params.amount, - totalPremium, - msg.sender, - params.params - ), - Errors.INVALID_FLASHLOAN_EXECUTOR_RETURN - ); - - _handleFlashLoanRepayment( - reserve, - DataTypes.FlashLoanRepaymentParams({ - asset: params.asset, - receiverAddress: params.receiverAddress, - amount: params.amount, - totalPremium: totalPremium, - flashLoanPremiumToProtocol: params.flashLoanPremiumToProtocol, - referralCode: params.referralCode - }) - ); - } - - /** - * @notice Handles repayment of flashloaned assets + premium - * @dev Will pull the amount + premium from the receiver, so must have approved pool - * @param reserve The state of the flashloaned reserve - * @param params The additional parameters needed to execute the repayment function - */ - function _handleFlashLoanRepayment( - DataTypes.ReserveData storage reserve, - DataTypes.FlashLoanRepaymentParams memory params - ) internal { - uint256 premiumToProtocol = params.totalPremium.percentMul(params.flashLoanPremiumToProtocol); - uint256 premiumToLP = params.totalPremium - premiumToProtocol; - uint256 amountPlusPremium = params.amount + params.totalPremium; - - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - reserveCache.nextLiquidityIndex = reserve.cumulateToLiquidityIndex( - IERC20(reserveCache.aTokenAddress).totalSupply() + - uint256(reserve.accruedToTreasury).rayMul(reserveCache.nextLiquidityIndex), - premiumToLP - ); - - reserve.accruedToTreasury += premiumToProtocol - .rayDiv(reserveCache.nextLiquidityIndex) - .toUint128(); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, amountPlusPremium, 0); - - IERC20(params.asset).safeTransferFrom( - params.receiverAddress, - reserveCache.aTokenAddress, - amountPlusPremium - ); - - IAToken(reserveCache.aTokenAddress).handleRepayment( - params.receiverAddress, - params.receiverAddress, - amountPlusPremium - ); - - emit FlashLoan( - params.receiverAddress, - msg.sender, - params.asset, - params.amount, - DataTypes.InterestRateMode.NONE, - params.totalPremium, - params.referralCode - ); - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index cd5b83c6..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol deleted file mode 100644 index 473840ea..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/LiquidationLogic.sol deleted file mode 100644 index 8f4c35f6..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ /dev/null @@ -1,460 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts//IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {PercentageMath} from '../../libraries/math/PercentageMath.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {DataTypes} from '../../libraries/types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {IsolationModeLogic} from './IsolationModeLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; -import {UserConfiguration} from '../../libraries/configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../../libraries/configuration/ReserveConfiguration.sol'; -import {EModeConfiguration} from '../../libraries/configuration/EModeConfiguration.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; - -/** - * @title LiquidationLogic library - * @author Aave - * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations - */ -library LiquidationLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Default percentage of borrower's debt to be repaid in a liquidation. - * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 0.5e4 results in 50.00% - */ - uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; - - /** - * @dev Maximum percentage of borrower's debt to be repaid in a liquidation - * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 1e4 results in 100.00% - */ - uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; - - /** - * @dev This constant represents below which health factor value it is possible to liquidate - * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. - * A value of 0.95e18 results in 0.95 - */ - uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; - - struct LiquidationCallLocalVars { - uint256 userCollateralBalance; - uint256 userTotalDebt; - uint256 actualDebtToLiquidate; - uint256 actualCollateralToLiquidate; - uint256 liquidationBonus; - uint256 healthFactor; - uint256 liquidationProtocolFeeAmount; - IAToken collateralAToken; - DataTypes.ReserveCache debtReserveCache; - } - - /** - * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) - * covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportional amount of the `collateralAsset` plus a bonus to cover market risk - * @dev Emits the `LiquidationCall()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params The additional parameters needed to execute the liquidation function - */ - function executeLiquidationCall( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ExecuteLiquidationCallParams memory params - ) external { - LiquidationCallLocalVars memory vars; - - DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; - DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; - DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; - vars.debtReserveCache = debtReserve.cache(); - debtReserve.updateState(vars.debtReserveCache); - - (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: params.reservesCount, - user: params.user, - oracle: params.priceOracle, - userEModeCategory: params.userEModeCategory - }) - ); - - (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( - vars.debtReserveCache, - params, - vars.healthFactor - ); - - ValidationLogic.validateLiquidationCall( - userConfig, - collateralReserve, - debtReserve, - DataTypes.ValidateLiquidationCallParams({ - debtReserveCache: vars.debtReserveCache, - totalDebt: vars.userTotalDebt, - healthFactor: vars.healthFactor, - priceOracleSentinel: params.priceOracleSentinel - }) - ); - - vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); - if ( - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - collateralReserve.id - ) - ) { - vars.liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; - } else { - vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); - } - - vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); - - ( - vars.actualCollateralToLiquidate, - vars.actualDebtToLiquidate, - vars.liquidationProtocolFeeAmount - ) = _calculateAvailableCollateralToLiquidate( - collateralReserve, - vars.debtReserveCache, - params.collateralAsset, - params.debtAsset, - vars.actualDebtToLiquidate, - vars.userCollateralBalance, - vars.liquidationBonus, - IPriceOracleGetter(params.priceOracle) - ); - - if (vars.userTotalDebt == vars.actualDebtToLiquidate) { - userConfig.setBorrowing(debtReserve.id, false); - } - - // If the collateral being liquidated is equal to the user balance, - // we set the currency as not being used as collateral anymore - if ( - vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == - vars.userCollateralBalance - ) { - userConfig.setUsingAsCollateral(collateralReserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); - } - - _burnDebtTokens(params, vars); - - debtReserve.updateInterestRatesAndVirtualBalance( - vars.debtReserveCache, - params.debtAsset, - vars.actualDebtToLiquidate, - 0 - ); - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - vars.debtReserveCache, - vars.actualDebtToLiquidate - ); - - if (params.receiveAToken) { - _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); - } else { - _burnCollateralATokens(collateralReserve, params, vars); - } - - // Transfer fee to treasury if it is non-zero - if (vars.liquidationProtocolFeeAmount != 0) { - uint256 liquidityIndex = collateralReserve.getNormalizedIncome(); - uint256 scaledDownLiquidationProtocolFee = vars.liquidationProtocolFeeAmount.rayDiv( - liquidityIndex - ); - uint256 scaledDownUserBalance = vars.collateralAToken.scaledBalanceOf(params.user); - // To avoid trying to send more aTokens than available on balance, due to 1 wei imprecision - if (scaledDownLiquidationProtocolFee > scaledDownUserBalance) { - vars.liquidationProtocolFeeAmount = scaledDownUserBalance.rayMul(liquidityIndex); - } - vars.collateralAToken.transferOnLiquidation( - params.user, - vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), - vars.liquidationProtocolFeeAmount - ); - } - - // Transfers the debt asset being repaid to the aToken, where the liquidity is kept - IERC20(params.debtAsset).safeTransferFrom( - msg.sender, - vars.debtReserveCache.aTokenAddress, - vars.actualDebtToLiquidate - ); - - IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.user, - vars.actualDebtToLiquidate - ); - - emit LiquidationCall( - params.collateralAsset, - params.debtAsset, - params.user, - vars.actualDebtToLiquidate, - vars.actualCollateralToLiquidate, - msg.sender, - params.receiveAToken - ); - } - - /** - * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. - * @dev The function also updates the state and the interest rate of the collateral reserve. - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _burnCollateralATokens( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); - collateralReserve.updateState(collateralReserveCache); - collateralReserve.updateInterestRatesAndVirtualBalance( - collateralReserveCache, - params.collateralAsset, - 0, - vars.actualCollateralToLiquidate - ); - - // Burn the equivalent amount of aToken, sending the underlying to the liquidator - vars.collateralAToken.burn( - params.user, - msg.sender, - vars.actualCollateralToLiquidate, - collateralReserveCache.nextLiquidityIndex - ); - } - - /** - * @notice Liquidates the user aTokens by transferring them to the liquidator. - * @dev The function also checks the state of the liquidator and activates the aToken as collateral - * as in standard transfers if the isolation mode constraints are respected. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _liquidateATokens( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); - vars.collateralAToken.transferOnLiquidation( - params.user, - msg.sender, - vars.actualCollateralToLiquidate - ); - - if (liquidatorPreviousATokenBalance == 0) { - DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - liquidatorConfig, - collateralReserve.configuration, - collateralReserve.aTokenAddress - ) - ) { - liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); - } - } - } - - /** - * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. - * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. - * @param params The additional parameters needed to execute the liquidation function - * @param vars the executeLiquidationCall() function local vars - */ - function _burnDebtTokens( - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( - vars.debtReserveCache.variableDebtTokenAddress - ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); - } - - /** - * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor - * and corresponding close factor. - * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR - * @param debtReserveCache The reserve cache data object of the debt reserve - * @param params The additional parameters needed to execute the liquidation function - * @param healthFactor The health factor of the position - * @return The total debt of the user - * @return The actual debt to liquidate as a function of the closeFactor - */ - function _calculateDebt( - DataTypes.ReserveCache memory debtReserveCache, - DataTypes.ExecuteLiquidationCallParams memory params, - uint256 healthFactor - ) internal view returns (uint256, uint256) { - uint256 userVariableDebt = IERC20(debtReserveCache.variableDebtTokenAddress).balanceOf( - params.user - ); - - uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD - ? DEFAULT_LIQUIDATION_CLOSE_FACTOR - : MAX_LIQUIDATION_CLOSE_FACTOR; - - uint256 maxLiquidatableDebt = userVariableDebt.percentMul(closeFactor); - - uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt - ? maxLiquidatableDebt - : params.debtToCover; - - return (userVariableDebt, actualDebtToLiquidate); - } - - struct AvailableCollateralToLiquidateLocalVars { - uint256 collateralPrice; - uint256 debtAssetPrice; - uint256 maxCollateralToLiquidate; - uint256 baseCollateral; - uint256 bonusCollateral; - uint256 debtAssetDecimals; - uint256 collateralDecimals; - uint256 collateralAssetUnit; - uint256 debtAssetUnit; - uint256 collateralAmount; - uint256 debtAmountNeeded; - uint256 liquidationProtocolFeePercentage; - uint256 liquidationProtocolFee; - } - - /** - * @notice Calculates how much of a specific collateral can be liquidated, given - * a certain amount of debt asset. - * @dev This function needs to be called after all the checks to validate the liquidation have been performed, - * otherwise it might fail. - * @param collateralReserve The data of the collateral reserve - * @param debtReserveCache The cached data of the debt reserve - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated - * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation - * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) - * @return The amount to repay with the liquidation - * @return The fee taken from the liquidation bonus amount to be paid to the protocol - */ - function _calculateAvailableCollateralToLiquidate( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveCache memory debtReserveCache, - address collateralAsset, - address debtAsset, - uint256 debtToCover, - uint256 userCollateralBalance, - uint256 liquidationBonus, - IPriceOracleGetter oracle - ) internal view returns (uint256, uint256, uint256) { - AvailableCollateralToLiquidateLocalVars memory vars; - - vars.collateralPrice = oracle.getAssetPrice(collateralAsset); - vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); - - vars.collateralDecimals = collateralReserve.configuration.getDecimals(); - vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); - - unchecked { - vars.collateralAssetUnit = 10 ** vars.collateralDecimals; - vars.debtAssetUnit = 10 ** vars.debtAssetDecimals; - } - - vars.liquidationProtocolFeePercentage = collateralReserve - .configuration - .getLiquidationProtocolFee(); - - // This is the base collateral to liquidate based on the given debt to cover - vars.baseCollateral = - ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / - (vars.collateralPrice * vars.debtAssetUnit); - - vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); - - if (vars.maxCollateralToLiquidate > userCollateralBalance) { - vars.collateralAmount = userCollateralBalance; - vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / - (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); - } else { - vars.collateralAmount = vars.maxCollateralToLiquidate; - vars.debtAmountNeeded = debtToCover; - } - - if (vars.liquidationProtocolFeePercentage != 0) { - vars.bonusCollateral = - vars.collateralAmount - - vars.collateralAmount.percentDiv(liquidationBonus); - - vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( - vars.liquidationProtocolFeePercentage - ); - - return ( - vars.collateralAmount - vars.liquidationProtocolFee, - vars.debtAmountNeeded, - vars.liquidationProtocolFee - ); - } else { - return (vars.collateralAmount, vars.debtAmountNeeded, 0); - } - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/PoolLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/PoolLogic.sol deleted file mode 100644 index 1558fe55..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/PoolLogic.sol +++ /dev/null @@ -1,201 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; - -/** - * @title PoolLogic library - * @author Aave - * @notice Implements the logic for Pool specific functions - */ -library PoolLogic { - using GPv2SafeERC20 for IERC20; - using WadRayMath for uint256; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice Initialize an asset reserve and add the reserve to the list of reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param params Additional parameters needed for initiation - * @return true if appended, false if inserted at existing empty spot - */ - function executeInitReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.InitReserveParams memory params - ) external returns (bool) { - require(Address.isContract(params.asset), Errors.NOT_CONTRACT); - reservesData[params.asset].init( - params.aTokenAddress, - params.variableDebtAddress, - params.interestRateStrategyAddress - ); - - bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || - reservesList[0] == params.asset; - require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); - - for (uint16 i = 0; i < params.reservesCount; i++) { - if (reservesList[i] == address(0)) { - reservesData[params.asset].id = i; - reservesList[i] = params.asset; - return false; - } - } - - require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); - reservesData[params.asset].id = params.reservesCount; - reservesList[params.reservesCount] = params.asset; - return true; - } - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function executeRescueTokens(address token, address to, uint256 amount) external { - IERC20(token).safeTransfer(to, amount); - } - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param reservesData The state of all the reserves - * @param assets The list of reserves for which the minting needs to be executed - */ - function executeMintToTreasury( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] calldata assets - ) external { - for (uint256 i = 0; i < assets.length; i++) { - address assetAddress = assets[i]; - - DataTypes.ReserveData storage reserve = reservesData[assetAddress]; - - // this cover both inactive reserves and invalid reserves since the flag will be 0 for both - if (!reserve.configuration.getActive()) { - continue; - } - - uint256 accruedToTreasury = reserve.accruedToTreasury; - - if (accruedToTreasury != 0) { - reserve.accruedToTreasury = 0; - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); - IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); - - emit MintedToTreasury(assetAddress, amountToMint); - } - } - } - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function executeResetIsolationModeTotalDebt( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset - ) external { - require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); - reservesData[asset].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(asset, 0); - } - - /** - * @notice Sets the liquidation grace period of the asset - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - */ - function executeSetLiquidationGracePeriod( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset, - uint40 until - ) external { - reservesData[asset].liquidationGracePeriodUntil = until; - } - - /** - * @notice Drop a reserve - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param asset The address of the underlying asset of the reserve - */ - function executeDropReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - address asset - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - ValidationLogic.validateDropReserve(reservesList, reserve, asset); - reservesList[reservesData[asset].id] = address(0); - delete reservesData[asset]; - } - - /** - * @notice Returns the user account data across all the reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the calculation - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function executeGetUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ) - { - ( - totalCollateralBase, - totalDebtBase, - ltv, - currentLiquidationThreshold, - healthFactor, - - ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); - - availableBorrowsBase = GenericLogic.calculateAvailableBorrows( - totalCollateralBase, - totalDebtBase, - ltv - ); - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index dd5c637d..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/SupplyLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/SupplyLogic.sol deleted file mode 100644 index 727886e7..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/SupplyLogic.sol +++ /dev/null @@ -1,300 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; - -/** - * @title SupplyLogic library - * @author Aave - * @notice Implements the base logic for supply/withdraw - */ -library SupplyLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. - * @dev Emits the `Supply()` event. - * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as - * collateral. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the supply function - */ - function executeSupply( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSupplyParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, reserve, params.amount, params.onBehalfOf); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, params.amount, 0); - - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - params.onBehalfOf, - params.amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration, - reserveCache.aTokenAddress - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); - } - } - - emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); - } - - /** - * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset - * previously supplied in the Aave protocol. - * @dev Emits the `Withdraw()` event. - * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the withdraw function - * @return The actual amount withdrawn - */ - function executeWithdraw( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteWithdrawParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - require(params.to != reserveCache.aTokenAddress, Errors.WITHDRAW_TO_ATOKEN); - - reserve.updateState(reserveCache); - - uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( - reserveCache.nextLiquidityIndex - ); - - uint256 amountToWithdraw = params.amount; - - if (params.amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - - ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, amountToWithdraw); - - bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); - - if (isCollateral && amountToWithdraw == userBalance) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - params.to, - amountToWithdraw, - reserveCache.nextLiquidityIndex - ); - - if (isCollateral && userConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - params.asset, - msg.sender, - params.reservesCount, - params.oracle, - params.userEModeCategory - ); - } - - emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); - - return amountToWithdraw; - } - - /** - * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid - * collateralization constraints violation. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as - * collateral. - * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param params The additional parameters needed to execute the finalizeTransfer function - */ - function executeFinalizeTransfer( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.FinalizeTransferParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - - ValidationLogic.validateTransfer(reserve); - - uint256 reserveId = reserve.id; - uint256 scaledAmount = params.amount.rayDiv(reserve.getNormalizedIncome()); - - if (params.from != params.to && scaledAmount != 0) { - DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; - - if (fromConfig.isUsingAsCollateral(reserveId)) { - if (fromConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - usersConfig[params.from], - params.asset, - params.from, - params.reservesCount, - params.oracle, - params.fromEModeCategory - ); - } - if (params.balanceFromBefore == params.amount) { - fromConfig.setUsingAsCollateral(reserveId, false); - emit ReserveUsedAsCollateralDisabled(params.asset, params.from); - } - } - - if (params.balanceToBefore == 0) { - DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - toConfig, - reserve.configuration, - reserve.aTokenAddress - ) - ) { - toConfig.setUsingAsCollateral(reserveId, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.to); - } - } - } - } - - /** - * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as - * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor - * checks to ensure collateralization. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. - * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The users configuration mapping that track the supplied/borrowed assets - * @param asset The address of the asset being configured as collateral - * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise - * @param reservesCount The number of initialized reserves - * @param priceOracle The address of the price oracle - * @param userEModeCategory The eMode category chosen by the user - */ - function executeUseReserveAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - bool useAsCollateral, - uint256 reservesCount, - address priceOracle, - uint8 userEModeCategory - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); - - ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); - - if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; - - if (useAsCollateral) { - require( - ValidationLogic.validateUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration - ), - Errors.USER_IN_ISOLATION_MODE_OR_LTV_ZERO - ); - - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, msg.sender); - } else { - userConfig.setUsingAsCollateral(reserve.id, false); - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - asset, - msg.sender, - reservesCount, - priceOracle, - userEModeCategory - ); - - emit ReserveUsedAsCollateralDisabled(asset, msg.sender); - } - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index e08a30e8..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index 9adca939..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/L2Pool.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/L2Pool.sol deleted file mode 100644 index d8925717..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/L2Pool.sol +++ /dev/null @@ -1,102 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {Pool} from './Pool.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {IL2Pool} from '../../interfaces/IL2Pool.sol'; -import {CalldataLogic} from '../libraries/logic/CalldataLogic.sol'; - -/** - * @title L2Pool - * @author Aave - * @notice Calldata optimized extension of the Pool contract allowing users to pass compact calldata representation - * to reduce transaction costs on rollups. - */ -abstract contract L2Pool is Pool, IL2Pool { - /// @inheritdoc IL2Pool - function supply(bytes32 args) external override { - (address asset, uint256 amount, uint16 referralCode) = CalldataLogic.decodeSupplyParams( - _reservesList, - args - ); - - supply(asset, amount, msg.sender, referralCode); - } - - /// @inheritdoc IL2Pool - function supplyWithPermit(bytes32 args, bytes32 r, bytes32 s) external override { - (address asset, uint256 amount, uint16 referralCode, uint256 deadline, uint8 v) = CalldataLogic - .decodeSupplyWithPermitParams(_reservesList, args); - - supplyWithPermit(asset, amount, msg.sender, referralCode, deadline, v, r, s); - } - - /// @inheritdoc IL2Pool - function withdraw(bytes32 args) external override returns (uint256) { - (address asset, uint256 amount) = CalldataLogic.decodeWithdrawParams(_reservesList, args); - - return withdraw(asset, amount, msg.sender); - } - - /// @inheritdoc IL2Pool - function borrow(bytes32 args) external override { - (address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode) = CalldataLogic - .decodeBorrowParams(_reservesList, args); - - borrow(asset, amount, interestRateMode, referralCode, msg.sender); - } - - /// @inheritdoc IL2Pool - function repay(bytes32 args) external override returns (uint256) { - (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( - _reservesList, - args - ); - - return repay(asset, amount, interestRateMode, msg.sender); - } - - /// @inheritdoc IL2Pool - function repayWithPermit(bytes32 args, bytes32 r, bytes32 s) external override returns (uint256) { - ( - address asset, - uint256 amount, - uint256 interestRateMode, - uint256 deadline, - uint8 v - ) = CalldataLogic.decodeRepayWithPermitParams(_reservesList, args); - - return repayWithPermit(asset, amount, interestRateMode, msg.sender, deadline, v, r, s); - } - - /// @inheritdoc IL2Pool - function repayWithATokens(bytes32 args) external override returns (uint256) { - (address asset, uint256 amount, uint256 interestRateMode) = CalldataLogic.decodeRepayParams( - _reservesList, - args - ); - - return repayWithATokens(asset, amount, interestRateMode); - } - - /// @inheritdoc IL2Pool - function setUserUseReserveAsCollateral(bytes32 args) external override { - (address asset, bool useAsCollateral) = CalldataLogic.decodeSetUserUseReserveAsCollateralParams( - _reservesList, - args - ); - setUserUseReserveAsCollateral(asset, useAsCollateral); - } - - /// @inheritdoc IL2Pool - function liquidationCall(bytes32 args1, bytes32 args2) external override { - ( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) = CalldataLogic.decodeLiquidationCallParams(_reservesList, args1, args2); - liquidationCall(collateralAsset, debtAsset, user, debtToCover, receiveAToken); - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/Pool.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/Pool.sol deleted file mode 100644 index 72445e47..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/Pool.sol +++ /dev/null @@ -1,871 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '../../misc/aave-upgradeability/VersionedInitializable.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; -import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; -import {PoolLogic} from '../libraries/logic/PoolLogic.sol'; -import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; -import {EModeLogic} from '../libraries/logic/EModeLogic.sol'; -import {SupplyLogic} from '../libraries/logic/SupplyLogic.sol'; -import {FlashLoanLogic} from '../libraries/logic/FlashLoanLogic.sol'; -import {BorrowLogic} from '../libraries/logic/BorrowLogic.sol'; -import {LiquidationLogic} from '../libraries/logic/LiquidationLogic.sol'; -import {DataTypes} from '../libraries/types/DataTypes.sol'; -import {BridgeLogic} from '../libraries/logic/BridgeLogic.sol'; -import {IERC20WithPermit} from '../../interfaces/IERC20WithPermit.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../interfaces/IPool.sol'; -import {IACLManager} from '../../interfaces/IACLManager.sol'; -import {PoolStorage} from './PoolStorage.sol'; - -/** - * @title Pool contract - * @author Aave - * @notice Main point of interaction with an Aave protocol's market - * - Users can: - * # Supply - * # Withdraw - * # Borrow - * # Repay - * # Enable/disable their supplied assets as collateral - * # Liquidate positions - * # Execute Flash Loans - * @dev To be covered by a proxy contract, owned by the PoolAddressesProvider of the specific market - * @dev All admin functions are callable by the PoolConfigurator contract defined also in the - * PoolAddressesProvider - */ -abstract contract Pool is VersionedInitializable, PoolStorage, IPool { - using ReserveLogic for DataTypes.ReserveData; - - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @dev Only pool configurator can call functions marked by this modifier. - */ - modifier onlyPoolConfigurator() { - _onlyPoolConfigurator(); - _; - } - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - _onlyPoolAdmin(); - _; - } - - /** - * @dev Only bridge can call functions marked by this modifier. - */ - modifier onlyBridge() { - _onlyBridge(); - _; - } - - function _onlyPoolConfigurator() internal view virtual { - require( - ADDRESSES_PROVIDER.getPoolConfigurator() == msg.sender, - Errors.CALLER_NOT_POOL_CONFIGURATOR - ); - } - - function _onlyPoolAdmin() internal view virtual { - require( - IACLManager(ADDRESSES_PROVIDER.getACLManager()).isPoolAdmin(msg.sender), - Errors.CALLER_NOT_POOL_ADMIN - ); - } - - function _onlyBridge() internal view virtual { - require( - IACLManager(ADDRESSES_PROVIDER.getACLManager()).isBridge(msg.sender), - Errors.CALLER_NOT_BRIDGE - ); - } - - /** - * @dev Constructor. - * @param provider The address of the PoolAddressesProvider contract - */ - constructor(IPoolAddressesProvider provider) { - ADDRESSES_PROVIDER = provider; - } - - /** - * @notice Initializes the Pool. - * @dev Function is invoked by the proxy contract when the Pool contract is added to the - * PoolAddressesProvider of the market. - * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations - * @param provider The address of the PoolAddressesProvider - */ - function initialize(IPoolAddressesProvider provider) external virtual; - - /// @inheritdoc IPool - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external virtual override onlyBridge { - BridgeLogic.executeMintUnbacked( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - asset, - amount, - onBehalfOf, - referralCode - ); - } - - /// @inheritdoc IPool - function backUnbacked( - address asset, - uint256 amount, - uint256 fee - ) external virtual override onlyBridge returns (uint256) { - return - BridgeLogic.executeBackUnbacked(_reserves[asset], asset, amount, fee, _bridgeProtocolFee); - } - - /// @inheritdoc IPool - function supply( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) public virtual override { - SupplyLogic.executeSupply( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteSupplyParams({ - asset: asset, - amount: amount, - onBehalfOf: onBehalfOf, - referralCode: referralCode - }) - ); - } - - /// @inheritdoc IPool - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) public virtual override { - try - IERC20WithPermit(asset).permit( - msg.sender, - address(this), - amount, - deadline, - permitV, - permitR, - permitS - ) - {} catch {} - SupplyLogic.executeSupply( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteSupplyParams({ - asset: asset, - amount: amount, - onBehalfOf: onBehalfOf, - referralCode: referralCode - }) - ); - } - - /// @inheritdoc IPool - function withdraw( - address asset, - uint256 amount, - address to - ) public virtual override returns (uint256) { - return - SupplyLogic.executeWithdraw( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[msg.sender], - DataTypes.ExecuteWithdrawParams({ - asset: asset, - amount: amount, - to: to, - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[msg.sender] - }) - ); - } - - /// @inheritdoc IPool - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) public virtual override { - BorrowLogic.executeBorrow( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[onBehalfOf], - DataTypes.ExecuteBorrowParams({ - asset: asset, - user: msg.sender, - onBehalfOf: onBehalfOf, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - referralCode: referralCode, - releaseUnderlying: true, - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[onBehalfOf], - priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() - }) - ); - } - - /// @inheritdoc IPool - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) public virtual override returns (uint256) { - return - BorrowLogic.executeRepay( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteRepayParams({ - asset: asset, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - onBehalfOf: onBehalfOf, - useATokens: false - }) - ); - } - - /// @inheritdoc IPool - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) public virtual override returns (uint256) { - try - IERC20WithPermit(asset).permit( - msg.sender, - address(this), - amount, - deadline, - permitV, - permitR, - permitS - ) - {} catch {} - - { - DataTypes.ExecuteRepayParams memory params = DataTypes.ExecuteRepayParams({ - asset: asset, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - onBehalfOf: onBehalfOf, - useATokens: false - }); - return BorrowLogic.executeRepay(_reserves, _reservesList, _usersConfig[onBehalfOf], params); - } - } - - /// @inheritdoc IPool - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) public virtual override returns (uint256) { - return - BorrowLogic.executeRepay( - _reserves, - _reservesList, - _usersConfig[msg.sender], - DataTypes.ExecuteRepayParams({ - asset: asset, - amount: amount, - interestRateMode: DataTypes.InterestRateMode(interestRateMode), - onBehalfOf: msg.sender, - useATokens: true - }) - ); - } - - /// @inheritdoc IPool - function setUserUseReserveAsCollateral( - address asset, - bool useAsCollateral - ) public virtual override { - SupplyLogic.executeUseReserveAsCollateral( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[msg.sender], - asset, - useAsCollateral, - _reservesCount, - ADDRESSES_PROVIDER.getPriceOracle(), - _usersEModeCategory[msg.sender] - ); - } - - /// @inheritdoc IPool - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) public virtual override { - LiquidationLogic.executeLiquidationCall( - _reserves, - _reservesList, - _usersConfig, - _eModeCategories, - DataTypes.ExecuteLiquidationCallParams({ - reservesCount: _reservesCount, - debtToCover: debtToCover, - collateralAsset: collateralAsset, - debtAsset: debtAsset, - user: user, - receiveAToken: receiveAToken, - priceOracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[user], - priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel() - }) - ); - } - - /// @inheritdoc IPool - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) public virtual override { - DataTypes.FlashloanParams memory flashParams = DataTypes.FlashloanParams({ - receiverAddress: receiverAddress, - assets: assets, - amounts: amounts, - interestRateModes: interestRateModes, - onBehalfOf: onBehalfOf, - params: params, - referralCode: referralCode, - flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, - flashLoanPremiumTotal: _flashLoanPremiumTotal, - reservesCount: _reservesCount, - addressesProvider: address(ADDRESSES_PROVIDER), - pool: address(this), - userEModeCategory: _usersEModeCategory[onBehalfOf], - isAuthorizedFlashBorrower: IACLManager(ADDRESSES_PROVIDER.getACLManager()).isFlashBorrower( - msg.sender - ) - }); - - FlashLoanLogic.executeFlashLoan( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[onBehalfOf], - flashParams - ); - } - - /// @inheritdoc IPool - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) public virtual override { - DataTypes.FlashloanSimpleParams memory flashParams = DataTypes.FlashloanSimpleParams({ - receiverAddress: receiverAddress, - asset: asset, - amount: amount, - params: params, - referralCode: referralCode, - flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol, - flashLoanPremiumTotal: _flashLoanPremiumTotal - }); - FlashLoanLogic.executeFlashLoanSimple(_reserves[asset], flashParams); - } - - /// @inheritdoc IPool - function mintToTreasury(address[] calldata assets) external virtual override { - PoolLogic.executeMintToTreasury(_reserves, assets); - } - - /// @inheritdoc IPool - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory) { - return _reserves[asset]; - } - - /// @inheritdoc IPool - function getReserveData( - address asset - ) external view virtual override returns (DataTypes.ReserveDataLegacy memory) { - DataTypes.ReserveData memory reserve = _reserves[asset]; - DataTypes.ReserveDataLegacy memory res; - - res.configuration = reserve.configuration; - res.liquidityIndex = reserve.liquidityIndex; - res.currentLiquidityRate = reserve.currentLiquidityRate; - res.variableBorrowIndex = reserve.variableBorrowIndex; - res.currentVariableBorrowRate = reserve.currentVariableBorrowRate; - res.lastUpdateTimestamp = reserve.lastUpdateTimestamp; - res.id = reserve.id; - res.aTokenAddress = reserve.aTokenAddress; - res.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - res.interestRateStrategyAddress = reserve.interestRateStrategyAddress; - res.accruedToTreasury = reserve.accruedToTreasury; - res.unbacked = reserve.unbacked; - res.isolationModeTotalDebt = reserve.isolationModeTotalDebt; - // This is a temporary workaround for integrations that are broken by Aave 3.2 - // While the new pool data provider is backward compatible, some integrations hard-code an old implementation - // To allow them to not have any infrastructural blocker, a mock must be configured in the Aave Pool Addresses Provider, returning zero on all required view methods, instead of reverting - res.stableDebtTokenAddress = ADDRESSES_PROVIDER.getAddress(bytes32('MOCK_STABLE_DEBT')); - return res; - } - - /// @inheritdoc IPool - function getVirtualUnderlyingBalance( - address asset - ) external view virtual override returns (uint128) { - return _reserves[asset].virtualUnderlyingBalance; - } - - /// @inheritdoc IPool - function getUserAccountData( - address user - ) - external - view - virtual - override - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ) - { - return - PoolLogic.executeGetUserAccountData( - _reserves, - _reservesList, - _eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: _usersConfig[user], - reservesCount: _reservesCount, - user: user, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[user] - }) - ); - } - - /// @inheritdoc IPool - function getConfiguration( - address asset - ) external view virtual override returns (DataTypes.ReserveConfigurationMap memory) { - return _reserves[asset].configuration; - } - - /// @inheritdoc IPool - function getUserConfiguration( - address user - ) external view virtual override returns (DataTypes.UserConfigurationMap memory) { - return _usersConfig[user]; - } - - /// @inheritdoc IPool - function getReserveNormalizedIncome( - address asset - ) external view virtual override returns (uint256) { - return _reserves[asset].getNormalizedIncome(); - } - - /// @inheritdoc IPool - function getReserveNormalizedVariableDebt( - address asset - ) external view virtual override returns (uint256) { - return _reserves[asset].getNormalizedDebt(); - } - - /// @inheritdoc IPool - function getReservesList() external view virtual override returns (address[] memory) { - uint256 reservesListCount = _reservesCount; - uint256 droppedReservesCount = 0; - address[] memory reservesList = new address[](reservesListCount); - - for (uint256 i = 0; i < reservesListCount; i++) { - if (_reservesList[i] != address(0)) { - reservesList[i - droppedReservesCount] = _reservesList[i]; - } else { - droppedReservesCount++; - } - } - - // Reduces the length of the reserves array by `droppedReservesCount` - assembly { - mstore(reservesList, sub(reservesListCount, droppedReservesCount)) - } - return reservesList; - } - - /// @inheritdoc IPool - function getReservesCount() external view virtual override returns (uint256) { - return _reservesCount; - } - - /// @inheritdoc IPool - function getReserveAddressById(uint16 id) external view returns (address) { - return _reservesList[id]; - } - - /// @inheritdoc IPool - function BRIDGE_PROTOCOL_FEE() public view virtual override returns (uint256) { - return _bridgeProtocolFee; - } - - /// @inheritdoc IPool - function FLASHLOAN_PREMIUM_TOTAL() public view virtual override returns (uint128) { - return _flashLoanPremiumTotal; - } - - /// @inheritdoc IPool - function FLASHLOAN_PREMIUM_TO_PROTOCOL() public view virtual override returns (uint128) { - return _flashLoanPremiumToProtocol; - } - - /// @inheritdoc IPool - function MAX_NUMBER_RESERVES() public view virtual override returns (uint16) { - return ReserveConfiguration.MAX_RESERVES_COUNT; - } - - /// @inheritdoc IPool - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external virtual override { - require(msg.sender == _reserves[asset].aTokenAddress, Errors.CALLER_NOT_ATOKEN); - SupplyLogic.executeFinalizeTransfer( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig, - DataTypes.FinalizeTransferParams({ - asset: asset, - from: from, - to: to, - amount: amount, - balanceFromBefore: balanceFromBefore, - balanceToBefore: balanceToBefore, - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - fromEModeCategory: _usersEModeCategory[from] - }) - ); - } - - /// @inheritdoc IPool - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external virtual override onlyPoolConfigurator { - if ( - PoolLogic.executeInitReserve( - _reserves, - _reservesList, - DataTypes.InitReserveParams({ - asset: asset, - aTokenAddress: aTokenAddress, - variableDebtAddress: variableDebtAddress, - interestRateStrategyAddress: interestRateStrategyAddress, - reservesCount: _reservesCount, - maxNumberReserves: MAX_NUMBER_RESERVES() - }) - ) - ) { - _reservesCount++; - } - } - - /// @inheritdoc IPool - function dropReserve(address asset) external virtual override onlyPoolConfigurator { - PoolLogic.executeDropReserve(_reserves, _reservesList, asset); - } - - /// @inheritdoc IPool - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external virtual override onlyPoolConfigurator { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - - _reserves[asset].interestRateStrategyAddress = rateStrategyAddress; - } - - /// @inheritdoc IPool - function syncIndexesState(address asset) external virtual override onlyPoolConfigurator { - DataTypes.ReserveData storage reserve = _reserves[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - } - - /// @inheritdoc IPool - function syncRatesState(address asset) external virtual override onlyPoolConfigurator { - DataTypes.ReserveData storage reserve = _reserves[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - ReserveLogic.updateInterestRatesAndVirtualBalance(reserve, reserveCache, asset, 0, 0); - } - - /// @inheritdoc IPool - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external virtual override onlyPoolConfigurator { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - _reserves[asset].configuration = configuration; - } - - /// @inheritdoc IPool - function updateBridgeProtocolFee( - uint256 protocolFee - ) external virtual override onlyPoolConfigurator { - _bridgeProtocolFee = protocolFee; - } - - /// @inheritdoc IPool - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external virtual override onlyPoolConfigurator { - _flashLoanPremiumTotal = flashLoanPremiumTotal; - _flashLoanPremiumToProtocol = flashLoanPremiumToProtocol; - } - - /// @inheritdoc IPool - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory category - ) external virtual override onlyPoolConfigurator { - // category 0 is reserved for volatile heterogeneous assets and it's always disabled - require(id != 0, Errors.EMODE_CATEGORY_RESERVED); - _eModeCategories[id].ltv = category.ltv; - _eModeCategories[id].liquidationThreshold = category.liquidationThreshold; - _eModeCategories[id].liquidationBonus = category.liquidationBonus; - _eModeCategories[id].label = category.label; - } - - /// @inheritdoc IPool - function configureEModeCategoryCollateralBitmap( - uint8 id, - uint128 collateralBitmap - ) external virtual override onlyPoolConfigurator { - // category 0 is reserved for volatile heterogeneous assets and it's always disabled - require(id != 0, Errors.EMODE_CATEGORY_RESERVED); - _eModeCategories[id].collateralBitmap = collateralBitmap; - } - - /// @inheritdoc IPool - function configureEModeCategoryBorrowableBitmap( - uint8 id, - uint128 borrowableBitmap - ) external virtual override onlyPoolConfigurator { - // category 0 is reserved for volatile heterogeneous assets and it's always disabled - require(id != 0, Errors.EMODE_CATEGORY_RESERVED); - _eModeCategories[id].borrowableBitmap = borrowableBitmap; - } - - /// @inheritdoc IPool - function getEModeCategoryData( - uint8 id - ) external view virtual override returns (DataTypes.EModeCategoryLegacy memory) { - DataTypes.EModeCategory memory category = _eModeCategories[id]; - return - DataTypes.EModeCategoryLegacy({ - ltv: category.ltv, - liquidationThreshold: category.liquidationThreshold, - liquidationBonus: category.liquidationBonus, - priceSource: address(0), - label: category.label - }); - } - - /// @inheritdoc IPool - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory) { - return - DataTypes.CollateralConfig({ - ltv: _eModeCategories[id].ltv, - liquidationThreshold: _eModeCategories[id].liquidationThreshold, - liquidationBonus: _eModeCategories[id].liquidationBonus - }); - } - - /// @inheritdoc IPool - function getEModeCategoryLabel(uint8 id) external view returns (string memory) { - return _eModeCategories[id].label; - } - - /// @inheritdoc IPool - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128) { - return _eModeCategories[id].collateralBitmap; - } - - /// @inheritdoc IPool - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128) { - return _eModeCategories[id].borrowableBitmap; - } - - /// @inheritdoc IPool - function setUserEMode(uint8 categoryId) external virtual override { - EModeLogic.executeSetUserEMode( - _reserves, - _reservesList, - _eModeCategories, - _usersEModeCategory, - _usersConfig[msg.sender], - DataTypes.ExecuteSetUserEModeParams({ - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - categoryId: categoryId - }) - ); - } - - /// @inheritdoc IPool - function getUserEMode(address user) external view virtual override returns (uint256) { - return _usersEModeCategory[user]; - } - - /// @inheritdoc IPool - function resetIsolationModeTotalDebt( - address asset - ) external virtual override onlyPoolConfigurator { - PoolLogic.executeResetIsolationModeTotalDebt(_reserves, asset); - } - - /// @inheritdoc IPool - function getLiquidationGracePeriod(address asset) external virtual override returns (uint40) { - return _reserves[asset].liquidationGracePeriodUntil; - } - - /// @inheritdoc IPool - function setLiquidationGracePeriod( - address asset, - uint40 until - ) external virtual override onlyPoolConfigurator { - require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - PoolLogic.executeSetLiquidationGracePeriod(_reserves, asset, until); - } - - /// @inheritdoc IPool - function rescueTokens( - address token, - address to, - uint256 amount - ) external virtual override onlyPoolAdmin { - PoolLogic.executeRescueTokens(token, to, amount); - } - - /// @inheritdoc IPool - /// @dev Deprecated: maintained for compatibility purposes - function deposit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external virtual override { - SupplyLogic.executeSupply( - _reserves, - _reservesList, - _usersConfig[onBehalfOf], - DataTypes.ExecuteSupplyParams({ - asset: asset, - amount: amount, - onBehalfOf: onBehalfOf, - referralCode: referralCode - }) - ); - } - - /// @inheritdoc IPool - function getFlashLoanLogic() external pure returns (address) { - return address(FlashLoanLogic); - } - - /// @inheritdoc IPool - function getBorrowLogic() external pure returns (address) { - return address(BorrowLogic); - } - - /// @inheritdoc IPool - function getBridgeLogic() external pure returns (address) { - return address(BridgeLogic); - } - - /// @inheritdoc IPool - function getEModeLogic() external pure returns (address) { - return address(EModeLogic); - } - - /// @inheritdoc IPool - function getLiquidationLogic() external pure returns (address) { - return address(LiquidationLogic); - } - - /// @inheritdoc IPool - function getPoolLogic() external pure returns (address) { - return address(PoolLogic); - } - - /// @inheritdoc IPool - function getSupplyLogic() external pure returns (address) { - return address(SupplyLogic); - } -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/PoolStorage.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/PoolStorage.sol deleted file mode 100644 index 719461e4..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/pool/PoolStorage.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {UserConfiguration} from '../libraries/configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; -import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; -import {DataTypes} from '../libraries/types/DataTypes.sol'; - -/** - * @title PoolStorage - * @author Aave - * @notice Contract used as storage of the Pool contract. - * @dev It defines the storage layout of the Pool contract. - */ -contract PoolStorage { - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - // Map of reserves and their data (underlyingAssetOfReserve => reserveData) - mapping(address => DataTypes.ReserveData) internal _reserves; - - // Map of users address and their configuration data (userAddress => userConfiguration) - mapping(address => DataTypes.UserConfigurationMap) internal _usersConfig; - - // List of reserves as a map (reserveId => reserve). - // It is structured as a mapping for gas savings reasons, using the reserve id as index - mapping(uint256 => address) internal _reservesList; - - // List of eMode categories as a map (eModeCategoryId => eModeCategory). - // It is structured as a mapping for gas savings reasons, using the eModeCategoryId as index - mapping(uint8 => DataTypes.EModeCategory) internal _eModeCategories; - - // Map of users address and their eMode category (userAddress => eModeCategoryId) - mapping(address => uint8) internal _usersEModeCategory; - - // Fee of the protocol bridge, expressed in bps - uint256 internal _bridgeProtocolFee; - - // Total FlashLoan Premium, expressed in bps - uint128 internal _flashLoanPremiumTotal; - - // FlashLoan premium paid to protocol treasury, expressed in bps - uint128 internal _flashLoanPremiumToProtocol; - - // DEPRECATED on v3.2.0 - uint64 internal __DEPRECATED_maxStableRateBorrowSizePercent; - - // Maximum number of active reserves there have been in the protocol. It is the upper bound of the reserves list - uint16 internal _reservesCount; -} diff --git a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/LINEA/L2_POOL_IMPL/L2PoolInstance/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC.sol b/downloads/LINEA/LIQUIDATION_LOGIC.sol deleted file mode 100644 index 00aebcf4..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC.sol +++ /dev/null @@ -1,6038 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} - -// downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol - -/** - * @title LiquidationLogic library - * @author Aave - * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations - */ -library LiquidationLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Default percentage of borrower's debt to be repaid in a liquidation. - * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 0.5e4 results in 50.00% - */ - uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; - - /** - * @dev Maximum percentage of borrower's debt to be repaid in a liquidation - * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 1e4 results in 100.00% - */ - uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; - - /** - * @dev This constant represents below which health factor value it is possible to liquidate - * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. - * A value of 0.95e18 results in 0.95 - */ - uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; - - struct LiquidationCallLocalVars { - uint256 userCollateralBalance; - uint256 userTotalDebt; - uint256 actualDebtToLiquidate; - uint256 actualCollateralToLiquidate; - uint256 liquidationBonus; - uint256 healthFactor; - uint256 liquidationProtocolFeeAmount; - IAToken collateralAToken; - DataTypes.ReserveCache debtReserveCache; - } - - /** - * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) - * covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportional amount of the `collateralAsset` plus a bonus to cover market risk - * @dev Emits the `LiquidationCall()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params The additional parameters needed to execute the liquidation function - */ - function executeLiquidationCall( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ExecuteLiquidationCallParams memory params - ) external { - LiquidationCallLocalVars memory vars; - - DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; - DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; - DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; - vars.debtReserveCache = debtReserve.cache(); - debtReserve.updateState(vars.debtReserveCache); - - (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: params.reservesCount, - user: params.user, - oracle: params.priceOracle, - userEModeCategory: params.userEModeCategory - }) - ); - - (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( - vars.debtReserveCache, - params, - vars.healthFactor - ); - - ValidationLogic.validateLiquidationCall( - userConfig, - collateralReserve, - debtReserve, - DataTypes.ValidateLiquidationCallParams({ - debtReserveCache: vars.debtReserveCache, - totalDebt: vars.userTotalDebt, - healthFactor: vars.healthFactor, - priceOracleSentinel: params.priceOracleSentinel - }) - ); - - vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); - if ( - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - collateralReserve.id - ) - ) { - vars.liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; - } else { - vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); - } - - vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); - - ( - vars.actualCollateralToLiquidate, - vars.actualDebtToLiquidate, - vars.liquidationProtocolFeeAmount - ) = _calculateAvailableCollateralToLiquidate( - collateralReserve, - vars.debtReserveCache, - params.collateralAsset, - params.debtAsset, - vars.actualDebtToLiquidate, - vars.userCollateralBalance, - vars.liquidationBonus, - IPriceOracleGetter(params.priceOracle) - ); - - if (vars.userTotalDebt == vars.actualDebtToLiquidate) { - userConfig.setBorrowing(debtReserve.id, false); - } - - // If the collateral being liquidated is equal to the user balance, - // we set the currency as not being used as collateral anymore - if ( - vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == - vars.userCollateralBalance - ) { - userConfig.setUsingAsCollateral(collateralReserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); - } - - _burnDebtTokens(params, vars); - - debtReserve.updateInterestRatesAndVirtualBalance( - vars.debtReserveCache, - params.debtAsset, - vars.actualDebtToLiquidate, - 0 - ); - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - vars.debtReserveCache, - vars.actualDebtToLiquidate - ); - - if (params.receiveAToken) { - _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); - } else { - _burnCollateralATokens(collateralReserve, params, vars); - } - - // Transfer fee to treasury if it is non-zero - if (vars.liquidationProtocolFeeAmount != 0) { - uint256 liquidityIndex = collateralReserve.getNormalizedIncome(); - uint256 scaledDownLiquidationProtocolFee = vars.liquidationProtocolFeeAmount.rayDiv( - liquidityIndex - ); - uint256 scaledDownUserBalance = vars.collateralAToken.scaledBalanceOf(params.user); - // To avoid trying to send more aTokens than available on balance, due to 1 wei imprecision - if (scaledDownLiquidationProtocolFee > scaledDownUserBalance) { - vars.liquidationProtocolFeeAmount = scaledDownUserBalance.rayMul(liquidityIndex); - } - vars.collateralAToken.transferOnLiquidation( - params.user, - vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), - vars.liquidationProtocolFeeAmount - ); - } - - // Transfers the debt asset being repaid to the aToken, where the liquidity is kept - IERC20(params.debtAsset).safeTransferFrom( - msg.sender, - vars.debtReserveCache.aTokenAddress, - vars.actualDebtToLiquidate - ); - - IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.user, - vars.actualDebtToLiquidate - ); - - emit LiquidationCall( - params.collateralAsset, - params.debtAsset, - params.user, - vars.actualDebtToLiquidate, - vars.actualCollateralToLiquidate, - msg.sender, - params.receiveAToken - ); - } - - /** - * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. - * @dev The function also updates the state and the interest rate of the collateral reserve. - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _burnCollateralATokens( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); - collateralReserve.updateState(collateralReserveCache); - collateralReserve.updateInterestRatesAndVirtualBalance( - collateralReserveCache, - params.collateralAsset, - 0, - vars.actualCollateralToLiquidate - ); - - // Burn the equivalent amount of aToken, sending the underlying to the liquidator - vars.collateralAToken.burn( - params.user, - msg.sender, - vars.actualCollateralToLiquidate, - collateralReserveCache.nextLiquidityIndex - ); - } - - /** - * @notice Liquidates the user aTokens by transferring them to the liquidator. - * @dev The function also checks the state of the liquidator and activates the aToken as collateral - * as in standard transfers if the isolation mode constraints are respected. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _liquidateATokens( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); - vars.collateralAToken.transferOnLiquidation( - params.user, - msg.sender, - vars.actualCollateralToLiquidate - ); - - if (liquidatorPreviousATokenBalance == 0) { - DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - liquidatorConfig, - collateralReserve.configuration, - collateralReserve.aTokenAddress - ) - ) { - liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); - } - } - } - - /** - * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. - * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. - * @param params The additional parameters needed to execute the liquidation function - * @param vars the executeLiquidationCall() function local vars - */ - function _burnDebtTokens( - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( - vars.debtReserveCache.variableDebtTokenAddress - ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); - } - - /** - * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor - * and corresponding close factor. - * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR - * @param debtReserveCache The reserve cache data object of the debt reserve - * @param params The additional parameters needed to execute the liquidation function - * @param healthFactor The health factor of the position - * @return The total debt of the user - * @return The actual debt to liquidate as a function of the closeFactor - */ - function _calculateDebt( - DataTypes.ReserveCache memory debtReserveCache, - DataTypes.ExecuteLiquidationCallParams memory params, - uint256 healthFactor - ) internal view returns (uint256, uint256) { - uint256 userVariableDebt = IERC20(debtReserveCache.variableDebtTokenAddress).balanceOf( - params.user - ); - - uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD - ? DEFAULT_LIQUIDATION_CLOSE_FACTOR - : MAX_LIQUIDATION_CLOSE_FACTOR; - - uint256 maxLiquidatableDebt = userVariableDebt.percentMul(closeFactor); - - uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt - ? maxLiquidatableDebt - : params.debtToCover; - - return (userVariableDebt, actualDebtToLiquidate); - } - - struct AvailableCollateralToLiquidateLocalVars { - uint256 collateralPrice; - uint256 debtAssetPrice; - uint256 maxCollateralToLiquidate; - uint256 baseCollateral; - uint256 bonusCollateral; - uint256 debtAssetDecimals; - uint256 collateralDecimals; - uint256 collateralAssetUnit; - uint256 debtAssetUnit; - uint256 collateralAmount; - uint256 debtAmountNeeded; - uint256 liquidationProtocolFeePercentage; - uint256 liquidationProtocolFee; - } - - /** - * @notice Calculates how much of a specific collateral can be liquidated, given - * a certain amount of debt asset. - * @dev This function needs to be called after all the checks to validate the liquidation have been performed, - * otherwise it might fail. - * @param collateralReserve The data of the collateral reserve - * @param debtReserveCache The cached data of the debt reserve - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated - * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation - * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) - * @return The amount to repay with the liquidation - * @return The fee taken from the liquidation bonus amount to be paid to the protocol - */ - function _calculateAvailableCollateralToLiquidate( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveCache memory debtReserveCache, - address collateralAsset, - address debtAsset, - uint256 debtToCover, - uint256 userCollateralBalance, - uint256 liquidationBonus, - IPriceOracleGetter oracle - ) internal view returns (uint256, uint256, uint256) { - AvailableCollateralToLiquidateLocalVars memory vars; - - vars.collateralPrice = oracle.getAssetPrice(collateralAsset); - vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); - - vars.collateralDecimals = collateralReserve.configuration.getDecimals(); - vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); - - unchecked { - vars.collateralAssetUnit = 10 ** vars.collateralDecimals; - vars.debtAssetUnit = 10 ** vars.debtAssetDecimals; - } - - vars.liquidationProtocolFeePercentage = collateralReserve - .configuration - .getLiquidationProtocolFee(); - - // This is the base collateral to liquidate based on the given debt to cover - vars.baseCollateral = - ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / - (vars.collateralPrice * vars.debtAssetUnit); - - vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); - - if (vars.maxCollateralToLiquidate > userCollateralBalance) { - vars.collateralAmount = userCollateralBalance; - vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / - (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); - } else { - vars.collateralAmount = vars.maxCollateralToLiquidate; - vars.debtAmountNeeded = debtToCover; - } - - if (vars.liquidationProtocolFeePercentage != 0) { - vars.bonusCollateral = - vars.collateralAmount - - vars.collateralAmount.percentDiv(liquidationBonus); - - vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( - vars.liquidationProtocolFeePercentage - ); - - return ( - vars.collateralAmount - vars.liquidationProtocolFee, - vars.debtAmountNeeded, - vars.liquidationProtocolFee - ); - } else { - return (vars.collateralAmount, vars.debtAmountNeeded, 0); - } - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index e7ba8f7a..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index 647fc7e7..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index cd5b83c6..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol deleted file mode 100644 index 473840ea..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/IsolationModeLogic.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title IsolationModeLogic library - * @author Aave - * @notice Implements the base logic for handling repayments for assets borrowed in isolation mode - */ -library IsolationModeLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using SafeCast for uint256; - - // See `IPool` for descriptions - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping - * @param reserveCache The cached data of the reserve - * @param repayAmount The amount being repaid - */ - function updateIsolatedDebtIfIsolated( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveCache memory reserveCache, - uint256 repayAmount - ) internal { - (bool isolationModeActive, address isolationModeCollateralAddress, ) = userConfig - .getIsolationModeState(reservesData, reservesList); - - if (isolationModeActive) { - uint128 isolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt; - - uint128 isolatedDebtRepaid = (repayAmount / - 10 ** - (reserveCache.reserveConfiguration.getDecimals() - - ReserveConfiguration.DEBT_CEILING_DECIMALS)).toUint128(); - - // since the debt ceiling does not take into account the interest accrued, it might happen that amount - // repaid > debt in isolation mode - if (isolationModeTotalDebt <= isolatedDebtRepaid) { - reservesData[isolationModeCollateralAddress].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0); - } else { - uint256 nextIsolationModeTotalDebt = reservesData[isolationModeCollateralAddress] - .isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid; - emit IsolationModeTotalDebtUpdated( - isolationModeCollateralAddress, - nextIsolationModeTotalDebt - ); - } - } - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol deleted file mode 100644 index 8f4c35f6..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ /dev/null @@ -1,460 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts//IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {PercentageMath} from '../../libraries/math/PercentageMath.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {DataTypes} from '../../libraries/types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {IsolationModeLogic} from './IsolationModeLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; -import {UserConfiguration} from '../../libraries/configuration/UserConfiguration.sol'; -import {ReserveConfiguration} from '../../libraries/configuration/ReserveConfiguration.sol'; -import {EModeConfiguration} from '../../libraries/configuration/EModeConfiguration.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; - -/** - * @title LiquidationLogic library - * @author Aave - * @notice Implements actions involving management of collateral in the protocol, the main one being the liquidations - */ -library LiquidationLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using GPv2SafeERC20 for IERC20; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Default percentage of borrower's debt to be repaid in a liquidation. - * @dev Percentage applied when the users health factor is above `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 0.5e4 results in 50.00% - */ - uint256 internal constant DEFAULT_LIQUIDATION_CLOSE_FACTOR = 0.5e4; - - /** - * @dev Maximum percentage of borrower's debt to be repaid in a liquidation - * @dev Percentage applied when the users health factor is below `CLOSE_FACTOR_HF_THRESHOLD` - * Expressed in bps, a value of 1e4 results in 100.00% - */ - uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; - - /** - * @dev This constant represents below which health factor value it is possible to liquidate - * an amount of debt corresponding to `MAX_LIQUIDATION_CLOSE_FACTOR`. - * A value of 0.95e18 results in 0.95 - */ - uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; - - struct LiquidationCallLocalVars { - uint256 userCollateralBalance; - uint256 userTotalDebt; - uint256 actualDebtToLiquidate; - uint256 actualCollateralToLiquidate; - uint256 liquidationBonus; - uint256 healthFactor; - uint256 liquidationProtocolFeeAmount; - IAToken collateralAToken; - DataTypes.ReserveCache debtReserveCache; - } - - /** - * @notice Function to liquidate a position if its Health Factor drops below 1. The caller (liquidator) - * covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportional amount of the `collateralAsset` plus a bonus to cover market risk - * @dev Emits the `LiquidationCall()` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params The additional parameters needed to execute the liquidation function - */ - function executeLiquidationCall( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ExecuteLiquidationCallParams memory params - ) external { - LiquidationCallLocalVars memory vars; - - DataTypes.ReserveData storage collateralReserve = reservesData[params.collateralAsset]; - DataTypes.ReserveData storage debtReserve = reservesData[params.debtAsset]; - DataTypes.UserConfigurationMap storage userConfig = usersConfig[params.user]; - vars.debtReserveCache = debtReserve.cache(); - debtReserve.updateState(vars.debtReserveCache); - - (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: params.reservesCount, - user: params.user, - oracle: params.priceOracle, - userEModeCategory: params.userEModeCategory - }) - ); - - (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( - vars.debtReserveCache, - params, - vars.healthFactor - ); - - ValidationLogic.validateLiquidationCall( - userConfig, - collateralReserve, - debtReserve, - DataTypes.ValidateLiquidationCallParams({ - debtReserveCache: vars.debtReserveCache, - totalDebt: vars.userTotalDebt, - healthFactor: vars.healthFactor, - priceOracleSentinel: params.priceOracleSentinel - }) - ); - - vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); - if ( - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - collateralReserve.id - ) - ) { - vars.liquidationBonus = eModeCategories[params.userEModeCategory].liquidationBonus; - } else { - vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); - } - - vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); - - ( - vars.actualCollateralToLiquidate, - vars.actualDebtToLiquidate, - vars.liquidationProtocolFeeAmount - ) = _calculateAvailableCollateralToLiquidate( - collateralReserve, - vars.debtReserveCache, - params.collateralAsset, - params.debtAsset, - vars.actualDebtToLiquidate, - vars.userCollateralBalance, - vars.liquidationBonus, - IPriceOracleGetter(params.priceOracle) - ); - - if (vars.userTotalDebt == vars.actualDebtToLiquidate) { - userConfig.setBorrowing(debtReserve.id, false); - } - - // If the collateral being liquidated is equal to the user balance, - // we set the currency as not being used as collateral anymore - if ( - vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == - vars.userCollateralBalance - ) { - userConfig.setUsingAsCollateral(collateralReserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); - } - - _burnDebtTokens(params, vars); - - debtReserve.updateInterestRatesAndVirtualBalance( - vars.debtReserveCache, - params.debtAsset, - vars.actualDebtToLiquidate, - 0 - ); - - IsolationModeLogic.updateIsolatedDebtIfIsolated( - reservesData, - reservesList, - userConfig, - vars.debtReserveCache, - vars.actualDebtToLiquidate - ); - - if (params.receiveAToken) { - _liquidateATokens(reservesData, reservesList, usersConfig, collateralReserve, params, vars); - } else { - _burnCollateralATokens(collateralReserve, params, vars); - } - - // Transfer fee to treasury if it is non-zero - if (vars.liquidationProtocolFeeAmount != 0) { - uint256 liquidityIndex = collateralReserve.getNormalizedIncome(); - uint256 scaledDownLiquidationProtocolFee = vars.liquidationProtocolFeeAmount.rayDiv( - liquidityIndex - ); - uint256 scaledDownUserBalance = vars.collateralAToken.scaledBalanceOf(params.user); - // To avoid trying to send more aTokens than available on balance, due to 1 wei imprecision - if (scaledDownLiquidationProtocolFee > scaledDownUserBalance) { - vars.liquidationProtocolFeeAmount = scaledDownUserBalance.rayMul(liquidityIndex); - } - vars.collateralAToken.transferOnLiquidation( - params.user, - vars.collateralAToken.RESERVE_TREASURY_ADDRESS(), - vars.liquidationProtocolFeeAmount - ); - } - - // Transfers the debt asset being repaid to the aToken, where the liquidity is kept - IERC20(params.debtAsset).safeTransferFrom( - msg.sender, - vars.debtReserveCache.aTokenAddress, - vars.actualDebtToLiquidate - ); - - IAToken(vars.debtReserveCache.aTokenAddress).handleRepayment( - msg.sender, - params.user, - vars.actualDebtToLiquidate - ); - - emit LiquidationCall( - params.collateralAsset, - params.debtAsset, - params.user, - vars.actualDebtToLiquidate, - vars.actualCollateralToLiquidate, - msg.sender, - params.receiveAToken - ); - } - - /** - * @notice Burns the collateral aTokens and transfers the underlying to the liquidator. - * @dev The function also updates the state and the interest rate of the collateral reserve. - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _burnCollateralATokens( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - DataTypes.ReserveCache memory collateralReserveCache = collateralReserve.cache(); - collateralReserve.updateState(collateralReserveCache); - collateralReserve.updateInterestRatesAndVirtualBalance( - collateralReserveCache, - params.collateralAsset, - 0, - vars.actualCollateralToLiquidate - ); - - // Burn the equivalent amount of aToken, sending the underlying to the liquidator - vars.collateralAToken.burn( - params.user, - msg.sender, - vars.actualCollateralToLiquidate, - collateralReserveCache.nextLiquidityIndex - ); - } - - /** - * @notice Liquidates the user aTokens by transferring them to the liquidator. - * @dev The function also checks the state of the liquidator and activates the aToken as collateral - * as in standard transfers if the isolation mode constraints are respected. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param collateralReserve The data of the collateral reserve - * @param params The additional parameters needed to execute the liquidation function - * @param vars The executeLiquidationCall() function local vars - */ - function _liquidateATokens( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - uint256 liquidatorPreviousATokenBalance = IERC20(vars.collateralAToken).balanceOf(msg.sender); - vars.collateralAToken.transferOnLiquidation( - params.user, - msg.sender, - vars.actualCollateralToLiquidate - ); - - if (liquidatorPreviousATokenBalance == 0) { - DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - liquidatorConfig, - collateralReserve.configuration, - collateralReserve.aTokenAddress - ) - ) { - liquidatorConfig.setUsingAsCollateral(collateralReserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.collateralAsset, msg.sender); - } - } - } - - /** - * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. - * @dev The function alters the `debtReserveCache` state in `vars` to update the debt related data. - * @param params The additional parameters needed to execute the liquidation function - * @param vars the executeLiquidationCall() function local vars - */ - function _burnDebtTokens( - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars - ) internal { - vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( - vars.debtReserveCache.variableDebtTokenAddress - ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); - } - - /** - * @notice Calculates the total debt of the user and the actual amount to liquidate depending on the health factor - * and corresponding close factor. - * @dev If the Health Factor is below CLOSE_FACTOR_HF_THRESHOLD, the close factor is increased to MAX_LIQUIDATION_CLOSE_FACTOR - * @param debtReserveCache The reserve cache data object of the debt reserve - * @param params The additional parameters needed to execute the liquidation function - * @param healthFactor The health factor of the position - * @return The total debt of the user - * @return The actual debt to liquidate as a function of the closeFactor - */ - function _calculateDebt( - DataTypes.ReserveCache memory debtReserveCache, - DataTypes.ExecuteLiquidationCallParams memory params, - uint256 healthFactor - ) internal view returns (uint256, uint256) { - uint256 userVariableDebt = IERC20(debtReserveCache.variableDebtTokenAddress).balanceOf( - params.user - ); - - uint256 closeFactor = healthFactor > CLOSE_FACTOR_HF_THRESHOLD - ? DEFAULT_LIQUIDATION_CLOSE_FACTOR - : MAX_LIQUIDATION_CLOSE_FACTOR; - - uint256 maxLiquidatableDebt = userVariableDebt.percentMul(closeFactor); - - uint256 actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt - ? maxLiquidatableDebt - : params.debtToCover; - - return (userVariableDebt, actualDebtToLiquidate); - } - - struct AvailableCollateralToLiquidateLocalVars { - uint256 collateralPrice; - uint256 debtAssetPrice; - uint256 maxCollateralToLiquidate; - uint256 baseCollateral; - uint256 bonusCollateral; - uint256 debtAssetDecimals; - uint256 collateralDecimals; - uint256 collateralAssetUnit; - uint256 debtAssetUnit; - uint256 collateralAmount; - uint256 debtAmountNeeded; - uint256 liquidationProtocolFeePercentage; - uint256 liquidationProtocolFee; - } - - /** - * @notice Calculates how much of a specific collateral can be liquidated, given - * a certain amount of debt asset. - * @dev This function needs to be called after all the checks to validate the liquidation have been performed, - * otherwise it might fail. - * @param collateralReserve The data of the collateral reserve - * @param debtReserveCache The cached data of the debt reserve - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param userCollateralBalance The collateral balance for the specific `collateralAsset` of the user being liquidated - * @param liquidationBonus The collateral bonus percentage to receive as result of the liquidation - * @return The maximum amount that is possible to liquidate given all the liquidation constraints (user balance, close factor) - * @return The amount to repay with the liquidation - * @return The fee taken from the liquidation bonus amount to be paid to the protocol - */ - function _calculateAvailableCollateralToLiquidate( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveCache memory debtReserveCache, - address collateralAsset, - address debtAsset, - uint256 debtToCover, - uint256 userCollateralBalance, - uint256 liquidationBonus, - IPriceOracleGetter oracle - ) internal view returns (uint256, uint256, uint256) { - AvailableCollateralToLiquidateLocalVars memory vars; - - vars.collateralPrice = oracle.getAssetPrice(collateralAsset); - vars.debtAssetPrice = oracle.getAssetPrice(debtAsset); - - vars.collateralDecimals = collateralReserve.configuration.getDecimals(); - vars.debtAssetDecimals = debtReserveCache.reserveConfiguration.getDecimals(); - - unchecked { - vars.collateralAssetUnit = 10 ** vars.collateralDecimals; - vars.debtAssetUnit = 10 ** vars.debtAssetDecimals; - } - - vars.liquidationProtocolFeePercentage = collateralReserve - .configuration - .getLiquidationProtocolFee(); - - // This is the base collateral to liquidate based on the given debt to cover - vars.baseCollateral = - ((vars.debtAssetPrice * debtToCover * vars.collateralAssetUnit)) / - (vars.collateralPrice * vars.debtAssetUnit); - - vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); - - if (vars.maxCollateralToLiquidate > userCollateralBalance) { - vars.collateralAmount = userCollateralBalance; - vars.debtAmountNeeded = ((vars.collateralPrice * vars.collateralAmount * vars.debtAssetUnit) / - (vars.debtAssetPrice * vars.collateralAssetUnit)).percentDiv(liquidationBonus); - } else { - vars.collateralAmount = vars.maxCollateralToLiquidate; - vars.debtAmountNeeded = debtToCover; - } - - if (vars.liquidationProtocolFeePercentage != 0) { - vars.bonusCollateral = - vars.collateralAmount - - vars.collateralAmount.percentDiv(liquidationBonus); - - vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( - vars.liquidationProtocolFeePercentage - ); - - return ( - vars.collateralAmount - vars.liquidationProtocolFee, - vars.debtAmountNeeded, - vars.liquidationProtocolFee - ); - } else { - return (vars.collateralAmount, vars.debtAmountNeeded, 0); - } - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index dd5c637d..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index e08a30e8..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index 9adca939..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/LINEA/LIQUIDATION_LOGIC/LiquidationLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/LINEA/ORACLE.sol b/downloads/LINEA/ORACLE.sol deleted file mode 100644 index 9828b589..00000000 --- a/downloads/LINEA/ORACLE.sol +++ /dev/null @@ -1,762 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/ORACLE/AaveOracle/src/contracts/dependencies/chainlink/AggregatorInterface.sol - -// Chainlink Contracts v0.8 - -interface AggregatorInterface { - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt); - - event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); -} - -// downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/LINEA/ORACLE/AaveOracle/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IAaveOracle.sol - -/** - * @title IAaveOracle - * @author Aave - * @notice Defines the basic interface for the Aave Oracle - */ -interface IAaveOracle is IPriceOracleGetter { - /** - * @dev Emitted after the base currency is set - * @param baseCurrency The base currency of used for price quotes - * @param baseCurrencyUnit The unit of the base currency - */ - event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); - - /** - * @dev Emitted after the price source of an asset is updated - * @param asset The address of the asset - * @param source The price source of the asset - */ - event AssetSourceUpdated(address indexed asset, address indexed source); - - /** - * @dev Emitted after the address of fallback oracle is updated - * @param fallbackOracle The address of the fallback oracle - */ - event FallbackOracleUpdated(address indexed fallbackOracle); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Sets or replaces price sources of assets - * @param assets The addresses of the assets - * @param sources The addresses of the price sources - */ - function setAssetSources(address[] calldata assets, address[] calldata sources) external; - - /** - * @notice Sets the fallback oracle - * @param fallbackOracle The address of the fallback oracle - */ - function setFallbackOracle(address fallbackOracle) external; - - /** - * @notice Returns a list of prices from a list of assets addresses - * @param assets The list of assets addresses - * @return The prices of the given assets - */ - function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); - - /** - * @notice Returns the address of the source for an asset address - * @param asset The address of the asset - * @return The address of the source - */ - function getSourceOfAsset(address asset) external view returns (address); - - /** - * @notice Returns the address of the fallback oracle - * @return The address of the fallback oracle - */ - function getFallbackOracle() external view returns (address); -} - -// downloads/LINEA/ORACLE/AaveOracle/src/contracts/misc/AaveOracle.sol - -/** - * @title AaveOracle - * @author Aave - * @notice Contract to get asset prices, manage price sources and update the fallback oracle - * - Use of Chainlink Aggregators as first source of price - * - If the returned price by a Chainlink aggregator is <= 0, the call is forwarded to a fallback oracle - * - Owned by the Aave governance - */ -contract AaveOracle is IAaveOracle { - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - // Map of asset price sources (asset => priceSource) - mapping(address => AggregatorInterface) private assetsSources; - - IPriceOracleGetter private _fallbackOracle; - address public immutable override BASE_CURRENCY; - uint256 public immutable override BASE_CURRENCY_UNIT; - - /** - * @dev Only asset listing or pool admin can call functions marked by this modifier. - */ - modifier onlyAssetListingOrPoolAdmins() { - _onlyAssetListingOrPoolAdmins(); - _; - } - - /** - * @notice Constructor - * @param provider The address of the new PoolAddressesProvider - * @param assets The addresses of the assets - * @param sources The address of the source of each asset - * @param fallbackOracle The address of the fallback oracle to use if the data of an - * aggregator is not consistent - * @param baseCurrency The base currency used for the price quotes. If USD is used, base currency is 0x0 - * @param baseCurrencyUnit The unit of the base currency - */ - constructor( - IPoolAddressesProvider provider, - address[] memory assets, - address[] memory sources, - address fallbackOracle, - address baseCurrency, - uint256 baseCurrencyUnit - ) { - ADDRESSES_PROVIDER = provider; - _setFallbackOracle(fallbackOracle); - _setAssetsSources(assets, sources); - BASE_CURRENCY = baseCurrency; - BASE_CURRENCY_UNIT = baseCurrencyUnit; - emit BaseCurrencySet(baseCurrency, baseCurrencyUnit); - } - - /// @inheritdoc IAaveOracle - function setAssetSources( - address[] calldata assets, - address[] calldata sources - ) external override onlyAssetListingOrPoolAdmins { - _setAssetsSources(assets, sources); - } - - /// @inheritdoc IAaveOracle - function setFallbackOracle( - address fallbackOracle - ) external override onlyAssetListingOrPoolAdmins { - _setFallbackOracle(fallbackOracle); - } - - /** - * @notice Internal function to set the sources for each asset - * @param assets The addresses of the assets - * @param sources The address of the source of each asset - */ - function _setAssetsSources(address[] memory assets, address[] memory sources) internal { - require(assets.length == sources.length, Errors.INCONSISTENT_PARAMS_LENGTH); - for (uint256 i = 0; i < assets.length; i++) { - assetsSources[assets[i]] = AggregatorInterface(sources[i]); - emit AssetSourceUpdated(assets[i], sources[i]); - } - } - - /** - * @notice Internal function to set the fallback oracle - * @param fallbackOracle The address of the fallback oracle - */ - function _setFallbackOracle(address fallbackOracle) internal { - _fallbackOracle = IPriceOracleGetter(fallbackOracle); - emit FallbackOracleUpdated(fallbackOracle); - } - - /// @inheritdoc IPriceOracleGetter - function getAssetPrice(address asset) public view override returns (uint256) { - AggregatorInterface source = assetsSources[asset]; - - if (asset == BASE_CURRENCY) { - return BASE_CURRENCY_UNIT; - } else if (address(source) == address(0)) { - return _fallbackOracle.getAssetPrice(asset); - } else { - int256 price = source.latestAnswer(); - if (price > 0) { - return uint256(price); - } else { - return _fallbackOracle.getAssetPrice(asset); - } - } - } - - /// @inheritdoc IAaveOracle - function getAssetsPrices( - address[] calldata assets - ) external view override returns (uint256[] memory) { - uint256[] memory prices = new uint256[](assets.length); - for (uint256 i = 0; i < assets.length; i++) { - prices[i] = getAssetPrice(assets[i]); - } - return prices; - } - - /// @inheritdoc IAaveOracle - function getSourceOfAsset(address asset) external view override returns (address) { - return address(assetsSources[asset]); - } - - /// @inheritdoc IAaveOracle - function getFallbackOracle() external view returns (address) { - return address(_fallbackOracle); - } - - function _onlyAssetListingOrPoolAdmins() internal view { - IACLManager aclManager = IACLManager(ADDRESSES_PROVIDER.getACLManager()); - require( - aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), - Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN - ); - } -} diff --git a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/dependencies/chainlink/AggregatorInterface.sol b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/dependencies/chainlink/AggregatorInterface.sol deleted file mode 100644 index 496151aa..00000000 --- a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/dependencies/chainlink/AggregatorInterface.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -// Chainlink Contracts v0.8 -pragma solidity ^0.8.0; - -interface AggregatorInterface { - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt); - - event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); -} diff --git a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IAaveOracle.sol b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IAaveOracle.sol deleted file mode 100644 index 265d2560..00000000 --- a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IAaveOracle.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPriceOracleGetter} from './IPriceOracleGetter.sol'; -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IAaveOracle - * @author Aave - * @notice Defines the basic interface for the Aave Oracle - */ -interface IAaveOracle is IPriceOracleGetter { - /** - * @dev Emitted after the base currency is set - * @param baseCurrency The base currency of used for price quotes - * @param baseCurrencyUnit The unit of the base currency - */ - event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); - - /** - * @dev Emitted after the price source of an asset is updated - * @param asset The address of the asset - * @param source The price source of the asset - */ - event AssetSourceUpdated(address indexed asset, address indexed source); - - /** - * @dev Emitted after the address of fallback oracle is updated - * @param fallbackOracle The address of the fallback oracle - */ - event FallbackOracleUpdated(address indexed fallbackOracle); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Sets or replaces price sources of assets - * @param assets The addresses of the assets - * @param sources The addresses of the price sources - */ - function setAssetSources(address[] calldata assets, address[] calldata sources) external; - - /** - * @notice Sets the fallback oracle - * @param fallbackOracle The address of the fallback oracle - */ - function setFallbackOracle(address fallbackOracle) external; - - /** - * @notice Returns a list of prices from a list of assets addresses - * @param assets The list of assets addresses - * @return The prices of the given assets - */ - function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); - - /** - * @notice Returns the address of the source for an asset address - * @param asset The address of the asset - * @return The address of the source - */ - function getSourceOfAsset(address asset) external view returns (address); - - /** - * @notice Returns the address of the fallback oracle - * @return The address of the fallback oracle - */ - function getFallbackOracle() external view returns (address); -} diff --git a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/misc/AaveOracle.sol b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/misc/AaveOracle.sol deleted file mode 100644 index 04364e0f..00000000 --- a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/misc/AaveOracle.sol +++ /dev/null @@ -1,146 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {AggregatorInterface} from '../dependencies/chainlink/AggregatorInterface.sol'; -import {Errors} from '../protocol/libraries/helpers/Errors.sol'; -import {IACLManager} from '../interfaces/IACLManager.sol'; -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {IPriceOracleGetter} from '../interfaces/IPriceOracleGetter.sol'; -import {IAaveOracle} from '../interfaces/IAaveOracle.sol'; - -/** - * @title AaveOracle - * @author Aave - * @notice Contract to get asset prices, manage price sources and update the fallback oracle - * - Use of Chainlink Aggregators as first source of price - * - If the returned price by a Chainlink aggregator is <= 0, the call is forwarded to a fallback oracle - * - Owned by the Aave governance - */ -contract AaveOracle is IAaveOracle { - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - // Map of asset price sources (asset => priceSource) - mapping(address => AggregatorInterface) private assetsSources; - - IPriceOracleGetter private _fallbackOracle; - address public immutable override BASE_CURRENCY; - uint256 public immutable override BASE_CURRENCY_UNIT; - - /** - * @dev Only asset listing or pool admin can call functions marked by this modifier. - */ - modifier onlyAssetListingOrPoolAdmins() { - _onlyAssetListingOrPoolAdmins(); - _; - } - - /** - * @notice Constructor - * @param provider The address of the new PoolAddressesProvider - * @param assets The addresses of the assets - * @param sources The address of the source of each asset - * @param fallbackOracle The address of the fallback oracle to use if the data of an - * aggregator is not consistent - * @param baseCurrency The base currency used for the price quotes. If USD is used, base currency is 0x0 - * @param baseCurrencyUnit The unit of the base currency - */ - constructor( - IPoolAddressesProvider provider, - address[] memory assets, - address[] memory sources, - address fallbackOracle, - address baseCurrency, - uint256 baseCurrencyUnit - ) { - ADDRESSES_PROVIDER = provider; - _setFallbackOracle(fallbackOracle); - _setAssetsSources(assets, sources); - BASE_CURRENCY = baseCurrency; - BASE_CURRENCY_UNIT = baseCurrencyUnit; - emit BaseCurrencySet(baseCurrency, baseCurrencyUnit); - } - - /// @inheritdoc IAaveOracle - function setAssetSources( - address[] calldata assets, - address[] calldata sources - ) external override onlyAssetListingOrPoolAdmins { - _setAssetsSources(assets, sources); - } - - /// @inheritdoc IAaveOracle - function setFallbackOracle( - address fallbackOracle - ) external override onlyAssetListingOrPoolAdmins { - _setFallbackOracle(fallbackOracle); - } - - /** - * @notice Internal function to set the sources for each asset - * @param assets The addresses of the assets - * @param sources The address of the source of each asset - */ - function _setAssetsSources(address[] memory assets, address[] memory sources) internal { - require(assets.length == sources.length, Errors.INCONSISTENT_PARAMS_LENGTH); - for (uint256 i = 0; i < assets.length; i++) { - assetsSources[assets[i]] = AggregatorInterface(sources[i]); - emit AssetSourceUpdated(assets[i], sources[i]); - } - } - - /** - * @notice Internal function to set the fallback oracle - * @param fallbackOracle The address of the fallback oracle - */ - function _setFallbackOracle(address fallbackOracle) internal { - _fallbackOracle = IPriceOracleGetter(fallbackOracle); - emit FallbackOracleUpdated(fallbackOracle); - } - - /// @inheritdoc IPriceOracleGetter - function getAssetPrice(address asset) public view override returns (uint256) { - AggregatorInterface source = assetsSources[asset]; - - if (asset == BASE_CURRENCY) { - return BASE_CURRENCY_UNIT; - } else if (address(source) == address(0)) { - return _fallbackOracle.getAssetPrice(asset); - } else { - int256 price = source.latestAnswer(); - if (price > 0) { - return uint256(price); - } else { - return _fallbackOracle.getAssetPrice(asset); - } - } - } - - /// @inheritdoc IAaveOracle - function getAssetsPrices( - address[] calldata assets - ) external view override returns (uint256[] memory) { - uint256[] memory prices = new uint256[](assets.length); - for (uint256 i = 0; i < assets.length; i++) { - prices[i] = getAssetPrice(assets[i]); - } - return prices; - } - - /// @inheritdoc IAaveOracle - function getSourceOfAsset(address asset) external view override returns (address) { - return address(assetsSources[asset]); - } - - /// @inheritdoc IAaveOracle - function getFallbackOracle() external view returns (address) { - return address(_fallbackOracle); - } - - function _onlyAssetListingOrPoolAdmins() internal view { - IACLManager aclManager = IACLManager(ADDRESSES_PROVIDER.getACLManager()); - require( - aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), - Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN - ); - } -} diff --git a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/ORACLE/AaveOracle/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/ORACLE/AaveOracle/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER.sol deleted file mode 100644 index 7a145972..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER.sol +++ /dev/null @@ -1,1022 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol - -/** - * @title Proxy - * @dev Implements delegation of calls to other contracts, with proper - * forwarding of return values and bubbling of failures. - * It defines a fallback function that delegates all calls to the address - * returned by the abstract _implementation() internal function. - */ -abstract contract Proxy { - /** - * @dev Fallback function. - * Will run if no other function in the contract matches the call data. - * Implemented entirely in `_fallback`. - */ - fallback() external payable { - _fallback(); - } - - /** - * @dev Fallback function that will run if call data is empty. - * IMPORTANT. receive() on implementation contracts will be unreachable - */ - receive() external payable { - _fallback(); - } - - /** - * @return The Address of the implementation. - */ - function _implementation() internal view virtual returns (address); - - /** - * @dev Delegates execution to an implementation contract. - * This is a low level function that doesn't return to its internal call site. - * It will return to the external caller whatever the implementation returns. - * @param implementation Address to delegate. - */ - function _delegate(address implementation) internal { - //solium-disable-next-line - assembly { - // Copy msg.data. We take full control of memory in this inline assembly - // block because it will not return to Solidity code. We overwrite the - // Solidity scratch pad at memory position 0. - calldatacopy(0, 0, calldatasize()) - - // Call the implementation. - // out and outsize are 0 because we don't know the size yet. - let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) - - // Copy the returned data. - returndatacopy(0, 0, returndatasize()) - - switch result - // delegatecall returns 0 on error. - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } - } - } - - /** - * @dev Function that is run as the first thing in the fallback function. - * Can be redefined in derived contracts to add functionality. - * Redefinitions must call super._willFallback(). - */ - function _willFallback() internal virtual {} - - /** - * @dev fallback implementation. - * Extracted to enable manual triggering. - */ - function _fallback() internal { - _willFallback(); - _delegate(_implementation()); - } -} - -// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} - -// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol - -/** - * @title BaseUpgradeabilityProxy - * @dev This contract implements a proxy that allows to change the - * implementation address to which it will delegate. - * Such a change is called an implementation upgrade. - */ -contract BaseUpgradeabilityProxy is Proxy { - /** - * @dev Emitted when the implementation is upgraded. - * @param implementation Address of the new implementation. - */ - event Upgraded(address indexed implementation); - - /** - * @dev Storage slot with the address of the current implementation. - * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant IMPLEMENTATION_SLOT = - 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /** - * @dev Returns the current implementation. - * @return impl Address of the current implementation - */ - function _implementation() internal view override returns (address impl) { - bytes32 slot = IMPLEMENTATION_SLOT; - //solium-disable-next-line - assembly { - impl := sload(slot) - } - } - - /** - * @dev Upgrades the proxy to a new implementation. - * @param newImplementation Address of the new implementation. - */ - function _upgradeTo(address newImplementation) internal { - _setImplementation(newImplementation); - emit Upgraded(newImplementation); - } - - /** - * @dev Sets the implementation address of the proxy. - * @param newImplementation Address of the new implementation. - */ - function _setImplementation(address newImplementation) internal { - require( - Address.isContract(newImplementation), - 'Cannot set a proxy implementation to a non-contract address' - ); - - bytes32 slot = IMPLEMENTATION_SLOT; - - //solium-disable-next-line - assembly { - sstore(slot, newImplementation) - } - } -} - -// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol - -/** - * @title InitializableUpgradeabilityProxy - * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing - * implementation and init data. - */ -contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { - /** - * @dev Contract initializer. - * @param _logic Address of the initial implementation. - * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. - */ - function initialize(address _logic, bytes memory _data) public payable { - require(_implementation() == address(0)); - assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); - _setImplementation(_logic); - if (_data.length > 0) { - (bool success, ) = _logic.delegatecall(_data); - require(success); - } - } -} - -// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol - -/** - * @title BaseImmutableAdminUpgradeabilityProxy - * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern - * @notice This contract combines an upgradeability proxy with an authorization - * mechanism for administrative tasks. - * @dev The admin role is stored in an immutable, which helps saving transactions costs - * All external functions in this contract must be guarded by the - * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity - * feature proposal that would enable this to be done automatically. - */ -contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - address internal immutable _admin; - - /** - * @dev Constructor. - * @param admin_ The address of the admin - */ - constructor(address admin_) { - _admin = admin_; - } - - modifier ifAdmin() { - if (msg.sender == _admin) { - _; - } else { - _fallback(); - } - } - - /** - * @notice Return the admin address - * @return The address of the proxy admin. - */ - function admin() external ifAdmin returns (address) { - return _admin; - } - - /** - * @notice Return the implementation address - * @return The address of the implementation. - */ - function implementation() external ifAdmin returns (address) { - return _implementation(); - } - - /** - * @notice Upgrade the backing implementation of the proxy. - * @dev Only the admin can call this function. - * @param newImplementation The address of the new implementation. - */ - function upgradeTo(address newImplementation) external ifAdmin { - _upgradeTo(newImplementation); - } - - /** - * @notice Upgrade the backing implementation of the proxy and call a function - * on the new implementation. - * @dev This is useful to initialize the proxied contract. - * @param newImplementation The address of the new implementation. - * @param data Data to send as msg.data in the low level call. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - */ - function upgradeToAndCall( - address newImplementation, - bytes calldata data - ) external payable ifAdmin { - _upgradeTo(newImplementation); - (bool success, ) = newImplementation.delegatecall(data); - require(success); - } - - /** - * @notice Only fall back when the sender is not the admin. - */ - function _willFallback() internal virtual override { - require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); - super._willFallback(); - } -} - -// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol - -/** - * @title InitializableAdminUpgradeabilityProxy - * @author Aave - * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function - */ -contract InitializableImmutableAdminUpgradeabilityProxy is - BaseImmutableAdminUpgradeabilityProxy, - InitializableUpgradeabilityProxy -{ - /** - * @dev Constructor. - * @param admin The address of the admin - */ - constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { - // Intentionally left blank - } - - /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy - function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { - BaseImmutableAdminUpgradeabilityProxy._willFallback(); - } -} - -// downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/protocol/configuration/PoolAddressesProvider.sol - -/** - * @title PoolAddressesProvider - * @author Aave - * @notice Main registry of addresses part of or connected to the protocol, including permissioned roles - * @dev Acts as factory of proxies and admin of those, so with right to change its implementations - * @dev Owned by the Aave Governance - */ -contract PoolAddressesProvider is Ownable, IPoolAddressesProvider { - // Identifier of the Aave Market - string private _marketId; - - // Map of registered addresses (identifier => registeredAddress) - mapping(bytes32 => address) private _addresses; - - // Main identifiers - bytes32 private constant POOL = 'POOL'; - bytes32 private constant POOL_CONFIGURATOR = 'POOL_CONFIGURATOR'; - bytes32 private constant PRICE_ORACLE = 'PRICE_ORACLE'; - bytes32 private constant ACL_MANAGER = 'ACL_MANAGER'; - bytes32 private constant ACL_ADMIN = 'ACL_ADMIN'; - bytes32 private constant PRICE_ORACLE_SENTINEL = 'PRICE_ORACLE_SENTINEL'; - bytes32 private constant DATA_PROVIDER = 'DATA_PROVIDER'; - - /** - * @dev Constructor. - * @param marketId The identifier of the market. - * @param owner The owner address of this contract. - */ - constructor(string memory marketId, address owner) { - _setMarketId(marketId); - transferOwnership(owner); - } - - /// @inheritdoc IPoolAddressesProvider - function getMarketId() external view override returns (string memory) { - return _marketId; - } - - /// @inheritdoc IPoolAddressesProvider - function setMarketId(string memory newMarketId) external override onlyOwner { - _setMarketId(newMarketId); - } - - /// @inheritdoc IPoolAddressesProvider - function getAddress(bytes32 id) public view override returns (address) { - return _addresses[id]; - } - - /// @inheritdoc IPoolAddressesProvider - function setAddress(bytes32 id, address newAddress) external override onlyOwner { - address oldAddress = _addresses[id]; - _addresses[id] = newAddress; - emit AddressSet(id, oldAddress, newAddress); - } - - /// @inheritdoc IPoolAddressesProvider - function setAddressAsProxy( - bytes32 id, - address newImplementationAddress - ) external override onlyOwner { - address proxyAddress = _addresses[id]; - address oldImplementationAddress = _getProxyImplementation(id); - _updateImpl(id, newImplementationAddress); - emit AddressSetAsProxy(id, proxyAddress, oldImplementationAddress, newImplementationAddress); - } - - /// @inheritdoc IPoolAddressesProvider - function getPool() external view override returns (address) { - return getAddress(POOL); - } - - /// @inheritdoc IPoolAddressesProvider - function setPoolImpl(address newPoolImpl) external override onlyOwner { - address oldPoolImpl = _getProxyImplementation(POOL); - _updateImpl(POOL, newPoolImpl); - emit PoolUpdated(oldPoolImpl, newPoolImpl); - } - - /// @inheritdoc IPoolAddressesProvider - function getPoolConfigurator() external view override returns (address) { - return getAddress(POOL_CONFIGURATOR); - } - - /// @inheritdoc IPoolAddressesProvider - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external override onlyOwner { - address oldPoolConfiguratorImpl = _getProxyImplementation(POOL_CONFIGURATOR); - _updateImpl(POOL_CONFIGURATOR, newPoolConfiguratorImpl); - emit PoolConfiguratorUpdated(oldPoolConfiguratorImpl, newPoolConfiguratorImpl); - } - - /// @inheritdoc IPoolAddressesProvider - function getPriceOracle() external view override returns (address) { - return getAddress(PRICE_ORACLE); - } - - /// @inheritdoc IPoolAddressesProvider - function setPriceOracle(address newPriceOracle) external override onlyOwner { - address oldPriceOracle = _addresses[PRICE_ORACLE]; - _addresses[PRICE_ORACLE] = newPriceOracle; - emit PriceOracleUpdated(oldPriceOracle, newPriceOracle); - } - - /// @inheritdoc IPoolAddressesProvider - function getACLManager() external view override returns (address) { - return getAddress(ACL_MANAGER); - } - - /// @inheritdoc IPoolAddressesProvider - function setACLManager(address newAclManager) external override onlyOwner { - address oldAclManager = _addresses[ACL_MANAGER]; - _addresses[ACL_MANAGER] = newAclManager; - emit ACLManagerUpdated(oldAclManager, newAclManager); - } - - /// @inheritdoc IPoolAddressesProvider - function getACLAdmin() external view override returns (address) { - return getAddress(ACL_ADMIN); - } - - /// @inheritdoc IPoolAddressesProvider - function setACLAdmin(address newAclAdmin) external override onlyOwner { - address oldAclAdmin = _addresses[ACL_ADMIN]; - _addresses[ACL_ADMIN] = newAclAdmin; - emit ACLAdminUpdated(oldAclAdmin, newAclAdmin); - } - - /// @inheritdoc IPoolAddressesProvider - function getPriceOracleSentinel() external view override returns (address) { - return getAddress(PRICE_ORACLE_SENTINEL); - } - - /// @inheritdoc IPoolAddressesProvider - function setPriceOracleSentinel(address newPriceOracleSentinel) external override onlyOwner { - address oldPriceOracleSentinel = _addresses[PRICE_ORACLE_SENTINEL]; - _addresses[PRICE_ORACLE_SENTINEL] = newPriceOracleSentinel; - emit PriceOracleSentinelUpdated(oldPriceOracleSentinel, newPriceOracleSentinel); - } - - /// @inheritdoc IPoolAddressesProvider - function getPoolDataProvider() external view override returns (address) { - return getAddress(DATA_PROVIDER); - } - - /// @inheritdoc IPoolAddressesProvider - function setPoolDataProvider(address newDataProvider) external override onlyOwner { - address oldDataProvider = _addresses[DATA_PROVIDER]; - _addresses[DATA_PROVIDER] = newDataProvider; - emit PoolDataProviderUpdated(oldDataProvider, newDataProvider); - } - - /** - * @notice Internal function to update the implementation of a specific proxied component of the protocol. - * @dev If there is no proxy registered with the given identifier, it creates the proxy setting `newAddress` - * as implementation and calls the initialize() function on the proxy - * @dev If there is already a proxy registered, it just updates the implementation to `newAddress` and - * calls the initialize() function via upgradeToAndCall() in the proxy - * @param id The id of the proxy to be updated - * @param newAddress The address of the new implementation - */ - function _updateImpl(bytes32 id, address newAddress) internal { - address proxyAddress = _addresses[id]; - InitializableImmutableAdminUpgradeabilityProxy proxy; - bytes memory params = abi.encodeWithSignature('initialize(address)', address(this)); - - if (proxyAddress == address(0)) { - proxy = new InitializableImmutableAdminUpgradeabilityProxy(address(this)); - _addresses[id] = proxyAddress = address(proxy); - proxy.initialize(newAddress, params); - emit ProxyCreated(id, proxyAddress, newAddress); - } else { - proxy = InitializableImmutableAdminUpgradeabilityProxy(payable(proxyAddress)); - proxy.upgradeToAndCall(newAddress, params); - } - } - - /** - * @notice Updates the identifier of the Aave market. - * @param newMarketId The new id of the market - */ - function _setMarketId(string memory newMarketId) internal { - string memory oldMarketId = _marketId; - _marketId = newMarketId; - emit MarketIdSet(oldMarketId, newMarketId); - } - - /** - * @notice Returns the the implementation contract of the proxy contract by its identifier. - * @dev It returns ZERO if there is no registered address with the given id - * @dev It reverts if the registered address with the given id is not `InitializableImmutableAdminUpgradeabilityProxy` - * @param id The id - * @return The address of the implementation contract - */ - function _getProxyImplementation(bytes32 id) internal returns (address) { - address proxyAddress = _addresses[id]; - if (proxyAddress == address(0)) { - return address(0); - } else { - address payable payableProxyAddress = payable(proxyAddress); - return InitializableImmutableAdminUpgradeabilityProxy(payableProxyAddress).implementation(); - } - } -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol deleted file mode 100644 index 7917b722..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -import './Context.sol'; - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol deleted file mode 100644 index aec817cb..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import './Proxy.sol'; -import '../contracts/Address.sol'; - -/** - * @title BaseUpgradeabilityProxy - * @dev This contract implements a proxy that allows to change the - * implementation address to which it will delegate. - * Such a change is called an implementation upgrade. - */ -contract BaseUpgradeabilityProxy is Proxy { - /** - * @dev Emitted when the implementation is upgraded. - * @param implementation Address of the new implementation. - */ - event Upgraded(address indexed implementation); - - /** - * @dev Storage slot with the address of the current implementation. - * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant IMPLEMENTATION_SLOT = - 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /** - * @dev Returns the current implementation. - * @return impl Address of the current implementation - */ - function _implementation() internal view override returns (address impl) { - bytes32 slot = IMPLEMENTATION_SLOT; - //solium-disable-next-line - assembly { - impl := sload(slot) - } - } - - /** - * @dev Upgrades the proxy to a new implementation. - * @param newImplementation Address of the new implementation. - */ - function _upgradeTo(address newImplementation) internal { - _setImplementation(newImplementation); - emit Upgraded(newImplementation); - } - - /** - * @dev Sets the implementation address of the proxy. - * @param newImplementation Address of the new implementation. - */ - function _setImplementation(address newImplementation) internal { - require( - Address.isContract(newImplementation), - 'Cannot set a proxy implementation to a non-contract address' - ); - - bytes32 slot = IMPLEMENTATION_SLOT; - - //solium-disable-next-line - assembly { - sstore(slot, newImplementation) - } - } -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol deleted file mode 100644 index 4b43fa6a..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import './BaseUpgradeabilityProxy.sol'; - -/** - * @title InitializableUpgradeabilityProxy - * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing - * implementation and init data. - */ -contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { - /** - * @dev Contract initializer. - * @param _logic Address of the initial implementation. - * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. - */ - function initialize(address _logic, bytes memory _data) public payable { - require(_implementation() == address(0)); - assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); - _setImplementation(_logic); - if (_data.length > 0) { - (bool success, ) = _logic.delegatecall(_data); - require(success); - } - } -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol deleted file mode 100644 index 53589441..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol +++ /dev/null @@ -1,81 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title Proxy - * @dev Implements delegation of calls to other contracts, with proper - * forwarding of return values and bubbling of failures. - * It defines a fallback function that delegates all calls to the address - * returned by the abstract _implementation() internal function. - */ -abstract contract Proxy { - /** - * @dev Fallback function. - * Will run if no other function in the contract matches the call data. - * Implemented entirely in `_fallback`. - */ - fallback() external payable { - _fallback(); - } - - /** - * @dev Fallback function that will run if call data is empty. - * IMPORTANT. receive() on implementation contracts will be unreachable - */ - receive() external payable { - _fallback(); - } - - /** - * @return The Address of the implementation. - */ - function _implementation() internal view virtual returns (address); - - /** - * @dev Delegates execution to an implementation contract. - * This is a low level function that doesn't return to its internal call site. - * It will return to the external caller whatever the implementation returns. - * @param implementation Address to delegate. - */ - function _delegate(address implementation) internal { - //solium-disable-next-line - assembly { - // Copy msg.data. We take full control of memory in this inline assembly - // block because it will not return to Solidity code. We overwrite the - // Solidity scratch pad at memory position 0. - calldatacopy(0, 0, calldatasize()) - - // Call the implementation. - // out and outsize are 0 because we don't know the size yet. - let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) - - // Copy the returned data. - returndatacopy(0, 0, returndatasize()) - - switch result - // delegatecall returns 0 on error. - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } - } - } - - /** - * @dev Function that is run as the first thing in the fallback function. - * Can be redefined in derived contracts to add functionality. - * Redefinitions must call super._willFallback(). - */ - function _willFallback() internal virtual {} - - /** - * @dev fallback implementation. - * Extracted to enable manual triggering. - */ - function _fallback() internal { - _willFallback(); - _delegate(_implementation()); - } -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol deleted file mode 100644 index 252b4a4b..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {BaseUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol'; - -/** - * @title BaseImmutableAdminUpgradeabilityProxy - * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern - * @notice This contract combines an upgradeability proxy with an authorization - * mechanism for administrative tasks. - * @dev The admin role is stored in an immutable, which helps saving transactions costs - * All external functions in this contract must be guarded by the - * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity - * feature proposal that would enable this to be done automatically. - */ -contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - address internal immutable _admin; - - /** - * @dev Constructor. - * @param admin_ The address of the admin - */ - constructor(address admin_) { - _admin = admin_; - } - - modifier ifAdmin() { - if (msg.sender == _admin) { - _; - } else { - _fallback(); - } - } - - /** - * @notice Return the admin address - * @return The address of the proxy admin. - */ - function admin() external ifAdmin returns (address) { - return _admin; - } - - /** - * @notice Return the implementation address - * @return The address of the implementation. - */ - function implementation() external ifAdmin returns (address) { - return _implementation(); - } - - /** - * @notice Upgrade the backing implementation of the proxy. - * @dev Only the admin can call this function. - * @param newImplementation The address of the new implementation. - */ - function upgradeTo(address newImplementation) external ifAdmin { - _upgradeTo(newImplementation); - } - - /** - * @notice Upgrade the backing implementation of the proxy and call a function - * on the new implementation. - * @dev This is useful to initialize the proxied contract. - * @param newImplementation The address of the new implementation. - * @param data Data to send as msg.data in the low level call. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - */ - function upgradeToAndCall( - address newImplementation, - bytes calldata data - ) external payable ifAdmin { - _upgradeTo(newImplementation); - (bool success, ) = newImplementation.delegatecall(data); - require(success); - } - - /** - * @notice Only fall back when the sender is not the admin. - */ - function _willFallback() internal virtual override { - require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); - super._willFallback(); - } -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol deleted file mode 100644 index 6913a19d..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {InitializableUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol'; -import {Proxy} from '../../dependencies/openzeppelin/upgradeability/Proxy.sol'; -import {BaseImmutableAdminUpgradeabilityProxy} from './BaseImmutableAdminUpgradeabilityProxy.sol'; - -/** - * @title InitializableAdminUpgradeabilityProxy - * @author Aave - * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function - */ -contract InitializableImmutableAdminUpgradeabilityProxy is - BaseImmutableAdminUpgradeabilityProxy, - InitializableUpgradeabilityProxy -{ - /** - * @dev Constructor. - * @param admin The address of the admin - */ - constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { - // Intentionally left blank - } - - /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy - function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { - BaseImmutableAdminUpgradeabilityProxy._willFallback(); - } -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/protocol/configuration/PoolAddressesProvider.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/protocol/configuration/PoolAddressesProvider.sol deleted file mode 100644 index 009f4e5c..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER/PoolAddressesProvider/src/contracts/protocol/configuration/PoolAddressesProvider.sol +++ /dev/null @@ -1,209 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {Ownable} from '../../dependencies/openzeppelin/contracts/Ownable.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {InitializableImmutableAdminUpgradeabilityProxy} from '../../misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; - -/** - * @title PoolAddressesProvider - * @author Aave - * @notice Main registry of addresses part of or connected to the protocol, including permissioned roles - * @dev Acts as factory of proxies and admin of those, so with right to change its implementations - * @dev Owned by the Aave Governance - */ -contract PoolAddressesProvider is Ownable, IPoolAddressesProvider { - // Identifier of the Aave Market - string private _marketId; - - // Map of registered addresses (identifier => registeredAddress) - mapping(bytes32 => address) private _addresses; - - // Main identifiers - bytes32 private constant POOL = 'POOL'; - bytes32 private constant POOL_CONFIGURATOR = 'POOL_CONFIGURATOR'; - bytes32 private constant PRICE_ORACLE = 'PRICE_ORACLE'; - bytes32 private constant ACL_MANAGER = 'ACL_MANAGER'; - bytes32 private constant ACL_ADMIN = 'ACL_ADMIN'; - bytes32 private constant PRICE_ORACLE_SENTINEL = 'PRICE_ORACLE_SENTINEL'; - bytes32 private constant DATA_PROVIDER = 'DATA_PROVIDER'; - - /** - * @dev Constructor. - * @param marketId The identifier of the market. - * @param owner The owner address of this contract. - */ - constructor(string memory marketId, address owner) { - _setMarketId(marketId); - transferOwnership(owner); - } - - /// @inheritdoc IPoolAddressesProvider - function getMarketId() external view override returns (string memory) { - return _marketId; - } - - /// @inheritdoc IPoolAddressesProvider - function setMarketId(string memory newMarketId) external override onlyOwner { - _setMarketId(newMarketId); - } - - /// @inheritdoc IPoolAddressesProvider - function getAddress(bytes32 id) public view override returns (address) { - return _addresses[id]; - } - - /// @inheritdoc IPoolAddressesProvider - function setAddress(bytes32 id, address newAddress) external override onlyOwner { - address oldAddress = _addresses[id]; - _addresses[id] = newAddress; - emit AddressSet(id, oldAddress, newAddress); - } - - /// @inheritdoc IPoolAddressesProvider - function setAddressAsProxy( - bytes32 id, - address newImplementationAddress - ) external override onlyOwner { - address proxyAddress = _addresses[id]; - address oldImplementationAddress = _getProxyImplementation(id); - _updateImpl(id, newImplementationAddress); - emit AddressSetAsProxy(id, proxyAddress, oldImplementationAddress, newImplementationAddress); - } - - /// @inheritdoc IPoolAddressesProvider - function getPool() external view override returns (address) { - return getAddress(POOL); - } - - /// @inheritdoc IPoolAddressesProvider - function setPoolImpl(address newPoolImpl) external override onlyOwner { - address oldPoolImpl = _getProxyImplementation(POOL); - _updateImpl(POOL, newPoolImpl); - emit PoolUpdated(oldPoolImpl, newPoolImpl); - } - - /// @inheritdoc IPoolAddressesProvider - function getPoolConfigurator() external view override returns (address) { - return getAddress(POOL_CONFIGURATOR); - } - - /// @inheritdoc IPoolAddressesProvider - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external override onlyOwner { - address oldPoolConfiguratorImpl = _getProxyImplementation(POOL_CONFIGURATOR); - _updateImpl(POOL_CONFIGURATOR, newPoolConfiguratorImpl); - emit PoolConfiguratorUpdated(oldPoolConfiguratorImpl, newPoolConfiguratorImpl); - } - - /// @inheritdoc IPoolAddressesProvider - function getPriceOracle() external view override returns (address) { - return getAddress(PRICE_ORACLE); - } - - /// @inheritdoc IPoolAddressesProvider - function setPriceOracle(address newPriceOracle) external override onlyOwner { - address oldPriceOracle = _addresses[PRICE_ORACLE]; - _addresses[PRICE_ORACLE] = newPriceOracle; - emit PriceOracleUpdated(oldPriceOracle, newPriceOracle); - } - - /// @inheritdoc IPoolAddressesProvider - function getACLManager() external view override returns (address) { - return getAddress(ACL_MANAGER); - } - - /// @inheritdoc IPoolAddressesProvider - function setACLManager(address newAclManager) external override onlyOwner { - address oldAclManager = _addresses[ACL_MANAGER]; - _addresses[ACL_MANAGER] = newAclManager; - emit ACLManagerUpdated(oldAclManager, newAclManager); - } - - /// @inheritdoc IPoolAddressesProvider - function getACLAdmin() external view override returns (address) { - return getAddress(ACL_ADMIN); - } - - /// @inheritdoc IPoolAddressesProvider - function setACLAdmin(address newAclAdmin) external override onlyOwner { - address oldAclAdmin = _addresses[ACL_ADMIN]; - _addresses[ACL_ADMIN] = newAclAdmin; - emit ACLAdminUpdated(oldAclAdmin, newAclAdmin); - } - - /// @inheritdoc IPoolAddressesProvider - function getPriceOracleSentinel() external view override returns (address) { - return getAddress(PRICE_ORACLE_SENTINEL); - } - - /// @inheritdoc IPoolAddressesProvider - function setPriceOracleSentinel(address newPriceOracleSentinel) external override onlyOwner { - address oldPriceOracleSentinel = _addresses[PRICE_ORACLE_SENTINEL]; - _addresses[PRICE_ORACLE_SENTINEL] = newPriceOracleSentinel; - emit PriceOracleSentinelUpdated(oldPriceOracleSentinel, newPriceOracleSentinel); - } - - /// @inheritdoc IPoolAddressesProvider - function getPoolDataProvider() external view override returns (address) { - return getAddress(DATA_PROVIDER); - } - - /// @inheritdoc IPoolAddressesProvider - function setPoolDataProvider(address newDataProvider) external override onlyOwner { - address oldDataProvider = _addresses[DATA_PROVIDER]; - _addresses[DATA_PROVIDER] = newDataProvider; - emit PoolDataProviderUpdated(oldDataProvider, newDataProvider); - } - - /** - * @notice Internal function to update the implementation of a specific proxied component of the protocol. - * @dev If there is no proxy registered with the given identifier, it creates the proxy setting `newAddress` - * as implementation and calls the initialize() function on the proxy - * @dev If there is already a proxy registered, it just updates the implementation to `newAddress` and - * calls the initialize() function via upgradeToAndCall() in the proxy - * @param id The id of the proxy to be updated - * @param newAddress The address of the new implementation - */ - function _updateImpl(bytes32 id, address newAddress) internal { - address proxyAddress = _addresses[id]; - InitializableImmutableAdminUpgradeabilityProxy proxy; - bytes memory params = abi.encodeWithSignature('initialize(address)', address(this)); - - if (proxyAddress == address(0)) { - proxy = new InitializableImmutableAdminUpgradeabilityProxy(address(this)); - _addresses[id] = proxyAddress = address(proxy); - proxy.initialize(newAddress, params); - emit ProxyCreated(id, proxyAddress, newAddress); - } else { - proxy = InitializableImmutableAdminUpgradeabilityProxy(payable(proxyAddress)); - proxy.upgradeToAndCall(newAddress, params); - } - } - - /** - * @notice Updates the identifier of the Aave market. - * @param newMarketId The new id of the market - */ - function _setMarketId(string memory newMarketId) internal { - string memory oldMarketId = _marketId; - _marketId = newMarketId; - emit MarketIdSet(oldMarketId, newMarketId); - } - - /** - * @notice Returns the the implementation contract of the proxy contract by its identifier. - * @dev It returns ZERO if there is no registered address with the given id - * @dev It reverts if the registered address with the given id is not `InitializableImmutableAdminUpgradeabilityProxy` - * @param id The id - * @return The address of the implementation contract - */ - function _getProxyImplementation(bytes32 id) internal returns (address) { - address proxyAddress = _addresses[id]; - if (proxyAddress == address(0)) { - return address(0); - } else { - address payable payableProxyAddress = payable(proxyAddress); - return InitializableImmutableAdminUpgradeabilityProxy(payableProxyAddress).implementation(); - } - } -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY.sol deleted file mode 100644 index 8ab717ff..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY.sol +++ /dev/null @@ -1,352 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/interfaces/IPoolAddressesProviderRegistry.sol - -/** - * @title IPoolAddressesProviderRegistry - * @author Aave - * @notice Defines the basic interface for an Aave Pool Addresses Provider Registry. - */ -interface IPoolAddressesProviderRegistry { - /** - * @dev Emitted when a new AddressesProvider is registered. - * @param addressesProvider The address of the registered PoolAddressesProvider - * @param id The id of the registered PoolAddressesProvider - */ - event AddressesProviderRegistered(address indexed addressesProvider, uint256 indexed id); - - /** - * @dev Emitted when an AddressesProvider is unregistered. - * @param addressesProvider The address of the unregistered PoolAddressesProvider - * @param id The id of the unregistered PoolAddressesProvider - */ - event AddressesProviderUnregistered(address indexed addressesProvider, uint256 indexed id); - - /** - * @notice Returns the list of registered addresses providers - * @return The list of addresses providers - */ - function getAddressesProvidersList() external view returns (address[] memory); - - /** - * @notice Returns the id of a registered PoolAddressesProvider - * @param addressesProvider The address of the PoolAddressesProvider - * @return The id of the PoolAddressesProvider or 0 if is not registered - */ - function getAddressesProviderIdByAddress( - address addressesProvider - ) external view returns (uint256); - - /** - * @notice Returns the address of a registered PoolAddressesProvider - * @param id The id of the market - * @return The address of the PoolAddressesProvider with the given id or zero address if it is not registered - */ - function getAddressesProviderAddressById(uint256 id) external view returns (address); - - /** - * @notice Registers an addresses provider - * @dev The PoolAddressesProvider must not already be registered in the registry - * @dev The id must not be used by an already registered PoolAddressesProvider - * @param provider The address of the new PoolAddressesProvider - * @param id The id for the new PoolAddressesProvider, referring to the market it belongs to - */ - function registerAddressesProvider(address provider, uint256 id) external; - - /** - * @notice Removes an addresses provider from the list of registered addresses providers - * @param provider The PoolAddressesProvider address - */ - function unregisterAddressesProvider(address provider) external; -} - -// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} - -// downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol - -/** - * @title PoolAddressesProviderRegistry - * @author Aave - * @notice Main registry of PoolAddressesProvider of Aave markets. - * @dev Used for indexing purposes of Aave protocol's markets. The id assigned to a PoolAddressesProvider refers to the - * market it is connected with, for example with `1` for the Aave main market and `2` for the next created. - */ -contract PoolAddressesProviderRegistry is Ownable, IPoolAddressesProviderRegistry { - // Map of address provider ids (addressesProvider => id) - mapping(address => uint256) private _addressesProviderToId; - // Map of id to address provider (id => addressesProvider) - mapping(uint256 => address) private _idToAddressesProvider; - // List of addresses providers - address[] private _addressesProvidersList; - // Map of address provider list indexes (addressesProvider => indexInList) - mapping(address => uint256) private _addressesProvidersIndexes; - - /** - * @dev Constructor. - * @param owner The owner address of this contract. - */ - constructor(address owner) { - transferOwnership(owner); - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function getAddressesProvidersList() external view override returns (address[] memory) { - return _addressesProvidersList; - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function registerAddressesProvider(address provider, uint256 id) external override onlyOwner { - require(id != 0, Errors.INVALID_ADDRESSES_PROVIDER_ID); - require(_idToAddressesProvider[id] == address(0), Errors.INVALID_ADDRESSES_PROVIDER_ID); - require(_addressesProviderToId[provider] == 0, Errors.ADDRESSES_PROVIDER_ALREADY_ADDED); - - _addressesProviderToId[provider] = id; - _idToAddressesProvider[id] = provider; - - _addToAddressesProvidersList(provider); - emit AddressesProviderRegistered(provider, id); - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function unregisterAddressesProvider(address provider) external override onlyOwner { - require(_addressesProviderToId[provider] != 0, Errors.ADDRESSES_PROVIDER_NOT_REGISTERED); - uint256 oldId = _addressesProviderToId[provider]; - _idToAddressesProvider[oldId] = address(0); - _addressesProviderToId[provider] = 0; - - _removeFromAddressesProvidersList(provider); - - emit AddressesProviderUnregistered(provider, oldId); - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function getAddressesProviderIdByAddress( - address addressesProvider - ) external view override returns (uint256) { - return _addressesProviderToId[addressesProvider]; - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function getAddressesProviderAddressById(uint256 id) external view override returns (address) { - return _idToAddressesProvider[id]; - } - - /** - * @notice Adds the addresses provider address to the list. - * @param provider The address of the PoolAddressesProvider - */ - function _addToAddressesProvidersList(address provider) internal { - _addressesProvidersIndexes[provider] = _addressesProvidersList.length; - _addressesProvidersList.push(provider); - } - - /** - * @notice Removes the addresses provider address from the list. - * @param provider The address of the PoolAddressesProvider - */ - function _removeFromAddressesProvidersList(address provider) internal { - uint256 index = _addressesProvidersIndexes[provider]; - - _addressesProvidersIndexes[provider] = 0; - - // Swap the index of the last addresses provider in the list with the index of the provider to remove - uint256 lastIndex = _addressesProvidersList.length - 1; - if (index < lastIndex) { - address lastProvider = _addressesProvidersList[lastIndex]; - _addressesProvidersList[index] = lastProvider; - _addressesProvidersIndexes[lastProvider] = index; - } - _addressesProvidersList.pop(); - } -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol deleted file mode 100644 index 7917b722..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -import './Context.sol'; - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/interfaces/IPoolAddressesProviderRegistry.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/interfaces/IPoolAddressesProviderRegistry.sol deleted file mode 100644 index ee64231a..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/interfaces/IPoolAddressesProviderRegistry.sol +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProviderRegistry - * @author Aave - * @notice Defines the basic interface for an Aave Pool Addresses Provider Registry. - */ -interface IPoolAddressesProviderRegistry { - /** - * @dev Emitted when a new AddressesProvider is registered. - * @param addressesProvider The address of the registered PoolAddressesProvider - * @param id The id of the registered PoolAddressesProvider - */ - event AddressesProviderRegistered(address indexed addressesProvider, uint256 indexed id); - - /** - * @dev Emitted when an AddressesProvider is unregistered. - * @param addressesProvider The address of the unregistered PoolAddressesProvider - * @param id The id of the unregistered PoolAddressesProvider - */ - event AddressesProviderUnregistered(address indexed addressesProvider, uint256 indexed id); - - /** - * @notice Returns the list of registered addresses providers - * @return The list of addresses providers - */ - function getAddressesProvidersList() external view returns (address[] memory); - - /** - * @notice Returns the id of a registered PoolAddressesProvider - * @param addressesProvider The address of the PoolAddressesProvider - * @return The id of the PoolAddressesProvider or 0 if is not registered - */ - function getAddressesProviderIdByAddress( - address addressesProvider - ) external view returns (uint256); - - /** - * @notice Returns the address of a registered PoolAddressesProvider - * @param id The id of the market - * @return The address of the PoolAddressesProvider with the given id or zero address if it is not registered - */ - function getAddressesProviderAddressById(uint256 id) external view returns (address); - - /** - * @notice Registers an addresses provider - * @dev The PoolAddressesProvider must not already be registered in the registry - * @dev The id must not be used by an already registered PoolAddressesProvider - * @param provider The address of the new PoolAddressesProvider - * @param id The id for the new PoolAddressesProvider, referring to the market it belongs to - */ - function registerAddressesProvider(address provider, uint256 id) external; - - /** - * @notice Removes an addresses provider from the list of registered addresses providers - * @param provider The PoolAddressesProvider address - */ - function unregisterAddressesProvider(address provider) external; -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol deleted file mode 100644 index 7368df00..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/configuration/PoolAddressesProviderRegistry.sol +++ /dev/null @@ -1,102 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {Ownable} from '../../dependencies/openzeppelin/contracts/Ownable.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; -import {IPoolAddressesProviderRegistry} from '../../interfaces/IPoolAddressesProviderRegistry.sol'; - -/** - * @title PoolAddressesProviderRegistry - * @author Aave - * @notice Main registry of PoolAddressesProvider of Aave markets. - * @dev Used for indexing purposes of Aave protocol's markets. The id assigned to a PoolAddressesProvider refers to the - * market it is connected with, for example with `1` for the Aave main market and `2` for the next created. - */ -contract PoolAddressesProviderRegistry is Ownable, IPoolAddressesProviderRegistry { - // Map of address provider ids (addressesProvider => id) - mapping(address => uint256) private _addressesProviderToId; - // Map of id to address provider (id => addressesProvider) - mapping(uint256 => address) private _idToAddressesProvider; - // List of addresses providers - address[] private _addressesProvidersList; - // Map of address provider list indexes (addressesProvider => indexInList) - mapping(address => uint256) private _addressesProvidersIndexes; - - /** - * @dev Constructor. - * @param owner The owner address of this contract. - */ - constructor(address owner) { - transferOwnership(owner); - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function getAddressesProvidersList() external view override returns (address[] memory) { - return _addressesProvidersList; - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function registerAddressesProvider(address provider, uint256 id) external override onlyOwner { - require(id != 0, Errors.INVALID_ADDRESSES_PROVIDER_ID); - require(_idToAddressesProvider[id] == address(0), Errors.INVALID_ADDRESSES_PROVIDER_ID); - require(_addressesProviderToId[provider] == 0, Errors.ADDRESSES_PROVIDER_ALREADY_ADDED); - - _addressesProviderToId[provider] = id; - _idToAddressesProvider[id] = provider; - - _addToAddressesProvidersList(provider); - emit AddressesProviderRegistered(provider, id); - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function unregisterAddressesProvider(address provider) external override onlyOwner { - require(_addressesProviderToId[provider] != 0, Errors.ADDRESSES_PROVIDER_NOT_REGISTERED); - uint256 oldId = _addressesProviderToId[provider]; - _idToAddressesProvider[oldId] = address(0); - _addressesProviderToId[provider] = 0; - - _removeFromAddressesProvidersList(provider); - - emit AddressesProviderUnregistered(provider, oldId); - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function getAddressesProviderIdByAddress( - address addressesProvider - ) external view override returns (uint256) { - return _addressesProviderToId[addressesProvider]; - } - - /// @inheritdoc IPoolAddressesProviderRegistry - function getAddressesProviderAddressById(uint256 id) external view override returns (address) { - return _idToAddressesProvider[id]; - } - - /** - * @notice Adds the addresses provider address to the list. - * @param provider The address of the PoolAddressesProvider - */ - function _addToAddressesProvidersList(address provider) internal { - _addressesProvidersIndexes[provider] = _addressesProvidersList.length; - _addressesProvidersList.push(provider); - } - - /** - * @notice Removes the addresses provider address from the list. - * @param provider The address of the PoolAddressesProvider - */ - function _removeFromAddressesProvidersList(address provider) internal { - uint256 index = _addressesProvidersIndexes[provider]; - - _addressesProvidersIndexes[provider] = 0; - - // Swap the index of the last addresses provider in the list with the index of the provider to remove - uint256 lastIndex = _addressesProvidersList.length - 1; - if (index < lastIndex) { - address lastProvider = _addressesProvidersList[lastIndex]; - _addressesProvidersList[index] = lastProvider; - _addressesProvidersIndexes[lastProvider] = index; - } - _addressesProvidersList.pop(); - } -} diff --git a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/POOL_ADDRESSES_PROVIDER_REGISTRY/PoolAddressesProviderRegistry/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL.sol deleted file mode 100644 index e6effd03..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL.sol +++ /dev/null @@ -1,4995 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol - -/** - * @title Proxy - * @dev Implements delegation of calls to other contracts, with proper - * forwarding of return values and bubbling of failures. - * It defines a fallback function that delegates all calls to the address - * returned by the abstract _implementation() internal function. - */ -abstract contract Proxy { - /** - * @dev Fallback function. - * Will run if no other function in the contract matches the call data. - * Implemented entirely in `_fallback`. - */ - fallback() external payable { - _fallback(); - } - - /** - * @dev Fallback function that will run if call data is empty. - * IMPORTANT. receive() on implementation contracts will be unreachable - */ - receive() external payable { - _fallback(); - } - - /** - * @return The Address of the implementation. - */ - function _implementation() internal view virtual returns (address); - - /** - * @dev Delegates execution to an implementation contract. - * This is a low level function that doesn't return to its internal call site. - * It will return to the external caller whatever the implementation returns. - * @param implementation Address to delegate. - */ - function _delegate(address implementation) internal { - //solium-disable-next-line - assembly { - // Copy msg.data. We take full control of memory in this inline assembly - // block because it will not return to Solidity code. We overwrite the - // Solidity scratch pad at memory position 0. - calldatacopy(0, 0, calldatasize()) - - // Call the implementation. - // out and outsize are 0 because we don't know the size yet. - let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) - - // Copy the returned data. - returndatacopy(0, 0, returndatasize()) - - switch result - // delegatecall returns 0 on error. - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } - } - } - - /** - * @dev Function that is run as the first thing in the fallback function. - * Can be redefined in derived contracts to add functionality. - * Redefinitions must call super._willFallback(). - */ - function _willFallback() internal virtual {} - - /** - * @dev fallback implementation. - * Extracted to enable manual triggering. - */ - function _fallback() internal { - _willFallback(); - _delegate(_implementation()); - } -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol - -library ConfiguratorInputTypes { - struct InitReserveInput { - address aTokenImpl; - address variableDebtTokenImpl; - bool useVirtualBalance; - address interestRateStrategyAddress; - address underlyingAsset; - address treasury; - address incentivesController; - string aTokenName; - string aTokenSymbol; - string variableDebtTokenName; - string variableDebtTokenSymbol; - bytes params; - bytes interestRateData; - } - - struct UpdateATokenInput { - address asset; - address treasury; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } - - struct UpdateDebtTokenInput { - address asset; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolDataProvider.sol - -/** - * @title IPoolDataProvider - * @author Aave - * @notice Defines the basic interface of a PoolDataProvider - */ -interface IPoolDataProvider { - struct TokenData { - string symbol; - address tokenAddress; - } - - /** - * @notice Returns the address for the PoolAddressesProvider contract. - * @return The address for the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the list of the existing reserves in the pool. - * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. - * @return The list of reserves, pairs of symbols and addresses - */ - function getAllReservesTokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the list of the existing ATokens in the pool. - * @return The list of ATokens, pairs of symbols and addresses - */ - function getAllATokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the configuration data of the reserve - * @dev Not returning borrow and supply caps for compatibility, nor pause flag - * @param asset The address of the underlying asset of the reserve - * @return decimals The number of decimals of the reserve - * @return ltv The ltv of the reserve - * @return liquidationThreshold The liquidationThreshold of the reserve - * @return liquidationBonus The liquidationBonus of the reserve - * @return reserveFactor The reserveFactor of the reserve - * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise - * @return borrowingEnabled True if borrowing is enabled, false otherwise - * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise - * @return isActive True if it is active, false otherwise - * @return isFrozen True if it is frozen, false otherwise - */ - function getReserveConfigurationData( - address asset - ) - external - view - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ); - - /** - * @notice Returns the caps parameters of the reserve - * @param asset The address of the underlying asset of the reserve - * @return borrowCap The borrow cap of the reserve - * @return supplyCap The supply cap of the reserve - */ - function getReserveCaps( - address asset - ) external view returns (uint256 borrowCap, uint256 supplyCap); - - /** - * @notice Returns if the pool is paused - * @param asset The address of the underlying asset of the reserve - * @return isPaused True if the pool is paused, false otherwise - */ - function getPaused(address asset) external view returns (bool isPaused); - - /** - * @notice Returns the siloed borrowing flag - * @param asset The address of the underlying asset of the reserve - * @return True if the asset is siloed for borrowing - */ - function getSiloedBorrowing(address asset) external view returns (bool); - - /** - * @notice Returns the protocol fee on the liquidation bonus - * @param asset The address of the underlying asset of the reserve - * @return The protocol fee on liquidation - */ - function getLiquidationProtocolFee(address asset) external view returns (uint256); - - /** - * @notice Returns the unbacked mint cap of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The unbacked mint cap of the reserve - */ - function getUnbackedMintCap(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The debt ceiling of the reserve - */ - function getDebtCeiling(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling decimals - * @return The debt ceiling decimals - */ - function getDebtCeilingDecimals() external pure returns (uint256); - - /** - * @notice Returns the reserve data - * @param asset The address of the underlying asset of the reserve - * @return unbacked The amount of unbacked tokens - * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted - * @return totalAToken The total supply of the aToken - * @return totalStableDebt The total stable debt of the reserve - * @return totalVariableDebt The total variable debt of the reserve - * @return liquidityRate The liquidity rate of the reserve - * @return variableBorrowRate The variable borrow rate of the reserve - * @return stableBorrowRate The stable borrow rate of the reserve - * @return averageStableBorrowRate The average stable borrow rate of the reserve - * @return liquidityIndex The liquidity index of the reserve - * @return variableBorrowIndex The variable borrow index of the reserve - * @return lastUpdateTimestamp The timestamp of the last update of the reserve - */ - function getReserveData( - address asset - ) - external - view - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ); - - /** - * @notice Returns the total supply of aTokens for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total supply of the aToken - */ - function getATokenTotalSupply(address asset) external view returns (uint256); - - /** - * @notice Returns the total debt for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total debt for asset - */ - function getTotalDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the user data in a reserve - * @param asset The address of the underlying asset of the reserve - * @param user The address of the user - * @return currentATokenBalance The current AToken balance of the user - * @return currentStableDebt The current stable debt of the user - * @return currentVariableDebt The current variable debt of the user - * @return principalStableDebt The principal stable debt of the user - * @return scaledVariableDebt The scaled variable debt of the user - * @return stableBorrowRate The stable borrow rate of the user - * @return liquidityRate The liquidity rate of the reserve - * @return stableRateLastUpdated The timestamp of the last update of the user stable rate - * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false - * otherwise - */ - function getUserReserveData( - address asset, - address user - ) - external - view - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ); - - /** - * @notice Returns the token addresses of the reserve - * @param asset The address of the underlying asset of the reserve - * @return aTokenAddress The AToken address of the reserve - * @return stableDebtTokenAddress DEPRECATED in v3.2.0 - * @return variableDebtTokenAddress The VariableDebtToken address of the reserve - */ - function getReserveTokensAddresses( - address asset - ) - external - view - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ); - - /** - * @notice Returns the address of the Interest Rate strategy - * @param asset The address of the underlying asset of the reserve - * @return irStrategyAddress The address of the Interest Rate strategy - */ - function getInterestRateStrategyAddress( - address asset - ) external view returns (address irStrategyAddress); - - /** - * @notice Returns whether the reserve has FlashLoans enabled or disabled - * @param asset The address of the underlying asset of the reserve - * @return True if FlashLoans are enabled, false otherwise - */ - function getFlashLoanEnabled(address asset) external view returns (bool); - - /** - * @notice Returns whether virtual accounting is enabled/not for a reserve - * @param asset The address of the underlying asset of the reserve - * @return True if active, false otherwise - */ - function getIsVirtualAccActive(address asset) external view returns (bool); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint256); -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol - -/** - * @title BaseUpgradeabilityProxy - * @dev This contract implements a proxy that allows to change the - * implementation address to which it will delegate. - * Such a change is called an implementation upgrade. - */ -contract BaseUpgradeabilityProxy is Proxy { - /** - * @dev Emitted when the implementation is upgraded. - * @param implementation Address of the new implementation. - */ - event Upgraded(address indexed implementation); - - /** - * @dev Storage slot with the address of the current implementation. - * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant IMPLEMENTATION_SLOT = - 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /** - * @dev Returns the current implementation. - * @return impl Address of the current implementation - */ - function _implementation() internal view override returns (address impl) { - bytes32 slot = IMPLEMENTATION_SLOT; - //solium-disable-next-line - assembly { - impl := sload(slot) - } - } - - /** - * @dev Upgrades the proxy to a new implementation. - * @param newImplementation Address of the new implementation. - */ - function _upgradeTo(address newImplementation) internal { - _setImplementation(newImplementation); - emit Upgraded(newImplementation); - } - - /** - * @dev Sets the implementation address of the proxy. - * @param newImplementation Address of the new implementation. - */ - function _setImplementation(address newImplementation) internal { - require( - Address.isContract(newImplementation), - 'Cannot set a proxy implementation to a non-contract address' - ); - - bytes32 slot = IMPLEMENTATION_SLOT; - - //solium-disable-next-line - assembly { - sstore(slot, newImplementation) - } - } -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol - -/** - * @title InitializableUpgradeabilityProxy - * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing - * implementation and init data. - */ -contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { - /** - * @dev Contract initializer. - * @param _logic Address of the initial implementation. - * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. - */ - function initialize(address _logic, bytes memory _data) public payable { - require(_implementation() == address(0)); - assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); - _setImplementation(_logic); - if (_data.length > 0) { - (bool success, ) = _logic.delegatecall(_data); - require(success); - } - } -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol - -/** - * @title IDefaultInterestRateStrategyV2 - * @author BGD Labs - * @notice Interface of the default interest rate strategy used by the Aave protocol - */ -interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { - /** - * @notice Holds the interest rate data for a given reserve - * - * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This - * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. - * - * @param optimalUsageRatio The optimal usage ratio, in bps - * @param baseVariableBorrowRate The base variable borrow rate, in bps - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps - */ - struct InterestRateData { - uint16 optimalUsageRatio; - uint32 baseVariableBorrowRate; - uint32 variableRateSlope1; - uint32 variableRateSlope2; - } - - /** - * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, - * used in in-memory calculations. - * - * @param optimalUsageRatio The optimal usage ratio - * @param baseVariableBorrowRate The base variable borrow rate - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio - */ - struct InterestRateDataRay { - uint256 optimalUsageRatio; - uint256 baseVariableBorrowRate; - uint256 variableRateSlope1; - uint256 variableRateSlope2; - } - - /** - * @notice emitted when new interest rate data is set in a reserve - * - * @param reserve address of the reserve that has new interest rate data set - * @param optimalUsageRatio The optimal usage ratio, in bps - * @param baseVariableBorrowRate The base variable borrow rate, in bps - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps - */ - event RateDataUpdate( - address indexed reserve, - uint256 optimalUsageRatio, - uint256 baseVariableBorrowRate, - uint256 variableRateSlope1, - uint256 variableRateSlope2 - ); - - /** - * @notice Returns the address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the maximum value achievable for variable borrow rate, in bps - * @return The maximum rate - */ - function MAX_BORROW_RATE() external view returns (uint256); - - /** - * @notice Returns the minimum optimal point, in bps - * @return The optimal point - */ - function MIN_OPTIMAL_POINT() external view returns (uint256); - - /** - * @notice Returns the maximum optimal point, in bps - * @return The optimal point - */ - function MAX_OPTIMAL_POINT() external view returns (uint256); - - /** - * notice Returns the full InterestRateData object for the given reserve, in ray - * - * @param reserve The reserve to get the data of - * - * @return The InterestRateDataRay object for the given reserve - */ - function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); - - /** - * notice Returns the full InterestRateDataRay object for the given reserve, in bps - * - * @param reserve The reserve to get the data of - * - * @return The InterestRateData object for the given reserve - */ - function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); - - /** - * @notice Returns the optimal usage rate for the given reserve in ray - * - * @param reserve The reserve to get the optimal usage rate of - * - * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate - */ - function getOptimalUsageRatio(address reserve) external view returns (uint256); - - /** - * @notice Returns the variable rate slope below optimal usage ratio in ray - * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO - * - * @param reserve The reserve to get the variable rate slope 1 of - * - * @return The variable rate slope - */ - function getVariableRateSlope1(address reserve) external view returns (uint256); - - /** - * @notice Returns the variable rate slope above optimal usage ratio in ray - * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO - * - * @param reserve The reserve to get the variable rate slope 2 of - * - * @return The variable rate slope - */ - function getVariableRateSlope2(address reserve) external view returns (uint256); - - /** - * @notice Returns the base variable borrow rate, in ray - * - * @param reserve The reserve to get the base variable borrow rate of - * - * @return The base variable borrow rate - */ - function getBaseVariableBorrowRate(address reserve) external view returns (uint256); - - /** - * @notice Returns the maximum variable borrow rate, in ray - * - * @param reserve The reserve to get the maximum variable borrow rate of - * - * @return The maximum variable borrow rate - */ - function getMaxVariableBorrowRate(address reserve) external view returns (uint256); - - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The reserve interest rate data to apply to the given reserve - * Being specific to this custom implementation, with custom struct type, - * overloading the function on the generic interface - */ - function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol - -/** - * @title BaseImmutableAdminUpgradeabilityProxy - * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern - * @notice This contract combines an upgradeability proxy with an authorization - * mechanism for administrative tasks. - * @dev The admin role is stored in an immutable, which helps saving transactions costs - * All external functions in this contract must be guarded by the - * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity - * feature proposal that would enable this to be done automatically. - */ -contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - address internal immutable _admin; - - /** - * @dev Constructor. - * @param admin_ The address of the admin - */ - constructor(address admin_) { - _admin = admin_; - } - - modifier ifAdmin() { - if (msg.sender == _admin) { - _; - } else { - _fallback(); - } - } - - /** - * @notice Return the admin address - * @return The address of the proxy admin. - */ - function admin() external ifAdmin returns (address) { - return _admin; - } - - /** - * @notice Return the implementation address - * @return The address of the implementation. - */ - function implementation() external ifAdmin returns (address) { - return _implementation(); - } - - /** - * @notice Upgrade the backing implementation of the proxy. - * @dev Only the admin can call this function. - * @param newImplementation The address of the new implementation. - */ - function upgradeTo(address newImplementation) external ifAdmin { - _upgradeTo(newImplementation); - } - - /** - * @notice Upgrade the backing implementation of the proxy and call a function - * on the new implementation. - * @dev This is useful to initialize the proxied contract. - * @param newImplementation The address of the new implementation. - * @param data Data to send as msg.data in the low level call. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - */ - function upgradeToAndCall( - address newImplementation, - bytes calldata data - ) external payable ifAdmin { - _upgradeTo(newImplementation); - (bool success, ) = newImplementation.delegatecall(data); - require(success); - } - - /** - * @notice Only fall back when the sender is not the admin. - */ - function _willFallback() internal virtual override { - require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); - super._willFallback(); - } -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolConfigurator.sol - -/** - * @title IPoolConfigurator - * @author Aave - * @notice Defines the basic interface for a Pool configurator. - */ -interface IPoolConfigurator { - /** - * @dev Emitted when a reserve is initialized. - * @param asset The address of the underlying asset of the reserve - * @param aToken The address of the associated aToken contract - * @param stableDebtToken, DEPRECATED in v3.2.0 - * @param variableDebtToken The address of the associated variable rate debt token - * @param interestRateStrategyAddress The address of the interest rate strategy for the reserve - */ - event ReserveInitialized( - address indexed asset, - address indexed aToken, - address stableDebtToken, - address variableDebtToken, - address interestRateStrategyAddress - ); - - /** - * @dev Emitted when borrowing is enabled or disabled on a reserve. - * @param asset The address of the underlying asset of the reserve - * @param enabled True if borrowing is enabled, false otherwise - */ - event ReserveBorrowing(address indexed asset, bool enabled); - - /** - * @dev Emitted when flashloans are enabled or disabled on a reserve. - * @param asset The address of the underlying asset of the reserve - * @param enabled True if flashloans are enabled, false otherwise - */ - event ReserveFlashLoaning(address indexed asset, bool enabled); - - /** - * @dev Emitted when the ltv is set for the frozen asset. - * @param asset The address of the underlying asset of the reserve - * @param ltv The loan to value of the asset when used as collateral - */ - event PendingLtvChanged(address indexed asset, uint256 ltv); - - /** - * @dev Emitted when the collateralization risk parameters for the specified asset are updated. - * @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 - */ - event CollateralConfigurationChanged( - address indexed asset, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus - ); - - /** - * @dev Emitted when a reserve is activated or deactivated - * @param asset The address of the underlying asset of the reserve - * @param active True if reserve is active, false otherwise - */ - event ReserveActive(address indexed asset, bool active); - - /** - * @dev Emitted when a reserve is frozen or unfrozen - * @param asset The address of the underlying asset of the reserve - * @param frozen True if reserve is frozen, false otherwise - */ - event ReserveFrozen(address indexed asset, bool frozen); - - /** - * @dev Emitted when a reserve is paused or unpaused - * @param asset The address of the underlying asset of the reserve - * @param paused True if reserve is paused, false otherwise - */ - event ReservePaused(address indexed asset, bool paused); - - /** - * @dev Emitted when a reserve is dropped. - * @param asset The address of the underlying asset of the reserve - */ - event ReserveDropped(address indexed asset); - - /** - * @dev Emitted when a reserve factor is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldReserveFactor The old reserve factor, expressed in bps - * @param newReserveFactor The new reserve factor, expressed in bps - */ - event ReserveFactorChanged( - address indexed asset, - uint256 oldReserveFactor, - uint256 newReserveFactor - ); - - /** - * @dev Emitted when the borrow cap of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldBorrowCap The old borrow cap - * @param newBorrowCap The new borrow cap - */ - event BorrowCapChanged(address indexed asset, uint256 oldBorrowCap, uint256 newBorrowCap); - - /** - * @dev Emitted when the supply cap of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldSupplyCap The old supply cap - * @param newSupplyCap The new supply cap - */ - event SupplyCapChanged(address indexed asset, uint256 oldSupplyCap, uint256 newSupplyCap); - - /** - * @dev Emitted when the liquidation protocol fee of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldFee The old liquidation protocol fee, expressed in bps - * @param newFee The new liquidation protocol fee, expressed in bps - */ - event LiquidationProtocolFeeChanged(address indexed asset, uint256 oldFee, uint256 newFee); - - /** - * @dev Emitted when the liquidation grace period is updated. - * @param asset The address of the underlying asset of the reserve - * @param gracePeriodUntil Timestamp until when liquidations will not be allowed post-unpause - */ - event LiquidationGracePeriodChanged(address indexed asset, uint40 gracePeriodUntil); - - /** - * @dev Emitted when the liquidation grace period is disabled. - * @param asset The address of the underlying asset of the reserve - */ - event LiquidationGracePeriodDisabled(address indexed asset); - - /** - * @dev Emitted when the unbacked mint cap of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldUnbackedMintCap The old unbacked mint cap - * @param newUnbackedMintCap The new unbacked mint cap - */ - event UnbackedMintCapChanged( - address indexed asset, - uint256 oldUnbackedMintCap, - uint256 newUnbackedMintCap - ); - - /** - * @dev Emitted when an collateral configuration of an asset in an eMode is changed. - * @param asset The address of the underlying asset of the reserve - * @param categoryId The eMode category - * @param collateral True if the asset is enabled as collateral in the eMode, false otherwise. - */ - event AssetCollateralInEModeChanged(address indexed asset, uint8 categoryId, bool collateral); - - /** - * @dev Emitted when the borrowable configuration of an asset in an eMode changed. - * @param asset The address of the underlying asset of the reserve - * @param categoryId The eMode category - * @param borrowable True if the asset is enabled as borrowable in the eMode, false otherwise. - */ - event AssetBorrowableInEModeChanged(address indexed asset, uint8 categoryId, bool borrowable); - - /** - * @dev Emitted when a new eMode category is added or an existing category is altered. - * @param categoryId The new eMode category id - * @param ltv The ltv for the asset category in eMode - * @param liquidationThreshold The liquidationThreshold for the asset category in eMode - * @param liquidationBonus The liquidationBonus for the asset category in eMode - * @param oracle DEPRECATED in v3.2.0 - * @param label A human readable identifier for the category - */ - event EModeCategoryAdded( - uint8 indexed categoryId, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - address oracle, - string label - ); - - /** - * @dev Emitted when a reserve interest strategy contract is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldStrategy The address of the old interest strategy contract - * @param newStrategy The address of the new interest strategy contract - */ - event ReserveInterestRateStrategyChanged( - address indexed asset, - address oldStrategy, - address newStrategy - ); - - /** - * @dev Emitted when the data of a reserve interest strategy contract is updated. - * @param asset The address of the underlying asset of the reserve - * @param data abi encoded data - */ - event ReserveInterestRateDataChanged(address indexed asset, address indexed strategy, bytes data); - - /** - * @dev Emitted when an aToken implementation is upgraded. - * @param asset The address of the underlying asset of the reserve - * @param proxy The aToken proxy address - * @param implementation The new aToken implementation - */ - event ATokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @dev Emitted when the implementation of a variable debt token is upgraded. - * @param asset The address of the underlying asset of the reserve - * @param proxy The variable debt token proxy address - * @param implementation The new aToken implementation - */ - event VariableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @dev Emitted when the debt ceiling of an asset is set. - * @param asset The address of the underlying asset of the reserve - * @param oldDebtCeiling The old debt ceiling - * @param newDebtCeiling The new debt ceiling - */ - event DebtCeilingChanged(address indexed asset, uint256 oldDebtCeiling, uint256 newDebtCeiling); - - /** - * @dev Emitted when the the siloed borrowing state for an asset is changed. - * @param asset The address of the underlying asset of the reserve - * @param oldState The old siloed borrowing state - * @param newState The new siloed borrowing state - */ - event SiloedBorrowingChanged(address indexed asset, bool oldState, bool newState); - - /** - * @dev Emitted when the bridge protocol fee is updated. - * @param oldBridgeProtocolFee The old protocol fee, expressed in bps - * @param newBridgeProtocolFee The new protocol fee, expressed in bps - */ - event BridgeProtocolFeeUpdated(uint256 oldBridgeProtocolFee, uint256 newBridgeProtocolFee); - - /** - * @dev Emitted when the total premium on flashloans is updated. - * @param oldFlashloanPremiumTotal The old premium, expressed in bps - * @param newFlashloanPremiumTotal The new premium, expressed in bps - */ - event FlashloanPremiumTotalUpdated( - uint128 oldFlashloanPremiumTotal, - uint128 newFlashloanPremiumTotal - ); - - /** - * @dev Emitted when the part of the premium that goes to protocol is updated. - * @param oldFlashloanPremiumToProtocol The old premium, expressed in bps - * @param newFlashloanPremiumToProtocol The new premium, expressed in bps - */ - event FlashloanPremiumToProtocolUpdated( - uint128 oldFlashloanPremiumToProtocol, - uint128 newFlashloanPremiumToProtocol - ); - - /** - * @dev Emitted when the reserve is set as borrowable/non borrowable in isolation mode. - * @param asset The address of the underlying asset of the reserve - * @param borrowable True if the reserve is borrowable in isolation, false otherwise - */ - event BorrowableInIsolationChanged(address asset, bool borrowable); - - /** - * @notice Initializes multiple reserves. - * @dev param useVirtualBalance of the input struct should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param input The array of initialization parameters - */ - function initReserves(ConfiguratorInputTypes.InitReserveInput[] calldata input) external; - - /** - * @dev Updates the aToken implementation for the reserve. - * @param input The aToken update parameters - */ - function updateAToken(ConfiguratorInputTypes.UpdateATokenInput calldata input) external; - - /** - * @notice Updates the variable debt token implementation for the asset. - * @param input The variableDebtToken update parameters - */ - function updateVariableDebtToken( - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external; - - /** - * @notice Configures borrowing on a reserve. - * @param asset The address of the underlying asset of the reserve - * @param enabled True if borrowing needs to be enabled, false otherwise - */ - function setReserveBorrowing(address asset, bool enabled) external; - - /** - * @notice Configures the reserve collateralization parameters. - * @dev All the values are expressed in bps. A value of 10000, results in 100.00% - * @dev The `liquidationBonus` is always above 100%. A value of 105% means the liquidator will receive a 5% bonus - * @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 - */ - function configureReserveAsCollateral( - address asset, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus - ) external; - - /** - * @notice Enable or disable flashloans on a reserve - * @param asset The address of the underlying asset of the reserve - * @param enabled True if flashloans need to be enabled, false otherwise - */ - function setReserveFlashLoaning(address asset, bool enabled) external; - - /** - * @notice Activate or deactivate a reserve - * @param asset The address of the underlying asset of the reserve - * @param active True if the reserve needs to be active, false otherwise - */ - function setReserveActive(address asset, bool active) external; - - /** - * @notice Freeze or unfreeze a reserve. A frozen reserve doesn't allow any new supply, borrow - * or rate swap but allows repayments, liquidations, rate rebalances and withdrawals. - * @param asset The address of the underlying asset of the reserve - * @param freeze True if the reserve needs to be frozen, false otherwise - */ - function setReserveFreeze(address asset, bool freeze) external; - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the - * borrowed amount will be accumulated in the isolated collateral's total debt exposure - * @dev Only assets of the same family (e.g. USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations - * @param asset The address of the underlying asset of the reserve - * @param borrowable True if the asset should be borrowable in isolation, false otherwise - */ - function setBorrowableInIsolation(address asset, bool borrowable) external; - - /** - * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, - * swap interest rate, liquidate, atoken transfers). - * @param asset The address of the underlying asset of the reserve - * @param paused True if pausing the reserve, false if unpausing - * @param gracePeriod Count of seconds after unpause during which liquidations will not be available - * - Only applicable whenever unpausing (`paused` as false) - * - Passing 0 means no grace period - * - Capped to maximum MAX_GRACE_PERIOD - */ - function setReservePause(address asset, bool paused, uint40 gracePeriod) external; - - /** - * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, - * swap interest rate, liquidate, atoken transfers). - * @dev Version with no grace period - * @param asset The address of the underlying asset of the reserve - * @param paused True if pausing the reserve, false if unpausing - */ - function setReservePause(address asset, bool paused) external; - - /** - * @notice Disables liquidation grace period for the asset. The liquidation grace period is set in the past - * so that liquidations are allowed for the asset. - * @param asset The address of the underlying asset of the reserve - */ - function disableLiquidationGracePeriod(address asset) external; - - /** - * @notice Updates the reserve factor of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newReserveFactor The new reserve factor of the reserve - */ - function setReserveFactor(address asset, uint256 newReserveFactor) external; - - /** - * @notice Sets the interest rate strategy of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newRateStrategyAddress The address of the new interest strategy contract - * @param rateData bytes-encoded rate data. In this format in order to allow the rate strategy contract - * to de-structure custom data - */ - function setReserveInterestRateStrategyAddress( - address asset, - address newRateStrategyAddress, - bytes calldata rateData - ) external; - - /** - * @notice Sets interest rate data for a reserve - * @param asset The address of the underlying asset of the reserve - * @param rateData bytes-encoded rate data. In this format in order to allow the rate strategy contract - * to de-structure custom data - */ - function setReserveInterestRateData(address asset, bytes calldata rateData) external; - - /** - * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions - * are suspended. - * @param paused True if protocol needs to be paused, false otherwise - * @param gracePeriod Count of seconds after unpause during which liquidations will not be available - * - Only applicable whenever unpausing (`paused` as false) - * - Passing 0 means no grace period - * - Capped to maximum MAX_GRACE_PERIOD - */ - function setPoolPause(bool paused, uint40 gracePeriod) external; - - /** - * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions - * are suspended. - * @dev Version with no grace period - * @param paused True if protocol needs to be paused, false otherwise - */ - function setPoolPause(bool paused) external; - - /** - * @notice Updates the borrow cap of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newBorrowCap The new borrow cap of the reserve - */ - function setBorrowCap(address asset, uint256 newBorrowCap) external; - - /** - * @notice Updates the supply cap of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newSupplyCap The new supply cap of the reserve - */ - function setSupplyCap(address asset, uint256 newSupplyCap) external; - - /** - * @notice Updates the liquidation protocol fee of reserve. - * @param asset The address of the underlying asset of the reserve - * @param newFee The new liquidation protocol fee of the reserve, expressed in bps - */ - function setLiquidationProtocolFee(address asset, uint256 newFee) external; - - /** - * @notice Updates the unbacked mint cap of reserve. - * @param asset The address of the underlying asset of the reserve - * @param newUnbackedMintCap The new unbacked mint cap of the reserve - */ - function setUnbackedMintCap(address asset, uint256 newUnbackedMintCap) external; - - /** - * @notice Enables/disables an asset to be borrowable in a selected eMode. - * - eMode.borrowable always has less priority then reserve.borrowable - * @param asset The address of the underlying asset of the reserve - * @param categoryId The eMode categoryId - * @param borrowable True if the asset should be borrowable in the given eMode category, false otherwise. - */ - function setAssetBorrowableInEMode(address asset, uint8 categoryId, bool borrowable) external; - - /** - * @notice Enables/disables an asset to be collateral in a selected eMode. - * @param asset The address of the underlying asset of the reserve - * @param categoryId The eMode categoryId - * @param collateral True if the asset should be collateral in the given eMode category, false otherwise. - */ - function setAssetCollateralInEMode(address asset, uint8 categoryId, bool collateral) external; - - /** - * @notice Adds a new efficiency mode (eMode) category or alters a existing one. - * @param categoryId The id of the category to be configured - * @param ltv The ltv associated with the category - * @param liquidationThreshold The liquidation threshold associated with the category - * @param liquidationBonus The liquidation bonus associated with the category - * @param label A label identifying the category - */ - function setEModeCategory( - uint8 categoryId, - uint16 ltv, - uint16 liquidationThreshold, - uint16 liquidationBonus, - string calldata label - ) external; - - /** - * @notice Drops a reserve entirely. - * @param asset The address of the reserve to drop - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the bridge fee collected by the protocol reserves. - * @param newBridgeProtocolFee The part of the fee sent to the protocol treasury, expressed in bps - */ - function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external; - - /** - * @notice Updates the total flash loan premium. - * Total flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra balance - * - A part is collected by the protocol reserves - * @dev Expressed in bps - * @dev The premium is calculated on the total amount borrowed - * @param newFlashloanPremiumTotal The total flashloan premium - */ - function updateFlashloanPremiumTotal(uint128 newFlashloanPremiumTotal) external; - - /** - * @notice Updates the flash loan premium collected by protocol reserves - * @dev Expressed in bps - * @dev The premium to protocol is calculated on the total flashloan premium - * @param newFlashloanPremiumToProtocol The part of the flashloan premium sent to the protocol treasury - */ - function updateFlashloanPremiumToProtocol(uint128 newFlashloanPremiumToProtocol) external; - - /** - * @notice Sets the debt ceiling for an asset. - * @param newDebtCeiling The new debt ceiling - */ - function setDebtCeiling(address asset, uint256 newDebtCeiling) external; - - /** - * @notice Sets siloed borrowing for an asset - * @param siloed The new siloed borrowing state - */ - function setSiloedBorrowing(address asset, bool siloed) external; - - /** - * @notice Gets pending ltv value - * @param asset The new siloed borrowing state - */ - function getPendingLtv(address asset) external view returns (uint256); - - /** - * @notice Gets the address of the external ConfiguratorLogic - */ - function getConfiguratorLogic() external view returns (address); - - /** - * @notice Gets the maximum liquidations grace period allowed, in seconds - */ - function MAX_GRACE_PERIOD() external view returns (uint40); -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol - -/** - * @title InitializableAdminUpgradeabilityProxy - * @author Aave - * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function - */ -contract InitializableImmutableAdminUpgradeabilityProxy is - BaseImmutableAdminUpgradeabilityProxy, - InitializableUpgradeabilityProxy -{ - /** - * @dev Constructor. - * @param admin The address of the admin - */ - constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { - // Intentionally left blank - } - - /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy - function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { - BaseImmutableAdminUpgradeabilityProxy._willFallback(); - } -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol - -/** - * @title ConfiguratorLogic library - * @author Aave - * @notice Implements the functions to initialize reserves and update aTokens and debtTokens - */ -library ConfiguratorLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPoolConfigurator` for descriptions - event ReserveInitialized( - address indexed asset, - address indexed aToken, - address stableDebtToken, - address variableDebtToken, - address interestRateStrategyAddress - ); - event ATokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - event VariableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @notice Initialize a reserve by creating and initializing aToken and variable debt token - * @dev Emits the `ReserveInitialized` event - * @param pool The Pool in which the reserve will be initialized - * @param input The needed parameters for the initialization - */ - function executeInitReserve( - IPool pool, - ConfiguratorInputTypes.InitReserveInput calldata input - ) external { - // It is an assumption that the asset listed is non-malicious, and the external call doesn't create re-entrancies - uint8 underlyingAssetDecimals = IERC20Detailed(input.underlyingAsset).decimals(); - require(underlyingAssetDecimals > 5, Errors.INVALID_DECIMALS); - - address aTokenProxyAddress = _initTokenWithProxy( - input.aTokenImpl, - abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - pool, - input.treasury, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.aTokenName, - input.aTokenSymbol, - input.params - ) - ); - - address variableDebtTokenProxyAddress = _initTokenWithProxy( - input.variableDebtTokenImpl, - abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - pool, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.variableDebtTokenName, - input.variableDebtTokenSymbol, - input.params - ) - ); - - pool.initReserve( - input.underlyingAsset, - aTokenProxyAddress, - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - - DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); - - currentConfig.setDecimals(underlyingAssetDecimals); - - currentConfig.setActive(true); - currentConfig.setPaused(false); - currentConfig.setFrozen(false); - currentConfig.setVirtualAccActive(input.useVirtualBalance); - - pool.setConfiguration(input.underlyingAsset, currentConfig); - - IReserveInterestRateStrategy(input.interestRateStrategyAddress).setInterestRateParams( - input.underlyingAsset, - input.interestRateData - ); - - emit ReserveInitialized( - input.underlyingAsset, - aTokenProxyAddress, - address(0), - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - } - - /** - * @notice Updates the aToken implementation and initializes it - * @dev Emits the `ATokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the aToken - * @param input The parameters needed for the initialize call - */ - function executeUpdateAToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateATokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - cachedPool, - input.treasury, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); - - emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); - } - - /** - * @notice Updates the variable debt token implementation and initializes it - * @dev Emits the `VariableDebtTokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the variable debt token - * @param input The parameters needed for the initialize call - */ - function executeUpdateVariableDebtToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - cachedPool, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation( - reserveData.variableDebtTokenAddress, - input.implementation, - encodedCall - ); - - emit VariableDebtTokenUpgraded( - input.asset, - reserveData.variableDebtTokenAddress, - input.implementation - ); - } - - /** - * @notice Creates a new proxy and initializes the implementation - * @param implementation The address of the implementation - * @param initParams The parameters that is passed to the implementation to initialize - * @return The address of initialized proxy - */ - function _initTokenWithProxy( - address implementation, - bytes memory initParams - ) internal returns (address) { - InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( - address(this) - ); - - proxy.initialize(implementation, initParams); - - return address(proxy); - } - - /** - * @notice Upgrades the implementation and makes call to the proxy - * @dev The call is used to initialize the new implementation. - * @param proxyAddress The address of the proxy - * @param implementation The address of the new implementation - * @param initParams The parameters to the call after the upgrade - */ - function _upgradeTokenImplementation( - address proxyAddress, - address implementation, - bytes memory initParams - ) internal { - InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( - payable(proxyAddress) - ); - - proxy.upgradeToAndCall(implementation, initParams); - } -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/pool/PoolConfigurator.sol - -/** - * @title PoolConfigurator - * @author Aave - * @dev Implements the configuration methods for the Aave protocol - */ -abstract contract PoolConfigurator is VersionedInitializable, IPoolConfigurator { - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - IPoolAddressesProvider internal _addressesProvider; - IPool internal _pool; - - mapping(address => uint256) internal _pendingLtv; - - uint40 public constant MAX_GRACE_PERIOD = 4 hours; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - _onlyPoolAdmin(); - _; - } - - /** - * @dev Only emergency or pool admin can call functions marked by this modifier. - */ - modifier onlyEmergencyOrPoolAdmin() { - _onlyPoolOrEmergencyAdmin(); - _; - } - - /** - * @dev Only asset listing or pool admin can call functions marked by this modifier. - */ - modifier onlyAssetListingOrPoolAdmins() { - _onlyAssetListingOrPoolAdmins(); - _; - } - - /** - * @dev Only risk or pool admin can call functions marked by this modifier. - */ - modifier onlyRiskOrPoolAdmins() { - _onlyRiskOrPoolAdmins(); - _; - } - - /** - * @dev Only risk, pool or emergency admin can call functions marked by this modifier. - */ - modifier onlyRiskOrPoolOrEmergencyAdmins() { - _onlyRiskOrPoolOrEmergencyAdmins(); - _; - } - - function initialize(IPoolAddressesProvider provider) public virtual; - - /// @inheritdoc IPoolConfigurator - function initReserves( - ConfiguratorInputTypes.InitReserveInput[] calldata input - ) external override onlyAssetListingOrPoolAdmins { - IPool cachedPool = _pool; - - for (uint256 i = 0; i < input.length; i++) { - ConfiguratorLogic.executeInitReserve(cachedPool, input[i]); - emit ReserveInterestRateDataChanged( - input[i].underlyingAsset, - input[i].interestRateStrategyAddress, - input[i].interestRateData - ); - } - } - - /// @inheritdoc IPoolConfigurator - function dropReserve(address asset) external override onlyPoolAdmin { - _pool.dropReserve(asset); - emit ReserveDropped(asset); - } - - /// @inheritdoc IPoolConfigurator - function updateAToken( - ConfiguratorInputTypes.UpdateATokenInput calldata input - ) external override onlyPoolAdmin { - ConfiguratorLogic.executeUpdateAToken(_pool, input); - } - - /// @inheritdoc IPoolConfigurator - function updateVariableDebtToken( - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external override onlyPoolAdmin { - ConfiguratorLogic.executeUpdateVariableDebtToken(_pool, input); - } - - /// @inheritdoc IPoolConfigurator - function setReserveBorrowing(address asset, bool enabled) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setBorrowingEnabled(enabled); - _pool.setConfiguration(asset, currentConfig); - emit ReserveBorrowing(asset, enabled); - } - - /// @inheritdoc IPoolConfigurator - function configureReserveAsCollateral( - address asset, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus - ) external override onlyRiskOrPoolAdmins { - //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_RESERVE_PARAMS); - - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - if (liquidationThreshold != 0) { - //liquidation bonus must be bigger than 100.00%, otherwise the liquidator would receive less - //collateral than needed to cover the debt - require(liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_PARAMS); - - //if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment - //a loan is taken there is enough collateral available to cover the liquidation bonus - require( - liquidationThreshold.percentMul(liquidationBonus) <= PercentageMath.PERCENTAGE_FACTOR, - Errors.INVALID_RESERVE_PARAMS - ); - } else { - require(liquidationBonus == 0, Errors.INVALID_RESERVE_PARAMS); - //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 supplied - _checkNoSuppliers(asset); - } - - uint256 newLtv = ltv; - - if (currentConfig.getFrozen()) { - _pendingLtv[asset] = ltv; - newLtv = 0; - - emit PendingLtvChanged(asset, ltv); - } else { - currentConfig.setLtv(ltv); - } - - currentConfig.setLiquidationThreshold(liquidationThreshold); - currentConfig.setLiquidationBonus(liquidationBonus); - - _pool.setConfiguration(asset, currentConfig); - - emit CollateralConfigurationChanged(asset, newLtv, liquidationThreshold, liquidationBonus); - } - - /// @inheritdoc IPoolConfigurator - function setReserveFlashLoaning( - address asset, - bool enabled - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - currentConfig.setFlashLoanEnabled(enabled); - _pool.setConfiguration(asset, currentConfig); - emit ReserveFlashLoaning(asset, enabled); - } - - /// @inheritdoc IPoolConfigurator - function setReserveActive(address asset, bool active) external override onlyPoolAdmin { - if (!active) _checkNoSuppliers(asset); - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setActive(active); - _pool.setConfiguration(asset, currentConfig); - emit ReserveActive(asset, active); - } - - /// @inheritdoc IPoolConfigurator - function setReserveFreeze( - address asset, - bool freeze - ) external override onlyRiskOrPoolOrEmergencyAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - require(freeze != currentConfig.getFrozen(), Errors.INVALID_FREEZE_STATE); - - currentConfig.setFrozen(freeze); - - uint256 ltvSet; - uint256 pendingLtvSet; - - if (freeze) { - pendingLtvSet = currentConfig.getLtv(); - _pendingLtv[asset] = pendingLtvSet; - currentConfig.setLtv(0); - } else { - ltvSet = _pendingLtv[asset]; - currentConfig.setLtv(ltvSet); - delete _pendingLtv[asset]; - } - - emit PendingLtvChanged(asset, pendingLtvSet); - emit CollateralConfigurationChanged( - asset, - ltvSet, - currentConfig.getLiquidationThreshold(), - currentConfig.getLiquidationBonus() - ); - - _pool.setConfiguration(asset, currentConfig); - emit ReserveFrozen(asset, freeze); - } - - /// @inheritdoc IPoolConfigurator - function setBorrowableInIsolation( - address asset, - bool borrowable - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setBorrowableInIsolation(borrowable); - _pool.setConfiguration(asset, currentConfig); - emit BorrowableInIsolationChanged(asset, borrowable); - } - - /// @inheritdoc IPoolConfigurator - function setReservePause( - address asset, - bool paused, - uint40 gracePeriod - ) public override onlyEmergencyOrPoolAdmin { - if (!paused && gracePeriod != 0) { - require(gracePeriod <= MAX_GRACE_PERIOD, Errors.INVALID_GRACE_PERIOD); - - uint40 until = uint40(block.timestamp) + gracePeriod; - _pool.setLiquidationGracePeriod(asset, until); - emit LiquidationGracePeriodChanged(asset, until); - } - - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setPaused(paused); - _pool.setConfiguration(asset, currentConfig); - emit ReservePaused(asset, paused); - } - - /// @inheritdoc IPoolConfigurator - function setReservePause(address asset, bool paused) external override onlyEmergencyOrPoolAdmin { - setReservePause(asset, paused, 0); - } - - /// @inheritdoc IPoolConfigurator - function disableLiquidationGracePeriod(address asset) external override onlyEmergencyOrPoolAdmin { - // set the liquidation grace period in the past to disable liquidation grace period - _pool.setLiquidationGracePeriod(asset, 0); - - emit LiquidationGracePeriodDisabled(asset); - } - - /// @inheritdoc IPoolConfigurator - function setReserveFactor( - address asset, - uint256 newReserveFactor - ) external override onlyRiskOrPoolAdmins { - require(newReserveFactor <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - _pool.syncIndexesState(asset); - - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldReserveFactor = currentConfig.getReserveFactor(); - currentConfig.setReserveFactor(newReserveFactor); - _pool.setConfiguration(asset, currentConfig); - emit ReserveFactorChanged(asset, oldReserveFactor, newReserveFactor); - - _pool.syncRatesState(asset); - } - - /// @inheritdoc IPoolConfigurator - function setDebtCeiling( - address asset, - uint256 newDebtCeiling - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - uint256 oldDebtCeiling = currentConfig.getDebtCeiling(); - if (currentConfig.getLiquidationThreshold() != 0 && oldDebtCeiling == 0) { - _checkNoSuppliers(asset); - } - currentConfig.setDebtCeiling(newDebtCeiling); - _pool.setConfiguration(asset, currentConfig); - - if (newDebtCeiling == 0) { - _pool.resetIsolationModeTotalDebt(asset); - } - - emit DebtCeilingChanged(asset, oldDebtCeiling, newDebtCeiling); - } - - /// @inheritdoc IPoolConfigurator - function setSiloedBorrowing( - address asset, - bool newSiloed - ) external override onlyRiskOrPoolAdmins { - if (newSiloed) { - _checkNoBorrowers(asset); - } - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - bool oldSiloed = currentConfig.getSiloedBorrowing(); - - currentConfig.setSiloedBorrowing(newSiloed); - - _pool.setConfiguration(asset, currentConfig); - - emit SiloedBorrowingChanged(asset, oldSiloed, newSiloed); - } - - /// @inheritdoc IPoolConfigurator - function setBorrowCap( - address asset, - uint256 newBorrowCap - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldBorrowCap = currentConfig.getBorrowCap(); - currentConfig.setBorrowCap(newBorrowCap); - _pool.setConfiguration(asset, currentConfig); - emit BorrowCapChanged(asset, oldBorrowCap, newBorrowCap); - } - - /// @inheritdoc IPoolConfigurator - function setSupplyCap( - address asset, - uint256 newSupplyCap - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldSupplyCap = currentConfig.getSupplyCap(); - currentConfig.setSupplyCap(newSupplyCap); - _pool.setConfiguration(asset, currentConfig); - emit SupplyCapChanged(asset, oldSupplyCap, newSupplyCap); - } - - /// @inheritdoc IPoolConfigurator - function setLiquidationProtocolFee( - address asset, - uint256 newFee - ) external override onlyRiskOrPoolAdmins { - require(newFee <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_LIQUIDATION_PROTOCOL_FEE); - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldFee = currentConfig.getLiquidationProtocolFee(); - currentConfig.setLiquidationProtocolFee(newFee); - _pool.setConfiguration(asset, currentConfig); - emit LiquidationProtocolFeeChanged(asset, oldFee, newFee); - } - - /// @inheritdoc IPoolConfigurator - function setEModeCategory( - uint8 categoryId, - uint16 ltv, - uint16 liquidationThreshold, - uint16 liquidationBonus, - string calldata label - ) external override onlyRiskOrPoolAdmins { - require(ltv != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); - require(liquidationThreshold != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); - - // 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_EMODE_CATEGORY_PARAMS); - require( - liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, - Errors.INVALID_EMODE_CATEGORY_PARAMS - ); - - // if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment - // a loan is taken there is enough collateral available to cover the liquidation bonus - require( - uint256(liquidationThreshold).percentMul(liquidationBonus) <= - PercentageMath.PERCENTAGE_FACTOR, - Errors.INVALID_EMODE_CATEGORY_PARAMS - ); - - DataTypes.EModeCategoryBaseConfiguration memory categoryData; - categoryData.ltv = ltv; - categoryData.liquidationThreshold = liquidationThreshold; - categoryData.liquidationBonus = liquidationBonus; - categoryData.label = label; - - _pool.configureEModeCategory(categoryId, categoryData); - emit EModeCategoryAdded( - categoryId, - ltv, - liquidationThreshold, - liquidationBonus, - address(0), - label - ); - } - - /// @inheritdoc IPoolConfigurator - function setAssetCollateralInEMode( - address asset, - uint8 categoryId, - bool allowed - ) external override onlyRiskOrPoolAdmins { - uint128 collateralBitmap = _pool.getEModeCategoryCollateralBitmap(categoryId); - DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); - require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED); - collateralBitmap = EModeConfiguration.setReserveBitmapBit( - collateralBitmap, - reserveData.id, - allowed - ); - _pool.configureEModeCategoryCollateralBitmap(categoryId, collateralBitmap); - emit AssetCollateralInEModeChanged(asset, categoryId, allowed); - } - - /// @inheritdoc IPoolConfigurator - function setAssetBorrowableInEMode( - address asset, - uint8 categoryId, - bool borrowable - ) external override onlyRiskOrPoolAdmins { - uint128 borrowableBitmap = _pool.getEModeCategoryBorrowableBitmap(categoryId); - DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); - require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED); - borrowableBitmap = EModeConfiguration.setReserveBitmapBit( - borrowableBitmap, - reserveData.id, - borrowable - ); - _pool.configureEModeCategoryBorrowableBitmap(categoryId, borrowableBitmap); - emit AssetBorrowableInEModeChanged(asset, categoryId, borrowable); - } - - /// @inheritdoc IPoolConfigurator - function setUnbackedMintCap( - address asset, - uint256 newUnbackedMintCap - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldUnbackedMintCap = currentConfig.getUnbackedMintCap(); - currentConfig.setUnbackedMintCap(newUnbackedMintCap); - _pool.setConfiguration(asset, currentConfig); - emit UnbackedMintCapChanged(asset, oldUnbackedMintCap, newUnbackedMintCap); - } - - /// @inheritdoc IPoolConfigurator - function setReserveInterestRateData( - address asset, - bytes calldata rateData - ) external onlyRiskOrPoolAdmins { - DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset); - _updateInterestRateStrategy(asset, reserve, reserve.interestRateStrategyAddress, rateData); - } - - /// @inheritdoc IPoolConfigurator - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress, - bytes calldata rateData - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset); - _updateInterestRateStrategy(asset, reserve, rateStrategyAddress, rateData); - } - - /// @inheritdoc IPoolConfigurator - function setPoolPause(bool paused, uint40 gracePeriod) public override onlyEmergencyOrPoolAdmin { - address[] memory reserves = _pool.getReservesList(); - - for (uint256 i = 0; i < reserves.length; i++) { - if (reserves[i] != address(0)) { - setReservePause(reserves[i], paused, gracePeriod); - } - } - } - - /// @inheritdoc IPoolConfigurator - function setPoolPause(bool paused) external override onlyEmergencyOrPoolAdmin { - setPoolPause(paused, 0); - } - - /// @inheritdoc IPoolConfigurator - function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external override onlyPoolAdmin { - require( - newBridgeProtocolFee <= PercentageMath.PERCENTAGE_FACTOR, - Errors.BRIDGE_PROTOCOL_FEE_INVALID - ); - uint256 oldBridgeProtocolFee = _pool.BRIDGE_PROTOCOL_FEE(); - _pool.updateBridgeProtocolFee(newBridgeProtocolFee); - emit BridgeProtocolFeeUpdated(oldBridgeProtocolFee, newBridgeProtocolFee); - } - - /// @inheritdoc IPoolConfigurator - function updateFlashloanPremiumTotal( - uint128 newFlashloanPremiumTotal - ) external override onlyPoolAdmin { - require( - newFlashloanPremiumTotal <= PercentageMath.PERCENTAGE_FACTOR, - Errors.FLASHLOAN_PREMIUM_INVALID - ); - uint128 oldFlashloanPremiumTotal = _pool.FLASHLOAN_PREMIUM_TOTAL(); - _pool.updateFlashloanPremiums(newFlashloanPremiumTotal, _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL()); - emit FlashloanPremiumTotalUpdated(oldFlashloanPremiumTotal, newFlashloanPremiumTotal); - } - - /// @inheritdoc IPoolConfigurator - function updateFlashloanPremiumToProtocol( - uint128 newFlashloanPremiumToProtocol - ) external override onlyPoolAdmin { - require( - newFlashloanPremiumToProtocol <= PercentageMath.PERCENTAGE_FACTOR, - Errors.FLASHLOAN_PREMIUM_INVALID - ); - uint128 oldFlashloanPremiumToProtocol = _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL(); - _pool.updateFlashloanPremiums(_pool.FLASHLOAN_PREMIUM_TOTAL(), newFlashloanPremiumToProtocol); - emit FlashloanPremiumToProtocolUpdated( - oldFlashloanPremiumToProtocol, - newFlashloanPremiumToProtocol - ); - } - - /// @inheritdoc IPoolConfigurator - function getPendingLtv(address asset) external view override returns (uint256) { - return _pendingLtv[asset]; - } - - /// @inheritdoc IPoolConfigurator - function getConfiguratorLogic() external pure returns (address) { - return address(ConfiguratorLogic); - } - - function _updateInterestRateStrategy( - address asset, - DataTypes.ReserveDataLegacy memory reserve, - address newRateStrategyAddress, - bytes calldata rateData - ) internal { - address oldRateStrategyAddress = reserve.interestRateStrategyAddress; - - _pool.syncIndexesState(asset); - - IDefaultInterestRateStrategyV2(newRateStrategyAddress).setInterestRateParams(asset, rateData); - emit ReserveInterestRateDataChanged(asset, newRateStrategyAddress, rateData); - - if (oldRateStrategyAddress != newRateStrategyAddress) { - _pool.setReserveInterestRateStrategyAddress(asset, newRateStrategyAddress); - emit ReserveInterestRateStrategyChanged( - asset, - oldRateStrategyAddress, - newRateStrategyAddress - ); - } - - _pool.syncRatesState(asset); - } - - function _checkNoSuppliers(address asset) internal view { - DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); - uint256 totalSupplied = IPoolDataProvider(_addressesProvider.getPoolDataProvider()) - .getATokenTotalSupply(asset); - - require( - totalSupplied == 0 && reserveData.accruedToTreasury == 0, - Errors.RESERVE_LIQUIDITY_NOT_ZERO - ); - } - - function _checkNoBorrowers(address asset) internal view { - uint256 totalDebt = IPoolDataProvider(_addressesProvider.getPoolDataProvider()).getTotalDebt( - asset - ); - require(totalDebt == 0, Errors.RESERVE_DEBT_NOT_ZERO); - } - - function _onlyPoolAdmin() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - } - - function _onlyPoolOrEmergencyAdmin() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isPoolAdmin(msg.sender) || aclManager.isEmergencyAdmin(msg.sender), - Errors.CALLER_NOT_POOL_OR_EMERGENCY_ADMIN - ); - } - - function _onlyAssetListingOrPoolAdmins() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), - Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN - ); - } - - function _onlyRiskOrPoolAdmins() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isRiskAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), - Errors.CALLER_NOT_RISK_OR_POOL_ADMIN - ); - } - - function _onlyRiskOrPoolOrEmergencyAdmins() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isRiskAdmin(msg.sender) || - aclManager.isPoolAdmin(msg.sender) || - aclManager.isEmergencyAdmin(msg.sender), - Errors.CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN - ); - } -} - -// downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/instances/PoolConfiguratorInstance.sol - -contract PoolConfiguratorInstance is PoolConfigurator { - uint256 public constant CONFIGURATOR_REVISION = 4; - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return CONFIGURATOR_REVISION; - } - - function initialize(IPoolAddressesProvider provider) public virtual override initializer { - _addressesProvider = provider; - _pool = IPool(_addressesProvider.getPool()); - } -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol deleted file mode 100644 index aec817cb..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import './Proxy.sol'; -import '../contracts/Address.sol'; - -/** - * @title BaseUpgradeabilityProxy - * @dev This contract implements a proxy that allows to change the - * implementation address to which it will delegate. - * Such a change is called an implementation upgrade. - */ -contract BaseUpgradeabilityProxy is Proxy { - /** - * @dev Emitted when the implementation is upgraded. - * @param implementation Address of the new implementation. - */ - event Upgraded(address indexed implementation); - - /** - * @dev Storage slot with the address of the current implementation. - * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant IMPLEMENTATION_SLOT = - 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /** - * @dev Returns the current implementation. - * @return impl Address of the current implementation - */ - function _implementation() internal view override returns (address impl) { - bytes32 slot = IMPLEMENTATION_SLOT; - //solium-disable-next-line - assembly { - impl := sload(slot) - } - } - - /** - * @dev Upgrades the proxy to a new implementation. - * @param newImplementation Address of the new implementation. - */ - function _upgradeTo(address newImplementation) internal { - _setImplementation(newImplementation); - emit Upgraded(newImplementation); - } - - /** - * @dev Sets the implementation address of the proxy. - * @param newImplementation Address of the new implementation. - */ - function _setImplementation(address newImplementation) internal { - require( - Address.isContract(newImplementation), - 'Cannot set a proxy implementation to a non-contract address' - ); - - bytes32 slot = IMPLEMENTATION_SLOT; - - //solium-disable-next-line - assembly { - sstore(slot, newImplementation) - } - } -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol deleted file mode 100644 index 4b43fa6a..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import './BaseUpgradeabilityProxy.sol'; - -/** - * @title InitializableUpgradeabilityProxy - * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing - * implementation and init data. - */ -contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { - /** - * @dev Contract initializer. - * @param _logic Address of the initial implementation. - * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. - */ - function initialize(address _logic, bytes memory _data) public payable { - require(_implementation() == address(0)); - assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); - _setImplementation(_logic); - if (_data.length > 0) { - (bool success, ) = _logic.delegatecall(_data); - require(success); - } - } -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol deleted file mode 100644 index 53589441..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/dependencies/openzeppelin/upgradeability/Proxy.sol +++ /dev/null @@ -1,81 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title Proxy - * @dev Implements delegation of calls to other contracts, with proper - * forwarding of return values and bubbling of failures. - * It defines a fallback function that delegates all calls to the address - * returned by the abstract _implementation() internal function. - */ -abstract contract Proxy { - /** - * @dev Fallback function. - * Will run if no other function in the contract matches the call data. - * Implemented entirely in `_fallback`. - */ - fallback() external payable { - _fallback(); - } - - /** - * @dev Fallback function that will run if call data is empty. - * IMPORTANT. receive() on implementation contracts will be unreachable - */ - receive() external payable { - _fallback(); - } - - /** - * @return The Address of the implementation. - */ - function _implementation() internal view virtual returns (address); - - /** - * @dev Delegates execution to an implementation contract. - * This is a low level function that doesn't return to its internal call site. - * It will return to the external caller whatever the implementation returns. - * @param implementation Address to delegate. - */ - function _delegate(address implementation) internal { - //solium-disable-next-line - assembly { - // Copy msg.data. We take full control of memory in this inline assembly - // block because it will not return to Solidity code. We overwrite the - // Solidity scratch pad at memory position 0. - calldatacopy(0, 0, calldatasize()) - - // Call the implementation. - // out and outsize are 0 because we don't know the size yet. - let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) - - // Copy the returned data. - returndatacopy(0, 0, returndatasize()) - - switch result - // delegatecall returns 0 on error. - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } - } - } - - /** - * @dev Function that is run as the first thing in the fallback function. - * Can be redefined in derived contracts to add functionality. - * Redefinitions must call super._willFallback(). - */ - function _willFallback() internal virtual {} - - /** - * @dev fallback implementation. - * Extracted to enable manual triggering. - */ - function _fallback() internal { - _willFallback(); - _delegate(_implementation()); - } -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/instances/PoolConfiguratorInstance.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/instances/PoolConfiguratorInstance.sol deleted file mode 100644 index 8d2e4939..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/instances/PoolConfiguratorInstance.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {PoolConfigurator, IPoolAddressesProvider, IPool, VersionedInitializable} from '../protocol/pool/PoolConfigurator.sol'; - -contract PoolConfiguratorInstance is PoolConfigurator { - uint256 public constant CONFIGURATOR_REVISION = 4; - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return CONFIGURATOR_REVISION; - } - - function initialize(IPoolAddressesProvider provider) public virtual override initializer { - _addressesProvider = provider; - _pool = IPool(_addressesProvider.getPool()); - } -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol deleted file mode 100644 index 938e2d8f..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol +++ /dev/null @@ -1,161 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IReserveInterestRateStrategy} from './IReserveInterestRateStrategy.sol'; -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IDefaultInterestRateStrategyV2 - * @author BGD Labs - * @notice Interface of the default interest rate strategy used by the Aave protocol - */ -interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { - /** - * @notice Holds the interest rate data for a given reserve - * - * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This - * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. - * - * @param optimalUsageRatio The optimal usage ratio, in bps - * @param baseVariableBorrowRate The base variable borrow rate, in bps - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps - */ - struct InterestRateData { - uint16 optimalUsageRatio; - uint32 baseVariableBorrowRate; - uint32 variableRateSlope1; - uint32 variableRateSlope2; - } - - /** - * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, - * used in in-memory calculations. - * - * @param optimalUsageRatio The optimal usage ratio - * @param baseVariableBorrowRate The base variable borrow rate - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio - */ - struct InterestRateDataRay { - uint256 optimalUsageRatio; - uint256 baseVariableBorrowRate; - uint256 variableRateSlope1; - uint256 variableRateSlope2; - } - - /** - * @notice emitted when new interest rate data is set in a reserve - * - * @param reserve address of the reserve that has new interest rate data set - * @param optimalUsageRatio The optimal usage ratio, in bps - * @param baseVariableBorrowRate The base variable borrow rate, in bps - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps - */ - event RateDataUpdate( - address indexed reserve, - uint256 optimalUsageRatio, - uint256 baseVariableBorrowRate, - uint256 variableRateSlope1, - uint256 variableRateSlope2 - ); - - /** - * @notice Returns the address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the maximum value achievable for variable borrow rate, in bps - * @return The maximum rate - */ - function MAX_BORROW_RATE() external view returns (uint256); - - /** - * @notice Returns the minimum optimal point, in bps - * @return The optimal point - */ - function MIN_OPTIMAL_POINT() external view returns (uint256); - - /** - * @notice Returns the maximum optimal point, in bps - * @return The optimal point - */ - function MAX_OPTIMAL_POINT() external view returns (uint256); - - /** - * notice Returns the full InterestRateData object for the given reserve, in ray - * - * @param reserve The reserve to get the data of - * - * @return The InterestRateDataRay object for the given reserve - */ - function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); - - /** - * notice Returns the full InterestRateDataRay object for the given reserve, in bps - * - * @param reserve The reserve to get the data of - * - * @return The InterestRateData object for the given reserve - */ - function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); - - /** - * @notice Returns the optimal usage rate for the given reserve in ray - * - * @param reserve The reserve to get the optimal usage rate of - * - * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate - */ - function getOptimalUsageRatio(address reserve) external view returns (uint256); - - /** - * @notice Returns the variable rate slope below optimal usage ratio in ray - * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO - * - * @param reserve The reserve to get the variable rate slope 1 of - * - * @return The variable rate slope - */ - function getVariableRateSlope1(address reserve) external view returns (uint256); - - /** - * @notice Returns the variable rate slope above optimal usage ratio in ray - * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO - * - * @param reserve The reserve to get the variable rate slope 2 of - * - * @return The variable rate slope - */ - function getVariableRateSlope2(address reserve) external view returns (uint256); - - /** - * @notice Returns the base variable borrow rate, in ray - * - * @param reserve The reserve to get the base variable borrow rate of - * - * @return The base variable borrow rate - */ - function getBaseVariableBorrowRate(address reserve) external view returns (uint256); - - /** - * @notice Returns the maximum variable borrow rate, in ray - * - * @param reserve The reserve to get the maximum variable borrow rate of - * - * @return The maximum variable borrow rate - */ - function getMaxVariableBorrowRate(address reserve) external view returns (uint256); - - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The reserve interest rate data to apply to the given reserve - * Being specific to this custom implementation, with custom struct type, - * overloading the function on the generic interface - */ - function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPool.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolConfigurator.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolConfigurator.sol deleted file mode 100644 index 977d316e..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolConfigurator.sol +++ /dev/null @@ -1,551 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {ConfiguratorInputTypes} from '../protocol/libraries/types/ConfiguratorInputTypes.sol'; -import {IDefaultInterestRateStrategyV2} from './IDefaultInterestRateStrategyV2.sol'; - -/** - * @title IPoolConfigurator - * @author Aave - * @notice Defines the basic interface for a Pool configurator. - */ -interface IPoolConfigurator { - /** - * @dev Emitted when a reserve is initialized. - * @param asset The address of the underlying asset of the reserve - * @param aToken The address of the associated aToken contract - * @param stableDebtToken, DEPRECATED in v3.2.0 - * @param variableDebtToken The address of the associated variable rate debt token - * @param interestRateStrategyAddress The address of the interest rate strategy for the reserve - */ - event ReserveInitialized( - address indexed asset, - address indexed aToken, - address stableDebtToken, - address variableDebtToken, - address interestRateStrategyAddress - ); - - /** - * @dev Emitted when borrowing is enabled or disabled on a reserve. - * @param asset The address of the underlying asset of the reserve - * @param enabled True if borrowing is enabled, false otherwise - */ - event ReserveBorrowing(address indexed asset, bool enabled); - - /** - * @dev Emitted when flashloans are enabled or disabled on a reserve. - * @param asset The address of the underlying asset of the reserve - * @param enabled True if flashloans are enabled, false otherwise - */ - event ReserveFlashLoaning(address indexed asset, bool enabled); - - /** - * @dev Emitted when the ltv is set for the frozen asset. - * @param asset The address of the underlying asset of the reserve - * @param ltv The loan to value of the asset when used as collateral - */ - event PendingLtvChanged(address indexed asset, uint256 ltv); - - /** - * @dev Emitted when the collateralization risk parameters for the specified asset are updated. - * @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 - */ - event CollateralConfigurationChanged( - address indexed asset, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus - ); - - /** - * @dev Emitted when a reserve is activated or deactivated - * @param asset The address of the underlying asset of the reserve - * @param active True if reserve is active, false otherwise - */ - event ReserveActive(address indexed asset, bool active); - - /** - * @dev Emitted when a reserve is frozen or unfrozen - * @param asset The address of the underlying asset of the reserve - * @param frozen True if reserve is frozen, false otherwise - */ - event ReserveFrozen(address indexed asset, bool frozen); - - /** - * @dev Emitted when a reserve is paused or unpaused - * @param asset The address of the underlying asset of the reserve - * @param paused True if reserve is paused, false otherwise - */ - event ReservePaused(address indexed asset, bool paused); - - /** - * @dev Emitted when a reserve is dropped. - * @param asset The address of the underlying asset of the reserve - */ - event ReserveDropped(address indexed asset); - - /** - * @dev Emitted when a reserve factor is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldReserveFactor The old reserve factor, expressed in bps - * @param newReserveFactor The new reserve factor, expressed in bps - */ - event ReserveFactorChanged( - address indexed asset, - uint256 oldReserveFactor, - uint256 newReserveFactor - ); - - /** - * @dev Emitted when the borrow cap of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldBorrowCap The old borrow cap - * @param newBorrowCap The new borrow cap - */ - event BorrowCapChanged(address indexed asset, uint256 oldBorrowCap, uint256 newBorrowCap); - - /** - * @dev Emitted when the supply cap of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldSupplyCap The old supply cap - * @param newSupplyCap The new supply cap - */ - event SupplyCapChanged(address indexed asset, uint256 oldSupplyCap, uint256 newSupplyCap); - - /** - * @dev Emitted when the liquidation protocol fee of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldFee The old liquidation protocol fee, expressed in bps - * @param newFee The new liquidation protocol fee, expressed in bps - */ - event LiquidationProtocolFeeChanged(address indexed asset, uint256 oldFee, uint256 newFee); - - /** - * @dev Emitted when the liquidation grace period is updated. - * @param asset The address of the underlying asset of the reserve - * @param gracePeriodUntil Timestamp until when liquidations will not be allowed post-unpause - */ - event LiquidationGracePeriodChanged(address indexed asset, uint40 gracePeriodUntil); - - /** - * @dev Emitted when the liquidation grace period is disabled. - * @param asset The address of the underlying asset of the reserve - */ - event LiquidationGracePeriodDisabled(address indexed asset); - - /** - * @dev Emitted when the unbacked mint cap of a reserve is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldUnbackedMintCap The old unbacked mint cap - * @param newUnbackedMintCap The new unbacked mint cap - */ - event UnbackedMintCapChanged( - address indexed asset, - uint256 oldUnbackedMintCap, - uint256 newUnbackedMintCap - ); - - /** - * @dev Emitted when an collateral configuration of an asset in an eMode is changed. - * @param asset The address of the underlying asset of the reserve - * @param categoryId The eMode category - * @param collateral True if the asset is enabled as collateral in the eMode, false otherwise. - */ - event AssetCollateralInEModeChanged(address indexed asset, uint8 categoryId, bool collateral); - - /** - * @dev Emitted when the borrowable configuration of an asset in an eMode changed. - * @param asset The address of the underlying asset of the reserve - * @param categoryId The eMode category - * @param borrowable True if the asset is enabled as borrowable in the eMode, false otherwise. - */ - event AssetBorrowableInEModeChanged(address indexed asset, uint8 categoryId, bool borrowable); - - /** - * @dev Emitted when a new eMode category is added or an existing category is altered. - * @param categoryId The new eMode category id - * @param ltv The ltv for the asset category in eMode - * @param liquidationThreshold The liquidationThreshold for the asset category in eMode - * @param liquidationBonus The liquidationBonus for the asset category in eMode - * @param oracle DEPRECATED in v3.2.0 - * @param label A human readable identifier for the category - */ - event EModeCategoryAdded( - uint8 indexed categoryId, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - address oracle, - string label - ); - - /** - * @dev Emitted when a reserve interest strategy contract is updated. - * @param asset The address of the underlying asset of the reserve - * @param oldStrategy The address of the old interest strategy contract - * @param newStrategy The address of the new interest strategy contract - */ - event ReserveInterestRateStrategyChanged( - address indexed asset, - address oldStrategy, - address newStrategy - ); - - /** - * @dev Emitted when the data of a reserve interest strategy contract is updated. - * @param asset The address of the underlying asset of the reserve - * @param data abi encoded data - */ - event ReserveInterestRateDataChanged(address indexed asset, address indexed strategy, bytes data); - - /** - * @dev Emitted when an aToken implementation is upgraded. - * @param asset The address of the underlying asset of the reserve - * @param proxy The aToken proxy address - * @param implementation The new aToken implementation - */ - event ATokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @dev Emitted when the implementation of a variable debt token is upgraded. - * @param asset The address of the underlying asset of the reserve - * @param proxy The variable debt token proxy address - * @param implementation The new aToken implementation - */ - event VariableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @dev Emitted when the debt ceiling of an asset is set. - * @param asset The address of the underlying asset of the reserve - * @param oldDebtCeiling The old debt ceiling - * @param newDebtCeiling The new debt ceiling - */ - event DebtCeilingChanged(address indexed asset, uint256 oldDebtCeiling, uint256 newDebtCeiling); - - /** - * @dev Emitted when the the siloed borrowing state for an asset is changed. - * @param asset The address of the underlying asset of the reserve - * @param oldState The old siloed borrowing state - * @param newState The new siloed borrowing state - */ - event SiloedBorrowingChanged(address indexed asset, bool oldState, bool newState); - - /** - * @dev Emitted when the bridge protocol fee is updated. - * @param oldBridgeProtocolFee The old protocol fee, expressed in bps - * @param newBridgeProtocolFee The new protocol fee, expressed in bps - */ - event BridgeProtocolFeeUpdated(uint256 oldBridgeProtocolFee, uint256 newBridgeProtocolFee); - - /** - * @dev Emitted when the total premium on flashloans is updated. - * @param oldFlashloanPremiumTotal The old premium, expressed in bps - * @param newFlashloanPremiumTotal The new premium, expressed in bps - */ - event FlashloanPremiumTotalUpdated( - uint128 oldFlashloanPremiumTotal, - uint128 newFlashloanPremiumTotal - ); - - /** - * @dev Emitted when the part of the premium that goes to protocol is updated. - * @param oldFlashloanPremiumToProtocol The old premium, expressed in bps - * @param newFlashloanPremiumToProtocol The new premium, expressed in bps - */ - event FlashloanPremiumToProtocolUpdated( - uint128 oldFlashloanPremiumToProtocol, - uint128 newFlashloanPremiumToProtocol - ); - - /** - * @dev Emitted when the reserve is set as borrowable/non borrowable in isolation mode. - * @param asset The address of the underlying asset of the reserve - * @param borrowable True if the reserve is borrowable in isolation, false otherwise - */ - event BorrowableInIsolationChanged(address asset, bool borrowable); - - /** - * @notice Initializes multiple reserves. - * @dev param useVirtualBalance of the input struct should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param input The array of initialization parameters - */ - function initReserves(ConfiguratorInputTypes.InitReserveInput[] calldata input) external; - - /** - * @dev Updates the aToken implementation for the reserve. - * @param input The aToken update parameters - */ - function updateAToken(ConfiguratorInputTypes.UpdateATokenInput calldata input) external; - - /** - * @notice Updates the variable debt token implementation for the asset. - * @param input The variableDebtToken update parameters - */ - function updateVariableDebtToken( - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external; - - /** - * @notice Configures borrowing on a reserve. - * @param asset The address of the underlying asset of the reserve - * @param enabled True if borrowing needs to be enabled, false otherwise - */ - function setReserveBorrowing(address asset, bool enabled) external; - - /** - * @notice Configures the reserve collateralization parameters. - * @dev All the values are expressed in bps. A value of 10000, results in 100.00% - * @dev The `liquidationBonus` is always above 100%. A value of 105% means the liquidator will receive a 5% bonus - * @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 - */ - function configureReserveAsCollateral( - address asset, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus - ) external; - - /** - * @notice Enable or disable flashloans on a reserve - * @param asset The address of the underlying asset of the reserve - * @param enabled True if flashloans need to be enabled, false otherwise - */ - function setReserveFlashLoaning(address asset, bool enabled) external; - - /** - * @notice Activate or deactivate a reserve - * @param asset The address of the underlying asset of the reserve - * @param active True if the reserve needs to be active, false otherwise - */ - function setReserveActive(address asset, bool active) external; - - /** - * @notice Freeze or unfreeze a reserve. A frozen reserve doesn't allow any new supply, borrow - * or rate swap but allows repayments, liquidations, rate rebalances and withdrawals. - * @param asset The address of the underlying asset of the reserve - * @param freeze True if the reserve needs to be frozen, false otherwise - */ - function setReserveFreeze(address asset, bool freeze) external; - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the - * borrowed amount will be accumulated in the isolated collateral's total debt exposure - * @dev Only assets of the same family (e.g. USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations - * @param asset The address of the underlying asset of the reserve - * @param borrowable True if the asset should be borrowable in isolation, false otherwise - */ - function setBorrowableInIsolation(address asset, bool borrowable) external; - - /** - * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, - * swap interest rate, liquidate, atoken transfers). - * @param asset The address of the underlying asset of the reserve - * @param paused True if pausing the reserve, false if unpausing - * @param gracePeriod Count of seconds after unpause during which liquidations will not be available - * - Only applicable whenever unpausing (`paused` as false) - * - Passing 0 means no grace period - * - Capped to maximum MAX_GRACE_PERIOD - */ - function setReservePause(address asset, bool paused, uint40 gracePeriod) external; - - /** - * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, - * swap interest rate, liquidate, atoken transfers). - * @dev Version with no grace period - * @param asset The address of the underlying asset of the reserve - * @param paused True if pausing the reserve, false if unpausing - */ - function setReservePause(address asset, bool paused) external; - - /** - * @notice Disables liquidation grace period for the asset. The liquidation grace period is set in the past - * so that liquidations are allowed for the asset. - * @param asset The address of the underlying asset of the reserve - */ - function disableLiquidationGracePeriod(address asset) external; - - /** - * @notice Updates the reserve factor of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newReserveFactor The new reserve factor of the reserve - */ - function setReserveFactor(address asset, uint256 newReserveFactor) external; - - /** - * @notice Sets the interest rate strategy of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newRateStrategyAddress The address of the new interest strategy contract - * @param rateData bytes-encoded rate data. In this format in order to allow the rate strategy contract - * to de-structure custom data - */ - function setReserveInterestRateStrategyAddress( - address asset, - address newRateStrategyAddress, - bytes calldata rateData - ) external; - - /** - * @notice Sets interest rate data for a reserve - * @param asset The address of the underlying asset of the reserve - * @param rateData bytes-encoded rate data. In this format in order to allow the rate strategy contract - * to de-structure custom data - */ - function setReserveInterestRateData(address asset, bytes calldata rateData) external; - - /** - * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions - * are suspended. - * @param paused True if protocol needs to be paused, false otherwise - * @param gracePeriod Count of seconds after unpause during which liquidations will not be available - * - Only applicable whenever unpausing (`paused` as false) - * - Passing 0 means no grace period - * - Capped to maximum MAX_GRACE_PERIOD - */ - function setPoolPause(bool paused, uint40 gracePeriod) external; - - /** - * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions - * are suspended. - * @dev Version with no grace period - * @param paused True if protocol needs to be paused, false otherwise - */ - function setPoolPause(bool paused) external; - - /** - * @notice Updates the borrow cap of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newBorrowCap The new borrow cap of the reserve - */ - function setBorrowCap(address asset, uint256 newBorrowCap) external; - - /** - * @notice Updates the supply cap of a reserve. - * @param asset The address of the underlying asset of the reserve - * @param newSupplyCap The new supply cap of the reserve - */ - function setSupplyCap(address asset, uint256 newSupplyCap) external; - - /** - * @notice Updates the liquidation protocol fee of reserve. - * @param asset The address of the underlying asset of the reserve - * @param newFee The new liquidation protocol fee of the reserve, expressed in bps - */ - function setLiquidationProtocolFee(address asset, uint256 newFee) external; - - /** - * @notice Updates the unbacked mint cap of reserve. - * @param asset The address of the underlying asset of the reserve - * @param newUnbackedMintCap The new unbacked mint cap of the reserve - */ - function setUnbackedMintCap(address asset, uint256 newUnbackedMintCap) external; - - /** - * @notice Enables/disables an asset to be borrowable in a selected eMode. - * - eMode.borrowable always has less priority then reserve.borrowable - * @param asset The address of the underlying asset of the reserve - * @param categoryId The eMode categoryId - * @param borrowable True if the asset should be borrowable in the given eMode category, false otherwise. - */ - function setAssetBorrowableInEMode(address asset, uint8 categoryId, bool borrowable) external; - - /** - * @notice Enables/disables an asset to be collateral in a selected eMode. - * @param asset The address of the underlying asset of the reserve - * @param categoryId The eMode categoryId - * @param collateral True if the asset should be collateral in the given eMode category, false otherwise. - */ - function setAssetCollateralInEMode(address asset, uint8 categoryId, bool collateral) external; - - /** - * @notice Adds a new efficiency mode (eMode) category or alters a existing one. - * @param categoryId The id of the category to be configured - * @param ltv The ltv associated with the category - * @param liquidationThreshold The liquidation threshold associated with the category - * @param liquidationBonus The liquidation bonus associated with the category - * @param label A label identifying the category - */ - function setEModeCategory( - uint8 categoryId, - uint16 ltv, - uint16 liquidationThreshold, - uint16 liquidationBonus, - string calldata label - ) external; - - /** - * @notice Drops a reserve entirely. - * @param asset The address of the reserve to drop - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the bridge fee collected by the protocol reserves. - * @param newBridgeProtocolFee The part of the fee sent to the protocol treasury, expressed in bps - */ - function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external; - - /** - * @notice Updates the total flash loan premium. - * Total flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra balance - * - A part is collected by the protocol reserves - * @dev Expressed in bps - * @dev The premium is calculated on the total amount borrowed - * @param newFlashloanPremiumTotal The total flashloan premium - */ - function updateFlashloanPremiumTotal(uint128 newFlashloanPremiumTotal) external; - - /** - * @notice Updates the flash loan premium collected by protocol reserves - * @dev Expressed in bps - * @dev The premium to protocol is calculated on the total flashloan premium - * @param newFlashloanPremiumToProtocol The part of the flashloan premium sent to the protocol treasury - */ - function updateFlashloanPremiumToProtocol(uint128 newFlashloanPremiumToProtocol) external; - - /** - * @notice Sets the debt ceiling for an asset. - * @param newDebtCeiling The new debt ceiling - */ - function setDebtCeiling(address asset, uint256 newDebtCeiling) external; - - /** - * @notice Sets siloed borrowing for an asset - * @param siloed The new siloed borrowing state - */ - function setSiloedBorrowing(address asset, bool siloed) external; - - /** - * @notice Gets pending ltv value - * @param asset The new siloed borrowing state - */ - function getPendingLtv(address asset) external view returns (uint256); - - /** - * @notice Gets the address of the external ConfiguratorLogic - */ - function getConfiguratorLogic() external view returns (address); - - /** - * @notice Gets the maximum liquidations grace period allowed, in seconds - */ - function MAX_GRACE_PERIOD() external view returns (uint40); -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolDataProvider.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolDataProvider.sol deleted file mode 100644 index a9df8903..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IPoolDataProvider.sol +++ /dev/null @@ -1,250 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPoolDataProvider - * @author Aave - * @notice Defines the basic interface of a PoolDataProvider - */ -interface IPoolDataProvider { - struct TokenData { - string symbol; - address tokenAddress; - } - - /** - * @notice Returns the address for the PoolAddressesProvider contract. - * @return The address for the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the list of the existing reserves in the pool. - * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. - * @return The list of reserves, pairs of symbols and addresses - */ - function getAllReservesTokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the list of the existing ATokens in the pool. - * @return The list of ATokens, pairs of symbols and addresses - */ - function getAllATokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the configuration data of the reserve - * @dev Not returning borrow and supply caps for compatibility, nor pause flag - * @param asset The address of the underlying asset of the reserve - * @return decimals The number of decimals of the reserve - * @return ltv The ltv of the reserve - * @return liquidationThreshold The liquidationThreshold of the reserve - * @return liquidationBonus The liquidationBonus of the reserve - * @return reserveFactor The reserveFactor of the reserve - * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise - * @return borrowingEnabled True if borrowing is enabled, false otherwise - * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise - * @return isActive True if it is active, false otherwise - * @return isFrozen True if it is frozen, false otherwise - */ - function getReserveConfigurationData( - address asset - ) - external - view - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ); - - /** - * @notice Returns the caps parameters of the reserve - * @param asset The address of the underlying asset of the reserve - * @return borrowCap The borrow cap of the reserve - * @return supplyCap The supply cap of the reserve - */ - function getReserveCaps( - address asset - ) external view returns (uint256 borrowCap, uint256 supplyCap); - - /** - * @notice Returns if the pool is paused - * @param asset The address of the underlying asset of the reserve - * @return isPaused True if the pool is paused, false otherwise - */ - function getPaused(address asset) external view returns (bool isPaused); - - /** - * @notice Returns the siloed borrowing flag - * @param asset The address of the underlying asset of the reserve - * @return True if the asset is siloed for borrowing - */ - function getSiloedBorrowing(address asset) external view returns (bool); - - /** - * @notice Returns the protocol fee on the liquidation bonus - * @param asset The address of the underlying asset of the reserve - * @return The protocol fee on liquidation - */ - function getLiquidationProtocolFee(address asset) external view returns (uint256); - - /** - * @notice Returns the unbacked mint cap of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The unbacked mint cap of the reserve - */ - function getUnbackedMintCap(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The debt ceiling of the reserve - */ - function getDebtCeiling(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling decimals - * @return The debt ceiling decimals - */ - function getDebtCeilingDecimals() external pure returns (uint256); - - /** - * @notice Returns the reserve data - * @param asset The address of the underlying asset of the reserve - * @return unbacked The amount of unbacked tokens - * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted - * @return totalAToken The total supply of the aToken - * @return totalStableDebt The total stable debt of the reserve - * @return totalVariableDebt The total variable debt of the reserve - * @return liquidityRate The liquidity rate of the reserve - * @return variableBorrowRate The variable borrow rate of the reserve - * @return stableBorrowRate The stable borrow rate of the reserve - * @return averageStableBorrowRate The average stable borrow rate of the reserve - * @return liquidityIndex The liquidity index of the reserve - * @return variableBorrowIndex The variable borrow index of the reserve - * @return lastUpdateTimestamp The timestamp of the last update of the reserve - */ - function getReserveData( - address asset - ) - external - view - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ); - - /** - * @notice Returns the total supply of aTokens for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total supply of the aToken - */ - function getATokenTotalSupply(address asset) external view returns (uint256); - - /** - * @notice Returns the total debt for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total debt for asset - */ - function getTotalDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the user data in a reserve - * @param asset The address of the underlying asset of the reserve - * @param user The address of the user - * @return currentATokenBalance The current AToken balance of the user - * @return currentStableDebt The current stable debt of the user - * @return currentVariableDebt The current variable debt of the user - * @return principalStableDebt The principal stable debt of the user - * @return scaledVariableDebt The scaled variable debt of the user - * @return stableBorrowRate The stable borrow rate of the user - * @return liquidityRate The liquidity rate of the reserve - * @return stableRateLastUpdated The timestamp of the last update of the user stable rate - * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false - * otherwise - */ - function getUserReserveData( - address asset, - address user - ) - external - view - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ); - - /** - * @notice Returns the token addresses of the reserve - * @param asset The address of the underlying asset of the reserve - * @return aTokenAddress The AToken address of the reserve - * @return stableDebtTokenAddress DEPRECATED in v3.2.0 - * @return variableDebtTokenAddress The VariableDebtToken address of the reserve - */ - function getReserveTokensAddresses( - address asset - ) - external - view - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ); - - /** - * @notice Returns the address of the Interest Rate strategy - * @param asset The address of the underlying asset of the reserve - * @return irStrategyAddress The address of the Interest Rate strategy - */ - function getInterestRateStrategyAddress( - address asset - ) external view returns (address irStrategyAddress); - - /** - * @notice Returns whether the reserve has FlashLoans enabled or disabled - * @param asset The address of the underlying asset of the reserve - * @return True if FlashLoans are enabled, false otherwise - */ - function getFlashLoanEnabled(address asset) external view returns (bool); - - /** - * @notice Returns whether virtual accounting is enabled/not for a reserve - * @param asset The address of the underlying asset of the reserve - * @return True if active, false otherwise - */ - function getIsVirtualAccActive(address asset) external view returns (bool); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint256); -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol deleted file mode 100644 index 252b4a4b..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {BaseUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol'; - -/** - * @title BaseImmutableAdminUpgradeabilityProxy - * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern - * @notice This contract combines an upgradeability proxy with an authorization - * mechanism for administrative tasks. - * @dev The admin role is stored in an immutable, which helps saving transactions costs - * All external functions in this contract must be guarded by the - * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity - * feature proposal that would enable this to be done automatically. - */ -contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { - address internal immutable _admin; - - /** - * @dev Constructor. - * @param admin_ The address of the admin - */ - constructor(address admin_) { - _admin = admin_; - } - - modifier ifAdmin() { - if (msg.sender == _admin) { - _; - } else { - _fallback(); - } - } - - /** - * @notice Return the admin address - * @return The address of the proxy admin. - */ - function admin() external ifAdmin returns (address) { - return _admin; - } - - /** - * @notice Return the implementation address - * @return The address of the implementation. - */ - function implementation() external ifAdmin returns (address) { - return _implementation(); - } - - /** - * @notice Upgrade the backing implementation of the proxy. - * @dev Only the admin can call this function. - * @param newImplementation The address of the new implementation. - */ - function upgradeTo(address newImplementation) external ifAdmin { - _upgradeTo(newImplementation); - } - - /** - * @notice Upgrade the backing implementation of the proxy and call a function - * on the new implementation. - * @dev This is useful to initialize the proxied contract. - * @param newImplementation The address of the new implementation. - * @param data Data to send as msg.data in the low level call. - * It should include the signature and the parameters of the function to be called, as described in - * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. - */ - function upgradeToAndCall( - address newImplementation, - bytes calldata data - ) external payable ifAdmin { - _upgradeTo(newImplementation); - (bool success, ) = newImplementation.delegatecall(data); - require(success); - } - - /** - * @notice Only fall back when the sender is not the admin. - */ - function _willFallback() internal virtual override { - require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); - super._willFallback(); - } -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol deleted file mode 100644 index 6913a19d..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {InitializableUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol'; -import {Proxy} from '../../dependencies/openzeppelin/upgradeability/Proxy.sol'; -import {BaseImmutableAdminUpgradeabilityProxy} from './BaseImmutableAdminUpgradeabilityProxy.sol'; - -/** - * @title InitializableAdminUpgradeabilityProxy - * @author Aave - * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function - */ -contract InitializableImmutableAdminUpgradeabilityProxy is - BaseImmutableAdminUpgradeabilityProxy, - InitializableUpgradeabilityProxy -{ - /** - * @dev Constructor. - * @param admin The address of the admin - */ - constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { - // Intentionally left blank - } - - /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy - function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { - BaseImmutableAdminUpgradeabilityProxy._willFallback(); - } -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol deleted file mode 100644 index 1070227a..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/misc/aave-upgradeability/VersionedInitializable.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title VersionedInitializable - * @author Aave, inspired by the OpenZeppelin Initializable contract - * @notice Helper contract to implement initializer functions. To use it, replace - * the constructor with a function that has the `initializer` modifier. - * @dev WARNING: Unlike constructors, initializer functions must be manually - * invoked. This applies both to deploying an Initializable contract, as well - * as extending an Initializable contract via inheritance. - * WARNING: When used with inheritance, manual care must be taken to not invoke - * a parent initializer twice, or ensure that all initializers are idempotent, - * because this is not dealt with automatically as with constructors. - */ -abstract contract VersionedInitializable { - /** - * @dev Indicates that the contract has been initialized. - */ - uint256 private lastInitializedRevision = 0; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private initializing; - - /** - * @dev Modifier to use in the initializer function of a contract. - */ - modifier initializer() { - uint256 revision = getRevision(); - require( - initializing || isConstructor() || revision > lastInitializedRevision, - 'Contract instance has already been initialized' - ); - - bool isTopLevelCall = !initializing; - if (isTopLevelCall) { - initializing = true; - lastInitializedRevision = revision; - } - - _; - - if (isTopLevelCall) { - initializing = false; - } - } - - /** - * @notice Returns the revision number of the contract - * @dev Needs to be defined in the inherited class as a constant. - * @return The revision number - */ - function getRevision() internal pure virtual returns (uint256); - - /** - * @notice Returns true if and only if the function is running in the constructor - * @return True if the function is running in the constructor - */ - function isConstructor() private view returns (bool) { - // extcodesize checks the size of the code stored in an address, and - // address returns the current address. Since the code is still not - // deployed when running a constructor, any checks on its code size will - // yield zero, making it an effective way to detect if a contract is - // under construction or not. - uint256 cs; - //solium-disable-next-line - assembly { - cs := extcodesize(address()) - } - return cs == 0; - } - - // Reserved storage space to allow for layout changes in the future. - uint256[50] private ______gap; -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol deleted file mode 100644 index c6b08dcc..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol +++ /dev/null @@ -1,223 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IPool} from '../../../interfaces/IPool.sol'; -import {IInitializableAToken} from '../../../interfaces/IInitializableAToken.sol'; -import {IInitializableDebtToken} from '../../../interfaces/IInitializableDebtToken.sol'; -import {InitializableImmutableAdminUpgradeabilityProxy} from '../../../misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {ConfiguratorInputTypes} from '../types/ConfiguratorInputTypes.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; - -/** - * @title ConfiguratorLogic library - * @author Aave - * @notice Implements the functions to initialize reserves and update aTokens and debtTokens - */ -library ConfiguratorLogic { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPoolConfigurator` for descriptions - event ReserveInitialized( - address indexed asset, - address indexed aToken, - address stableDebtToken, - address variableDebtToken, - address interestRateStrategyAddress - ); - event ATokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - event VariableDebtTokenUpgraded( - address indexed asset, - address indexed proxy, - address indexed implementation - ); - - /** - * @notice Initialize a reserve by creating and initializing aToken and variable debt token - * @dev Emits the `ReserveInitialized` event - * @param pool The Pool in which the reserve will be initialized - * @param input The needed parameters for the initialization - */ - function executeInitReserve( - IPool pool, - ConfiguratorInputTypes.InitReserveInput calldata input - ) external { - // It is an assumption that the asset listed is non-malicious, and the external call doesn't create re-entrancies - uint8 underlyingAssetDecimals = IERC20Detailed(input.underlyingAsset).decimals(); - require(underlyingAssetDecimals > 5, Errors.INVALID_DECIMALS); - - address aTokenProxyAddress = _initTokenWithProxy( - input.aTokenImpl, - abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - pool, - input.treasury, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.aTokenName, - input.aTokenSymbol, - input.params - ) - ); - - address variableDebtTokenProxyAddress = _initTokenWithProxy( - input.variableDebtTokenImpl, - abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - pool, - input.underlyingAsset, - input.incentivesController, - underlyingAssetDecimals, - input.variableDebtTokenName, - input.variableDebtTokenSymbol, - input.params - ) - ); - - pool.initReserve( - input.underlyingAsset, - aTokenProxyAddress, - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - - DataTypes.ReserveConfigurationMap memory currentConfig = DataTypes.ReserveConfigurationMap(0); - - currentConfig.setDecimals(underlyingAssetDecimals); - - currentConfig.setActive(true); - currentConfig.setPaused(false); - currentConfig.setFrozen(false); - currentConfig.setVirtualAccActive(input.useVirtualBalance); - - pool.setConfiguration(input.underlyingAsset, currentConfig); - - IReserveInterestRateStrategy(input.interestRateStrategyAddress).setInterestRateParams( - input.underlyingAsset, - input.interestRateData - ); - - emit ReserveInitialized( - input.underlyingAsset, - aTokenProxyAddress, - address(0), - variableDebtTokenProxyAddress, - input.interestRateStrategyAddress - ); - } - - /** - * @notice Updates the aToken implementation and initializes it - * @dev Emits the `ATokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the aToken - * @param input The parameters needed for the initialize call - */ - function executeUpdateAToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateATokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableAToken.initialize.selector, - cachedPool, - input.treasury, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); - - emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); - } - - /** - * @notice Updates the variable debt token implementation and initializes it - * @dev Emits the `VariableDebtTokenUpgraded` event - * @param cachedPool The Pool containing the reserve with the variable debt token - * @param input The parameters needed for the initialize call - */ - function executeUpdateVariableDebtToken( - IPool cachedPool, - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); - - (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); - - bytes memory encodedCall = abi.encodeWithSelector( - IInitializableDebtToken.initialize.selector, - cachedPool, - input.asset, - input.incentivesController, - decimals, - input.name, - input.symbol, - input.params - ); - - _upgradeTokenImplementation( - reserveData.variableDebtTokenAddress, - input.implementation, - encodedCall - ); - - emit VariableDebtTokenUpgraded( - input.asset, - reserveData.variableDebtTokenAddress, - input.implementation - ); - } - - /** - * @notice Creates a new proxy and initializes the implementation - * @param implementation The address of the implementation - * @param initParams The parameters that is passed to the implementation to initialize - * @return The address of initialized proxy - */ - function _initTokenWithProxy( - address implementation, - bytes memory initParams - ) internal returns (address) { - InitializableImmutableAdminUpgradeabilityProxy proxy = new InitializableImmutableAdminUpgradeabilityProxy( - address(this) - ); - - proxy.initialize(implementation, initParams); - - return address(proxy); - } - - /** - * @notice Upgrades the implementation and makes call to the proxy - * @dev The call is used to initialize the new implementation. - * @param proxyAddress The address of the proxy - * @param implementation The address of the new implementation - * @param initParams The parameters to the call after the upgrade - */ - function _upgradeTokenImplementation( - address proxyAddress, - address implementation, - bytes memory initParams - ) internal { - InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy( - payable(proxyAddress) - ); - - proxy.upgradeToAndCall(implementation, initParams); - } -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol deleted file mode 100644 index 7894871b..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/ConfiguratorInputTypes.sol +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library ConfiguratorInputTypes { - struct InitReserveInput { - address aTokenImpl; - address variableDebtTokenImpl; - bool useVirtualBalance; - address interestRateStrategyAddress; - address underlyingAsset; - address treasury; - address incentivesController; - string aTokenName; - string aTokenSymbol; - string variableDebtTokenName; - string variableDebtTokenSymbol; - bytes params; - bytes interestRateData; - } - - struct UpdateATokenInput { - address asset; - address treasury; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } - - struct UpdateDebtTokenInput { - address asset; - address incentivesController; - string name; - string symbol; - address implementation; - bytes params; - } -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/pool/PoolConfigurator.sol b/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/pool/PoolConfigurator.sol deleted file mode 100644 index 778ee79b..00000000 --- a/downloads/LINEA/POOL_CONFIGURATOR_IMPL/PoolConfiguratorInstance/src/contracts/protocol/pool/PoolConfigurator.sol +++ /dev/null @@ -1,630 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '../../misc/aave-upgradeability/VersionedInitializable.sol'; -import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; -import {EModeConfiguration} from '../libraries/configuration/EModeConfiguration.sol'; -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {IDefaultInterestRateStrategyV2} from '../../interfaces/IDefaultInterestRateStrategyV2.sol'; -import {Errors} from '../libraries/helpers/Errors.sol'; -import {PercentageMath} from '../libraries/math/PercentageMath.sol'; -import {DataTypes} from '../libraries/types/DataTypes.sol'; -import {ConfiguratorLogic} from '../libraries/logic/ConfiguratorLogic.sol'; -import {ConfiguratorInputTypes} from '../libraries/types/ConfiguratorInputTypes.sol'; -import {IPoolConfigurator} from '../../interfaces/IPoolConfigurator.sol'; -import {IPool} from '../../interfaces/IPool.sol'; -import {IACLManager} from '../../interfaces/IACLManager.sol'; -import {IPoolDataProvider} from '../../interfaces/IPoolDataProvider.sol'; -import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; - -/** - * @title PoolConfigurator - * @author Aave - * @dev Implements the configuration methods for the Aave protocol - */ -abstract contract PoolConfigurator is VersionedInitializable, IPoolConfigurator { - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - IPoolAddressesProvider internal _addressesProvider; - IPool internal _pool; - - mapping(address => uint256) internal _pendingLtv; - - uint40 public constant MAX_GRACE_PERIOD = 4 hours; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - _onlyPoolAdmin(); - _; - } - - /** - * @dev Only emergency or pool admin can call functions marked by this modifier. - */ - modifier onlyEmergencyOrPoolAdmin() { - _onlyPoolOrEmergencyAdmin(); - _; - } - - /** - * @dev Only asset listing or pool admin can call functions marked by this modifier. - */ - modifier onlyAssetListingOrPoolAdmins() { - _onlyAssetListingOrPoolAdmins(); - _; - } - - /** - * @dev Only risk or pool admin can call functions marked by this modifier. - */ - modifier onlyRiskOrPoolAdmins() { - _onlyRiskOrPoolAdmins(); - _; - } - - /** - * @dev Only risk, pool or emergency admin can call functions marked by this modifier. - */ - modifier onlyRiskOrPoolOrEmergencyAdmins() { - _onlyRiskOrPoolOrEmergencyAdmins(); - _; - } - - function initialize(IPoolAddressesProvider provider) public virtual; - - /// @inheritdoc IPoolConfigurator - function initReserves( - ConfiguratorInputTypes.InitReserveInput[] calldata input - ) external override onlyAssetListingOrPoolAdmins { - IPool cachedPool = _pool; - - for (uint256 i = 0; i < input.length; i++) { - ConfiguratorLogic.executeInitReserve(cachedPool, input[i]); - emit ReserveInterestRateDataChanged( - input[i].underlyingAsset, - input[i].interestRateStrategyAddress, - input[i].interestRateData - ); - } - } - - /// @inheritdoc IPoolConfigurator - function dropReserve(address asset) external override onlyPoolAdmin { - _pool.dropReserve(asset); - emit ReserveDropped(asset); - } - - /// @inheritdoc IPoolConfigurator - function updateAToken( - ConfiguratorInputTypes.UpdateATokenInput calldata input - ) external override onlyPoolAdmin { - ConfiguratorLogic.executeUpdateAToken(_pool, input); - } - - /// @inheritdoc IPoolConfigurator - function updateVariableDebtToken( - ConfiguratorInputTypes.UpdateDebtTokenInput calldata input - ) external override onlyPoolAdmin { - ConfiguratorLogic.executeUpdateVariableDebtToken(_pool, input); - } - - /// @inheritdoc IPoolConfigurator - function setReserveBorrowing(address asset, bool enabled) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setBorrowingEnabled(enabled); - _pool.setConfiguration(asset, currentConfig); - emit ReserveBorrowing(asset, enabled); - } - - /// @inheritdoc IPoolConfigurator - function configureReserveAsCollateral( - address asset, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus - ) external override onlyRiskOrPoolAdmins { - //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_RESERVE_PARAMS); - - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - if (liquidationThreshold != 0) { - //liquidation bonus must be bigger than 100.00%, otherwise the liquidator would receive less - //collateral than needed to cover the debt - require(liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_PARAMS); - - //if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment - //a loan is taken there is enough collateral available to cover the liquidation bonus - require( - liquidationThreshold.percentMul(liquidationBonus) <= PercentageMath.PERCENTAGE_FACTOR, - Errors.INVALID_RESERVE_PARAMS - ); - } else { - require(liquidationBonus == 0, Errors.INVALID_RESERVE_PARAMS); - //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 supplied - _checkNoSuppliers(asset); - } - - uint256 newLtv = ltv; - - if (currentConfig.getFrozen()) { - _pendingLtv[asset] = ltv; - newLtv = 0; - - emit PendingLtvChanged(asset, ltv); - } else { - currentConfig.setLtv(ltv); - } - - currentConfig.setLiquidationThreshold(liquidationThreshold); - currentConfig.setLiquidationBonus(liquidationBonus); - - _pool.setConfiguration(asset, currentConfig); - - emit CollateralConfigurationChanged(asset, newLtv, liquidationThreshold, liquidationBonus); - } - - /// @inheritdoc IPoolConfigurator - function setReserveFlashLoaning( - address asset, - bool enabled - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - currentConfig.setFlashLoanEnabled(enabled); - _pool.setConfiguration(asset, currentConfig); - emit ReserveFlashLoaning(asset, enabled); - } - - /// @inheritdoc IPoolConfigurator - function setReserveActive(address asset, bool active) external override onlyPoolAdmin { - if (!active) _checkNoSuppliers(asset); - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setActive(active); - _pool.setConfiguration(asset, currentConfig); - emit ReserveActive(asset, active); - } - - /// @inheritdoc IPoolConfigurator - function setReserveFreeze( - address asset, - bool freeze - ) external override onlyRiskOrPoolOrEmergencyAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - require(freeze != currentConfig.getFrozen(), Errors.INVALID_FREEZE_STATE); - - currentConfig.setFrozen(freeze); - - uint256 ltvSet; - uint256 pendingLtvSet; - - if (freeze) { - pendingLtvSet = currentConfig.getLtv(); - _pendingLtv[asset] = pendingLtvSet; - currentConfig.setLtv(0); - } else { - ltvSet = _pendingLtv[asset]; - currentConfig.setLtv(ltvSet); - delete _pendingLtv[asset]; - } - - emit PendingLtvChanged(asset, pendingLtvSet); - emit CollateralConfigurationChanged( - asset, - ltvSet, - currentConfig.getLiquidationThreshold(), - currentConfig.getLiquidationBonus() - ); - - _pool.setConfiguration(asset, currentConfig); - emit ReserveFrozen(asset, freeze); - } - - /// @inheritdoc IPoolConfigurator - function setBorrowableInIsolation( - address asset, - bool borrowable - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setBorrowableInIsolation(borrowable); - _pool.setConfiguration(asset, currentConfig); - emit BorrowableInIsolationChanged(asset, borrowable); - } - - /// @inheritdoc IPoolConfigurator - function setReservePause( - address asset, - bool paused, - uint40 gracePeriod - ) public override onlyEmergencyOrPoolAdmin { - if (!paused && gracePeriod != 0) { - require(gracePeriod <= MAX_GRACE_PERIOD, Errors.INVALID_GRACE_PERIOD); - - uint40 until = uint40(block.timestamp) + gracePeriod; - _pool.setLiquidationGracePeriod(asset, until); - emit LiquidationGracePeriodChanged(asset, until); - } - - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - currentConfig.setPaused(paused); - _pool.setConfiguration(asset, currentConfig); - emit ReservePaused(asset, paused); - } - - /// @inheritdoc IPoolConfigurator - function setReservePause(address asset, bool paused) external override onlyEmergencyOrPoolAdmin { - setReservePause(asset, paused, 0); - } - - /// @inheritdoc IPoolConfigurator - function disableLiquidationGracePeriod(address asset) external override onlyEmergencyOrPoolAdmin { - // set the liquidation grace period in the past to disable liquidation grace period - _pool.setLiquidationGracePeriod(asset, 0); - - emit LiquidationGracePeriodDisabled(asset); - } - - /// @inheritdoc IPoolConfigurator - function setReserveFactor( - address asset, - uint256 newReserveFactor - ) external override onlyRiskOrPoolAdmins { - require(newReserveFactor <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - _pool.syncIndexesState(asset); - - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldReserveFactor = currentConfig.getReserveFactor(); - currentConfig.setReserveFactor(newReserveFactor); - _pool.setConfiguration(asset, currentConfig); - emit ReserveFactorChanged(asset, oldReserveFactor, newReserveFactor); - - _pool.syncRatesState(asset); - } - - /// @inheritdoc IPoolConfigurator - function setDebtCeiling( - address asset, - uint256 newDebtCeiling - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - uint256 oldDebtCeiling = currentConfig.getDebtCeiling(); - if (currentConfig.getLiquidationThreshold() != 0 && oldDebtCeiling == 0) { - _checkNoSuppliers(asset); - } - currentConfig.setDebtCeiling(newDebtCeiling); - _pool.setConfiguration(asset, currentConfig); - - if (newDebtCeiling == 0) { - _pool.resetIsolationModeTotalDebt(asset); - } - - emit DebtCeilingChanged(asset, oldDebtCeiling, newDebtCeiling); - } - - /// @inheritdoc IPoolConfigurator - function setSiloedBorrowing( - address asset, - bool newSiloed - ) external override onlyRiskOrPoolAdmins { - if (newSiloed) { - _checkNoBorrowers(asset); - } - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - - bool oldSiloed = currentConfig.getSiloedBorrowing(); - - currentConfig.setSiloedBorrowing(newSiloed); - - _pool.setConfiguration(asset, currentConfig); - - emit SiloedBorrowingChanged(asset, oldSiloed, newSiloed); - } - - /// @inheritdoc IPoolConfigurator - function setBorrowCap( - address asset, - uint256 newBorrowCap - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldBorrowCap = currentConfig.getBorrowCap(); - currentConfig.setBorrowCap(newBorrowCap); - _pool.setConfiguration(asset, currentConfig); - emit BorrowCapChanged(asset, oldBorrowCap, newBorrowCap); - } - - /// @inheritdoc IPoolConfigurator - function setSupplyCap( - address asset, - uint256 newSupplyCap - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldSupplyCap = currentConfig.getSupplyCap(); - currentConfig.setSupplyCap(newSupplyCap); - _pool.setConfiguration(asset, currentConfig); - emit SupplyCapChanged(asset, oldSupplyCap, newSupplyCap); - } - - /// @inheritdoc IPoolConfigurator - function setLiquidationProtocolFee( - address asset, - uint256 newFee - ) external override onlyRiskOrPoolAdmins { - require(newFee <= PercentageMath.PERCENTAGE_FACTOR, Errors.INVALID_LIQUIDATION_PROTOCOL_FEE); - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldFee = currentConfig.getLiquidationProtocolFee(); - currentConfig.setLiquidationProtocolFee(newFee); - _pool.setConfiguration(asset, currentConfig); - emit LiquidationProtocolFeeChanged(asset, oldFee, newFee); - } - - /// @inheritdoc IPoolConfigurator - function setEModeCategory( - uint8 categoryId, - uint16 ltv, - uint16 liquidationThreshold, - uint16 liquidationBonus, - string calldata label - ) external override onlyRiskOrPoolAdmins { - require(ltv != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); - require(liquidationThreshold != 0, Errors.INVALID_EMODE_CATEGORY_PARAMS); - - // 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_EMODE_CATEGORY_PARAMS); - require( - liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, - Errors.INVALID_EMODE_CATEGORY_PARAMS - ); - - // if threshold * bonus is less than PERCENTAGE_FACTOR, it's guaranteed that at the moment - // a loan is taken there is enough collateral available to cover the liquidation bonus - require( - uint256(liquidationThreshold).percentMul(liquidationBonus) <= - PercentageMath.PERCENTAGE_FACTOR, - Errors.INVALID_EMODE_CATEGORY_PARAMS - ); - - DataTypes.EModeCategoryBaseConfiguration memory categoryData; - categoryData.ltv = ltv; - categoryData.liquidationThreshold = liquidationThreshold; - categoryData.liquidationBonus = liquidationBonus; - categoryData.label = label; - - _pool.configureEModeCategory(categoryId, categoryData); - emit EModeCategoryAdded( - categoryId, - ltv, - liquidationThreshold, - liquidationBonus, - address(0), - label - ); - } - - /// @inheritdoc IPoolConfigurator - function setAssetCollateralInEMode( - address asset, - uint8 categoryId, - bool allowed - ) external override onlyRiskOrPoolAdmins { - uint128 collateralBitmap = _pool.getEModeCategoryCollateralBitmap(categoryId); - DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); - require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED); - collateralBitmap = EModeConfiguration.setReserveBitmapBit( - collateralBitmap, - reserveData.id, - allowed - ); - _pool.configureEModeCategoryCollateralBitmap(categoryId, collateralBitmap); - emit AssetCollateralInEModeChanged(asset, categoryId, allowed); - } - - /// @inheritdoc IPoolConfigurator - function setAssetBorrowableInEMode( - address asset, - uint8 categoryId, - bool borrowable - ) external override onlyRiskOrPoolAdmins { - uint128 borrowableBitmap = _pool.getEModeCategoryBorrowableBitmap(categoryId); - DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); - require(reserveData.id != 0 || _pool.getReservesList()[0] == asset, Errors.ASSET_NOT_LISTED); - borrowableBitmap = EModeConfiguration.setReserveBitmapBit( - borrowableBitmap, - reserveData.id, - borrowable - ); - _pool.configureEModeCategoryBorrowableBitmap(categoryId, borrowableBitmap); - emit AssetBorrowableInEModeChanged(asset, categoryId, borrowable); - } - - /// @inheritdoc IPoolConfigurator - function setUnbackedMintCap( - address asset, - uint256 newUnbackedMintCap - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveConfigurationMap memory currentConfig = _pool.getConfiguration(asset); - uint256 oldUnbackedMintCap = currentConfig.getUnbackedMintCap(); - currentConfig.setUnbackedMintCap(newUnbackedMintCap); - _pool.setConfiguration(asset, currentConfig); - emit UnbackedMintCapChanged(asset, oldUnbackedMintCap, newUnbackedMintCap); - } - - /// @inheritdoc IPoolConfigurator - function setReserveInterestRateData( - address asset, - bytes calldata rateData - ) external onlyRiskOrPoolAdmins { - DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset); - _updateInterestRateStrategy(asset, reserve, reserve.interestRateStrategyAddress, rateData); - } - - /// @inheritdoc IPoolConfigurator - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress, - bytes calldata rateData - ) external override onlyRiskOrPoolAdmins { - DataTypes.ReserveDataLegacy memory reserve = _pool.getReserveData(asset); - _updateInterestRateStrategy(asset, reserve, rateStrategyAddress, rateData); - } - - /// @inheritdoc IPoolConfigurator - function setPoolPause(bool paused, uint40 gracePeriod) public override onlyEmergencyOrPoolAdmin { - address[] memory reserves = _pool.getReservesList(); - - for (uint256 i = 0; i < reserves.length; i++) { - if (reserves[i] != address(0)) { - setReservePause(reserves[i], paused, gracePeriod); - } - } - } - - /// @inheritdoc IPoolConfigurator - function setPoolPause(bool paused) external override onlyEmergencyOrPoolAdmin { - setPoolPause(paused, 0); - } - - /// @inheritdoc IPoolConfigurator - function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external override onlyPoolAdmin { - require( - newBridgeProtocolFee <= PercentageMath.PERCENTAGE_FACTOR, - Errors.BRIDGE_PROTOCOL_FEE_INVALID - ); - uint256 oldBridgeProtocolFee = _pool.BRIDGE_PROTOCOL_FEE(); - _pool.updateBridgeProtocolFee(newBridgeProtocolFee); - emit BridgeProtocolFeeUpdated(oldBridgeProtocolFee, newBridgeProtocolFee); - } - - /// @inheritdoc IPoolConfigurator - function updateFlashloanPremiumTotal( - uint128 newFlashloanPremiumTotal - ) external override onlyPoolAdmin { - require( - newFlashloanPremiumTotal <= PercentageMath.PERCENTAGE_FACTOR, - Errors.FLASHLOAN_PREMIUM_INVALID - ); - uint128 oldFlashloanPremiumTotal = _pool.FLASHLOAN_PREMIUM_TOTAL(); - _pool.updateFlashloanPremiums(newFlashloanPremiumTotal, _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL()); - emit FlashloanPremiumTotalUpdated(oldFlashloanPremiumTotal, newFlashloanPremiumTotal); - } - - /// @inheritdoc IPoolConfigurator - function updateFlashloanPremiumToProtocol( - uint128 newFlashloanPremiumToProtocol - ) external override onlyPoolAdmin { - require( - newFlashloanPremiumToProtocol <= PercentageMath.PERCENTAGE_FACTOR, - Errors.FLASHLOAN_PREMIUM_INVALID - ); - uint128 oldFlashloanPremiumToProtocol = _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL(); - _pool.updateFlashloanPremiums(_pool.FLASHLOAN_PREMIUM_TOTAL(), newFlashloanPremiumToProtocol); - emit FlashloanPremiumToProtocolUpdated( - oldFlashloanPremiumToProtocol, - newFlashloanPremiumToProtocol - ); - } - - /// @inheritdoc IPoolConfigurator - function getPendingLtv(address asset) external view override returns (uint256) { - return _pendingLtv[asset]; - } - - /// @inheritdoc IPoolConfigurator - function getConfiguratorLogic() external pure returns (address) { - return address(ConfiguratorLogic); - } - - function _updateInterestRateStrategy( - address asset, - DataTypes.ReserveDataLegacy memory reserve, - address newRateStrategyAddress, - bytes calldata rateData - ) internal { - address oldRateStrategyAddress = reserve.interestRateStrategyAddress; - - _pool.syncIndexesState(asset); - - IDefaultInterestRateStrategyV2(newRateStrategyAddress).setInterestRateParams(asset, rateData); - emit ReserveInterestRateDataChanged(asset, newRateStrategyAddress, rateData); - - if (oldRateStrategyAddress != newRateStrategyAddress) { - _pool.setReserveInterestRateStrategyAddress(asset, newRateStrategyAddress); - emit ReserveInterestRateStrategyChanged( - asset, - oldRateStrategyAddress, - newRateStrategyAddress - ); - } - - _pool.syncRatesState(asset); - } - - function _checkNoSuppliers(address asset) internal view { - DataTypes.ReserveDataLegacy memory reserveData = _pool.getReserveData(asset); - uint256 totalSupplied = IPoolDataProvider(_addressesProvider.getPoolDataProvider()) - .getATokenTotalSupply(asset); - - require( - totalSupplied == 0 && reserveData.accruedToTreasury == 0, - Errors.RESERVE_LIQUIDITY_NOT_ZERO - ); - } - - function _checkNoBorrowers(address asset) internal view { - uint256 totalDebt = IPoolDataProvider(_addressesProvider.getPoolDataProvider()).getTotalDebt( - asset - ); - require(totalDebt == 0, Errors.RESERVE_DEBT_NOT_ZERO); - } - - function _onlyPoolAdmin() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - } - - function _onlyPoolOrEmergencyAdmin() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isPoolAdmin(msg.sender) || aclManager.isEmergencyAdmin(msg.sender), - Errors.CALLER_NOT_POOL_OR_EMERGENCY_ADMIN - ); - } - - function _onlyAssetListingOrPoolAdmins() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isAssetListingAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), - Errors.CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN - ); - } - - function _onlyRiskOrPoolAdmins() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isRiskAdmin(msg.sender) || aclManager.isPoolAdmin(msg.sender), - Errors.CALLER_NOT_RISK_OR_POOL_ADMIN - ); - } - - function _onlyRiskOrPoolOrEmergencyAdmins() internal view { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require( - aclManager.isRiskAdmin(msg.sender) || - aclManager.isPoolAdmin(msg.sender) || - aclManager.isEmergencyAdmin(msg.sender), - Errors.CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN - ); - } -} diff --git a/downloads/LINEA/POOL_LOGIC.sol b/downloads/LINEA/POOL_LOGIC.sol deleted file mode 100644 index 61a4f73d..00000000 --- a/downloads/LINEA/POOL_LOGIC.sol +++ /dev/null @@ -1,5725 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} - -// downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol - -/** - * @title PoolLogic library - * @author Aave - * @notice Implements the logic for Pool specific functions - */ -library PoolLogic { - using GPv2SafeERC20 for IERC20; - using WadRayMath for uint256; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice Initialize an asset reserve and add the reserve to the list of reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param params Additional parameters needed for initiation - * @return true if appended, false if inserted at existing empty spot - */ - function executeInitReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.InitReserveParams memory params - ) external returns (bool) { - require(Address.isContract(params.asset), Errors.NOT_CONTRACT); - reservesData[params.asset].init( - params.aTokenAddress, - params.variableDebtAddress, - params.interestRateStrategyAddress - ); - - bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || - reservesList[0] == params.asset; - require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); - - for (uint16 i = 0; i < params.reservesCount; i++) { - if (reservesList[i] == address(0)) { - reservesData[params.asset].id = i; - reservesList[i] = params.asset; - return false; - } - } - - require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); - reservesData[params.asset].id = params.reservesCount; - reservesList[params.reservesCount] = params.asset; - return true; - } - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function executeRescueTokens(address token, address to, uint256 amount) external { - IERC20(token).safeTransfer(to, amount); - } - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param reservesData The state of all the reserves - * @param assets The list of reserves for which the minting needs to be executed - */ - function executeMintToTreasury( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] calldata assets - ) external { - for (uint256 i = 0; i < assets.length; i++) { - address assetAddress = assets[i]; - - DataTypes.ReserveData storage reserve = reservesData[assetAddress]; - - // this cover both inactive reserves and invalid reserves since the flag will be 0 for both - if (!reserve.configuration.getActive()) { - continue; - } - - uint256 accruedToTreasury = reserve.accruedToTreasury; - - if (accruedToTreasury != 0) { - reserve.accruedToTreasury = 0; - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); - IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); - - emit MintedToTreasury(assetAddress, amountToMint); - } - } - } - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function executeResetIsolationModeTotalDebt( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset - ) external { - require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); - reservesData[asset].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(asset, 0); - } - - /** - * @notice Sets the liquidation grace period of the asset - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - */ - function executeSetLiquidationGracePeriod( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset, - uint40 until - ) external { - reservesData[asset].liquidationGracePeriodUntil = until; - } - - /** - * @notice Drop a reserve - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param asset The address of the underlying asset of the reserve - */ - function executeDropReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - address asset - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - ValidationLogic.validateDropReserve(reservesList, reserve, asset); - reservesList[reservesData[asset].id] = address(0); - delete reservesData[asset]; - } - - /** - * @notice Returns the user account data across all the reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the calculation - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function executeGetUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ) - { - ( - totalCollateralBase, - totalDebtBase, - ltv, - currentLiquidationThreshold, - healthFactor, - - ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); - - availableBorrowsBase = GenericLogic.calculateAvailableBorrows( - totalCollateralBase, - totalDebtBase, - ltv - ); - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index e7ba8f7a..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index 647fc7e7..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index cd5b83c6..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol deleted file mode 100644 index 1558fe55..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/PoolLogic.sol +++ /dev/null @@ -1,201 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; - -/** - * @title PoolLogic library - * @author Aave - * @notice Implements the logic for Pool specific functions - */ -library PoolLogic { - using GPv2SafeERC20 for IERC20; - using WadRayMath for uint256; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @notice Initialize an asset reserve and add the reserve to the list of reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param params Additional parameters needed for initiation - * @return true if appended, false if inserted at existing empty spot - */ - function executeInitReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.InitReserveParams memory params - ) external returns (bool) { - require(Address.isContract(params.asset), Errors.NOT_CONTRACT); - reservesData[params.asset].init( - params.aTokenAddress, - params.variableDebtAddress, - params.interestRateStrategyAddress - ); - - bool reserveAlreadyAdded = reservesData[params.asset].id != 0 || - reservesList[0] == params.asset; - require(!reserveAlreadyAdded, Errors.RESERVE_ALREADY_ADDED); - - for (uint16 i = 0; i < params.reservesCount; i++) { - if (reservesList[i] == address(0)) { - reservesData[params.asset].id = i; - reservesList[i] = params.asset; - return false; - } - } - - require(params.reservesCount < params.maxNumberReserves, Errors.NO_MORE_RESERVES_ALLOWED); - reservesData[params.asset].id = params.reservesCount; - reservesList[params.reservesCount] = params.asset; - return true; - } - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function executeRescueTokens(address token, address to, uint256 amount) external { - IERC20(token).safeTransfer(to, amount); - } - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param reservesData The state of all the reserves - * @param assets The list of reserves for which the minting needs to be executed - */ - function executeMintToTreasury( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] calldata assets - ) external { - for (uint256 i = 0; i < assets.length; i++) { - address assetAddress = assets[i]; - - DataTypes.ReserveData storage reserve = reservesData[assetAddress]; - - // this cover both inactive reserves and invalid reserves since the flag will be 0 for both - if (!reserve.configuration.getActive()) { - continue; - } - - uint256 accruedToTreasury = reserve.accruedToTreasury; - - if (accruedToTreasury != 0) { - reserve.accruedToTreasury = 0; - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 amountToMint = accruedToTreasury.rayMul(normalizedIncome); - IAToken(reserve.aTokenAddress).mintToTreasury(amountToMint, normalizedIncome); - - emit MintedToTreasury(assetAddress, amountToMint); - } - } - } - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function executeResetIsolationModeTotalDebt( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset - ) external { - require(reservesData[asset].configuration.getDebtCeiling() == 0, Errors.DEBT_CEILING_NOT_ZERO); - reservesData[asset].isolationModeTotalDebt = 0; - emit IsolationModeTotalDebtUpdated(asset, 0); - } - - /** - * @notice Sets the liquidation grace period of the asset - * @param reservesData The state of all the reserves - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - */ - function executeSetLiquidationGracePeriod( - mapping(address => DataTypes.ReserveData) storage reservesData, - address asset, - uint40 until - ) external { - reservesData[asset].liquidationGracePeriodUntil = until; - } - - /** - * @notice Drop a reserve - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param asset The address of the underlying asset of the reserve - */ - function executeDropReserve( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - address asset - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - ValidationLogic.validateDropReserve(reservesList, reserve, asset); - reservesList[reservesData[asset].id] = address(0); - delete reservesData[asset]; - } - - /** - * @notice Returns the user account data across all the reserves - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the calculation - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function executeGetUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ) - { - ( - totalCollateralBase, - totalDebtBase, - ltv, - currentLiquidationThreshold, - healthFactor, - - ) = GenericLogic.calculateUserAccountData(reservesData, reservesList, eModeCategories, params); - - availableBorrowsBase = GenericLogic.calculateAvailableBorrows( - totalCollateralBase, - totalDebtBase, - ltv - ); - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index dd5c637d..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index e08a30e8..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index 9adca939..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/LINEA/POOL_LOGIC/PoolLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC.sol b/downloads/LINEA/SUPPLY_LOGIC.sol deleted file mode 100644 index a3cc5ddc..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC.sol +++ /dev/null @@ -1,5824 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} - -// downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol - -/** - * @title SupplyLogic library - * @author Aave - * @notice Implements the base logic for supply/withdraw - */ -library SupplyLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. - * @dev Emits the `Supply()` event. - * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as - * collateral. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the supply function - */ - function executeSupply( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSupplyParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, reserve, params.amount, params.onBehalfOf); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, params.amount, 0); - - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - params.onBehalfOf, - params.amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration, - reserveCache.aTokenAddress - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); - } - } - - emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); - } - - /** - * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset - * previously supplied in the Aave protocol. - * @dev Emits the `Withdraw()` event. - * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the withdraw function - * @return The actual amount withdrawn - */ - function executeWithdraw( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteWithdrawParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - require(params.to != reserveCache.aTokenAddress, Errors.WITHDRAW_TO_ATOKEN); - - reserve.updateState(reserveCache); - - uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( - reserveCache.nextLiquidityIndex - ); - - uint256 amountToWithdraw = params.amount; - - if (params.amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - - ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, amountToWithdraw); - - bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); - - if (isCollateral && amountToWithdraw == userBalance) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - params.to, - amountToWithdraw, - reserveCache.nextLiquidityIndex - ); - - if (isCollateral && userConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - params.asset, - msg.sender, - params.reservesCount, - params.oracle, - params.userEModeCategory - ); - } - - emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); - - return amountToWithdraw; - } - - /** - * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid - * collateralization constraints violation. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as - * collateral. - * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param params The additional parameters needed to execute the finalizeTransfer function - */ - function executeFinalizeTransfer( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.FinalizeTransferParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - - ValidationLogic.validateTransfer(reserve); - - uint256 reserveId = reserve.id; - uint256 scaledAmount = params.amount.rayDiv(reserve.getNormalizedIncome()); - - if (params.from != params.to && scaledAmount != 0) { - DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; - - if (fromConfig.isUsingAsCollateral(reserveId)) { - if (fromConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - usersConfig[params.from], - params.asset, - params.from, - params.reservesCount, - params.oracle, - params.fromEModeCategory - ); - } - if (params.balanceFromBefore == params.amount) { - fromConfig.setUsingAsCollateral(reserveId, false); - emit ReserveUsedAsCollateralDisabled(params.asset, params.from); - } - } - - if (params.balanceToBefore == 0) { - DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - toConfig, - reserve.configuration, - reserve.aTokenAddress - ) - ) { - toConfig.setUsingAsCollateral(reserveId, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.to); - } - } - } - } - - /** - * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as - * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor - * checks to ensure collateralization. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. - * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The users configuration mapping that track the supplied/borrowed assets - * @param asset The address of the asset being configured as collateral - * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise - * @param reservesCount The number of initialized reserves - * @param priceOracle The address of the price oracle - * @param userEModeCategory The eMode category chosen by the user - */ - function executeUseReserveAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - bool useAsCollateral, - uint256 reservesCount, - address priceOracle, - uint8 userEModeCategory - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); - - ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); - - if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; - - if (useAsCollateral) { - require( - ValidationLogic.validateUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration - ), - Errors.USER_IN_ISOLATION_MODE_OR_LTV_ZERO - ); - - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, msg.sender); - } else { - userConfig.setUsingAsCollateral(reserve.id, false); - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - asset, - msg.sender, - reservesCount, - priceOracle, - userEModeCategory - ); - - emit ReserveUsedAsCollateralDisabled(asset, msg.sender); - } - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol deleted file mode 100644 index 7c97ec92..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged( - bytes32 indexed role, - bytes32 indexed previousAdminRole, - bytes32 indexed newAdminRole - ); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol deleted file mode 100644 index e7ba8f7a..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IPriceOracleSentinel.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPriceOracleSentinel - * @author Aave - * @notice Defines the basic interface for the PriceOracleSentinel - */ -interface IPriceOracleSentinel { - /** - * @dev Emitted after the sequencer oracle is updated - * @param newSequencerOracle The new sequencer oracle - */ - event SequencerOracleUpdated(address newSequencerOracle); - - /** - * @dev Emitted after the grace period is updated - * @param newGracePeriod The new grace period value - */ - event GracePeriodUpdated(uint256 newGracePeriod); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns true if the `borrow` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `borrow` operation is allowed, false otherwise. - */ - function isBorrowAllowed() external view returns (bool); - - /** - * @notice Returns true if the `liquidation` operation is allowed. - * @dev Operation not allowed when PriceOracle is down or grace period not passed. - * @return True if the `liquidation` operation is allowed, false otherwise. - */ - function isLiquidationAllowed() external view returns (bool); - - /** - * @notice Updates the address of the sequencer oracle - * @param newSequencerOracle The address of the new Sequencer Oracle to use - */ - function setSequencerOracle(address newSequencerOracle) external; - - /** - * @notice Updates the duration of the grace period - * @param newGracePeriod The value of the new grace period duration - */ - function setGracePeriod(uint256 newGracePeriod) external; - - /** - * @notice Returns the SequencerOracle - * @return The address of the sequencer oracle contract - */ - function getSequencerOracle() external view returns (address); - - /** - * @notice Returns the grace period - * @return The duration of the grace period - */ - function getGracePeriod() external view returns (uint256); -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol deleted file mode 100644 index 3bb69ef0..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/EModeConfiguration.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title EModeConfiguration library - * @author BGD Labs - * @notice Implements the bitmap logic to handle the eMode configuration - */ -library EModeConfiguration { - /** - * @notice Sets a bit in a given bitmap that represents the reserve index range - * @dev The supplied bitmap is supposed to be a uint128 in which each bit represents a reserve - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @param enabled True if the reserveIndex should be enabled on the bitmap, false otherwise - * @return The altered bitmap - */ - function setReserveBitmapBit( - uint128 bitmap, - uint256 reserveIndex, - bool enabled - ) internal pure returns (uint128) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint128 bit = uint128(1 << reserveIndex); - if (enabled) { - return bitmap | bit; - } else { - return bitmap & ~bit; - } - } - } - - /** - * @notice Validates if a reserveIndex is flagged as enabled on a given bitmap - * @param bitmap The bitmap - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the reserveindex is flagged true - */ - function isReserveEnabledOnBitmap( - uint128 bitmap, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (bitmap >> reserveIndex) & 1 != 0; - } - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol deleted file mode 100644 index 647fc7e7..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/EModeLogic.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; - -/** - * @title EModeLogic library - * @author Aave - * @notice Implements the base logic for all the actions related to the eMode - */ -library EModeLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @notice Updates the user efficiency mode category - * @dev Will revert if user is borrowing non-compatible asset or change will drop HF < HEALTH_FACTOR_LIQUIDATION_THRESHOLD - * @dev Emits the `UserEModeSet` event - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersEModeCategory The state of all users efficiency mode category - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the setUserEMode function - */ - function executeSetUserEMode( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => uint8) storage usersEModeCategory, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSetUserEModeParams memory params - ) external { - if (usersEModeCategory[msg.sender] == params.categoryId) return; - - ValidationLogic.validateSetUserEMode( - eModeCategories, - userConfig, - params.reservesCount, - params.categoryId - ); - - usersEModeCategory[msg.sender] = params.categoryId; - - ValidationLogic.validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - msg.sender, - params.categoryId, - params.reservesCount, - params.oracle - ); - emit UserEModeSet(msg.sender, params.categoryId); - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol deleted file mode 100644 index cd5b83c6..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/GenericLogic.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {EModeLogic} from './EModeLogic.sol'; - -/** - * @title GenericLogic library - * @author Aave - * @notice Implements protocol-level logic to calculate and validate the state of a user - */ -library GenericLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - struct CalculateUserAccountDataVars { - uint256 assetPrice; - uint256 assetUnit; - uint256 userBalanceInBaseCurrency; - uint256 decimals; - uint256 ltv; - uint256 liquidationThreshold; - uint256 i; - uint256 healthFactor; - uint256 totalCollateralInBaseCurrency; - uint256 totalDebtInBaseCurrency; - uint256 avgLtv; - uint256 avgLiquidationThreshold; - uint256 eModeLtv; - uint256 eModeLiqThreshold; - address currentReserveAddress; - bool hasZeroLtvCollateral; - bool isInEModeCategory; - } - - /** - * @notice Calculates the user data across the reserves. - * @dev It includes the total liquidity/collateral/borrow balances in the base currency used by the price feed, - * the average Loan To Value, the average Liquidation Ratio, and the Health factor. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional parameters needed for the calculation - * @return The total collateral of the user in the base currency used by the price feed - * @return The total debt of the user in the base currency used by the price feed - * @return The average ltv of the user - * @return The average liquidation threshold of the user - * @return The health factor of the user - * @return True if the ltv is zero, false otherwise - */ - function calculateUserAccountData( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view returns (uint256, uint256, uint256, uint256, uint256, bool) { - if (params.userConfig.isEmpty()) { - return (0, 0, 0, 0, type(uint256).max, false); - } - - CalculateUserAccountDataVars memory vars; - - if (params.userEModeCategory != 0) { - vars.eModeLtv = eModeCategories[params.userEModeCategory].ltv; - vars.eModeLiqThreshold = eModeCategories[params.userEModeCategory].liquidationThreshold; - } - - while (vars.i < params.reservesCount) { - if (!params.userConfig.isUsingAsCollateralOrBorrowing(vars.i)) { - unchecked { - ++vars.i; - } - continue; - } - - vars.currentReserveAddress = reservesList[vars.i]; - - if (vars.currentReserveAddress == address(0)) { - unchecked { - ++vars.i; - } - continue; - } - - DataTypes.ReserveData storage currentReserve = reservesData[vars.currentReserveAddress]; - - (vars.ltv, vars.liquidationThreshold, , vars.decimals, ) = currentReserve - .configuration - .getParams(); - - unchecked { - vars.assetUnit = 10 ** vars.decimals; - } - - vars.assetPrice = IPriceOracleGetter(params.oracle).getAssetPrice(vars.currentReserveAddress); - - if (vars.liquidationThreshold != 0 && params.userConfig.isUsingAsCollateral(vars.i)) { - vars.userBalanceInBaseCurrency = _getUserBalanceInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - - vars.totalCollateralInBaseCurrency += vars.userBalanceInBaseCurrency; - - vars.isInEModeCategory = - params.userEModeCategory != 0 && - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].collateralBitmap, - vars.i - ); - - if (vars.ltv != 0) { - vars.avgLtv += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLtv : vars.ltv); - } else { - vars.hasZeroLtvCollateral = true; - } - - vars.avgLiquidationThreshold += - vars.userBalanceInBaseCurrency * - (vars.isInEModeCategory ? vars.eModeLiqThreshold : vars.liquidationThreshold); - } - - if (params.userConfig.isBorrowing(vars.i)) { - vars.totalDebtInBaseCurrency += _getUserDebtInBaseCurrency( - params.user, - currentReserve, - vars.assetPrice, - vars.assetUnit - ); - } - - unchecked { - ++vars.i; - } - } - - unchecked { - vars.avgLtv = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLtv / vars.totalCollateralInBaseCurrency - : 0; - vars.avgLiquidationThreshold = vars.totalCollateralInBaseCurrency != 0 - ? vars.avgLiquidationThreshold / vars.totalCollateralInBaseCurrency - : 0; - } - - vars.healthFactor = (vars.totalDebtInBaseCurrency == 0) - ? type(uint256).max - : (vars.totalCollateralInBaseCurrency.percentMul(vars.avgLiquidationThreshold)).wadDiv( - vars.totalDebtInBaseCurrency - ); - return ( - vars.totalCollateralInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.avgLtv, - vars.avgLiquidationThreshold, - vars.healthFactor, - vars.hasZeroLtvCollateral - ); - } - - /** - * @notice Calculates the maximum amount that can be borrowed depending on the available collateral, the total debt - * and the average Loan To Value - * @param totalCollateralInBaseCurrency The total collateral in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total borrow balance in the base currency used by the price feed - * @param ltv The average loan to value - * @return The amount available to borrow in the base currency of the used by the price feed - */ - function calculateAvailableBorrows( - uint256 totalCollateralInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 ltv - ) internal pure returns (uint256) { - uint256 availableBorrowsInBaseCurrency = totalCollateralInBaseCurrency.percentMul(ltv); - - if (availableBorrowsInBaseCurrency <= totalDebtInBaseCurrency) { - return 0; - } - - availableBorrowsInBaseCurrency = availableBorrowsInBaseCurrency - totalDebtInBaseCurrency; - return availableBorrowsInBaseCurrency; - } - - /** - * @notice Calculates total debt of the user in the based currency used to normalize the values of the assets - * @dev This fetches the `balanceOf` of the variable debt token for the user. For gas reasons, the - * variable debt balance is calculated by fetching `scaledBalancesOf` normalized debt, which is cheaper than - * fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total debt of the user is being calculated - * @param assetPrice The price of the asset for which the total debt of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total debt of the user normalized to the base currency - */ - function _getUserDebtInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - // fetching variable debt - uint256 userTotalDebt = IScaledBalanceToken(reserve.variableDebtTokenAddress).scaledBalanceOf( - user - ); - if (userTotalDebt == 0) { - return 0; - } - - userTotalDebt = userTotalDebt.rayMul(reserve.getNormalizedDebt()) * assetPrice; - unchecked { - return userTotalDebt / assetUnit; - } - } - - /** - * @notice Calculates total aToken balance of the user in the based currency used by the price oracle - * @dev For gas reasons, the aToken balance is calculated by fetching `scaledBalancesOf` normalized debt, which - * is cheaper than fetching `balanceOf` - * @param user The address of the user - * @param reserve The data of the reserve for which the total aToken balance of the user is being calculated - * @param assetPrice The price of the asset for which the total aToken balance of the user is being calculated - * @param assetUnit The value representing one full unit of the asset (10^decimals) - * @return The total aToken balance of the user normalized to the base currency of the price oracle - */ - function _getUserBalanceInBaseCurrency( - address user, - DataTypes.ReserveData storage reserve, - uint256 assetPrice, - uint256 assetUnit - ) private view returns (uint256) { - uint256 normalizedIncome = reserve.getNormalizedIncome(); - uint256 balance = ( - IScaledBalanceToken(reserve.aTokenAddress).scaledBalanceOf(user).rayMul(normalizedIncome) - ) * assetPrice; - - unchecked { - return balance / assetUnit; - } - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol deleted file mode 100644 index dd5c637d..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ /dev/null @@ -1,313 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {MathUtils} from '../math/MathUtils.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements the logic to update the reserves state - */ -library ReserveLogic { - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveLogic for DataTypes.ReserveData; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - // See `IPool` for descriptions - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @notice Returns the ongoing normalized income for the reserve. - * @dev A value of 1e27 means there is no income. As time passes, the income is accrued - * @dev A value of 2*1e27 means for each unit of asset one unit of income has been accrued - * @param reserve The reserve object - * @return The normalized income, expressed in ray - */ - function getNormalizedIncome( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.liquidityIndex; - } else { - return - MathUtils.calculateLinearInterest(reserve.currentLiquidityRate, timestamp).rayMul( - reserve.liquidityIndex - ); - } - } - - /** - * @notice Returns the ongoing normalized variable debt for the reserve. - * @dev A value of 1e27 means there is no debt. As time passes, the debt is accrued - * @dev A value of 2*1e27 means that for each unit of debt, one unit worth of interest has been accumulated - * @param reserve The reserve object - * @return The normalized variable debt, expressed in ray - */ - function getNormalizedDebt( - DataTypes.ReserveData storage reserve - ) internal view returns (uint256) { - uint40 timestamp = reserve.lastUpdateTimestamp; - - //solium-disable-next-line - if (timestamp == block.timestamp) { - //if the index was updated in the same block, no need to perform any calculation - return reserve.variableBorrowIndex; - } else { - return - MathUtils.calculateCompoundedInterest(reserve.currentVariableBorrowRate, timestamp).rayMul( - reserve.variableBorrowIndex - ); - } - } - - /** - * @notice Updates the liquidity cumulative index and the variable borrow index. - * @param reserve The reserve object - * @param reserveCache The caching layer for the reserve data - */ - function updateState( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // If time didn't pass since last stored timestamp, skip state update - //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { - return; - } - - _updateIndexes(reserve, reserveCache); - _accrueToTreasury(reserve, reserveCache); - - //solium-disable-next-line - reserve.lastUpdateTimestamp = uint40(block.timestamp); - } - - /** - * @notice Accumulates a predefined amount of asset to the reserve as a fixed, instantaneous income. Used for example - * to accumulate the flashloan fee to the reserve, and spread it between all the suppliers. - * @param reserve The reserve object - * @param totalLiquidity The total liquidity available in the reserve - * @param amount The amount to accumulate - * @return The next liquidity index of the reserve - */ - function cumulateToLiquidityIndex( - DataTypes.ReserveData storage reserve, - uint256 totalLiquidity, - uint256 amount - ) internal returns (uint256) { - //next liquidity index is calculated this way: `((amount / totalLiquidity) + 1) * liquidityIndex` - //division `amount / totalLiquidity` done in ray for precision - uint256 result = (amount.wadToRay().rayDiv(totalLiquidity.wadToRay()) + WadRayMath.RAY).rayMul( - reserve.liquidityIndex - ); - reserve.liquidityIndex = result.toUint128(); - return result; - } - - /** - * @notice Initializes a reserve. - * @param reserve The reserve object - * @param aTokenAddress The address of the overlying atoken contract - * @param variableDebtTokenAddress The address of the overlying variable debt token contract - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function init( - DataTypes.ReserveData storage reserve, - address aTokenAddress, - address variableDebtTokenAddress, - address interestRateStrategyAddress - ) internal { - require(reserve.aTokenAddress == address(0), Errors.RESERVE_ALREADY_INITIALIZED); - - reserve.liquidityIndex = uint128(WadRayMath.RAY); - reserve.variableBorrowIndex = uint128(WadRayMath.RAY); - reserve.aTokenAddress = aTokenAddress; - reserve.variableDebtTokenAddress = variableDebtTokenAddress; - reserve.interestRateStrategyAddress = interestRateStrategyAddress; - } - - /** - * @notice Updates the reserve current variable borrow rate and the current liquidity rate. - * @param reserve The reserve reserve to be updated - * @param reserveCache The caching layer for the reserve data - * @param reserveAddress The address of the reserve to be updated - * @param liquidityAdded The amount of liquidity added to the protocol (supply or repay) in the previous action - * @param liquidityTaken The amount of liquidity taken from the protocol (redeem or borrow) - */ - function updateInterestRatesAndVirtualBalance( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache, - address reserveAddress, - uint256 liquidityAdded, - uint256 liquidityTaken - ) internal { - uint256 totalVariableDebt = reserveCache.nextScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - (uint256 nextLiquidityRate, uint256 nextVariableRate) = IReserveInterestRateStrategy( - reserve.interestRateStrategyAddress - ).calculateInterestRates( - DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, - liquidityAdded: liquidityAdded, - liquidityTaken: liquidityTaken, - totalDebt: totalVariableDebt, - reserveFactor: reserveCache.reserveFactor, - reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), - virtualUnderlyingBalance: reserve.virtualUnderlyingBalance - }) - ); - - reserve.currentLiquidityRate = nextLiquidityRate.toUint128(); - reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); - - // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { - if (liquidityAdded > 0) { - reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); - } - if (liquidityTaken > 0) { - reserve.virtualUnderlyingBalance -= liquidityTaken.toUint128(); - } - } - - emit ReserveDataUpdated( - reserveAddress, - nextLiquidityRate, - 0, - nextVariableRate, - reserveCache.nextLiquidityIndex, - reserveCache.nextVariableBorrowIndex - ); - } - - /** - * @notice Mints part of the repaid interest to the reserve treasury as a function of the reserve factor for the - * specific asset. - * @param reserve The reserve to be updated - * @param reserveCache The caching layer for the reserve data - */ - function _accrueToTreasury( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - if (reserveCache.reserveFactor == 0) { - return; - } - - //calculate the total variable debt at moment of the last interaction - uint256 prevTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.currVariableBorrowIndex - ); - - //calculate the new total variable debt after accumulation of the interest on the index - uint256 currTotalVariableDebt = reserveCache.currScaledVariableDebt.rayMul( - reserveCache.nextVariableBorrowIndex - ); - - //debt accrued is the sum of the current debt minus the sum of the debt at the last update - uint256 totalDebtAccrued = currTotalVariableDebt - prevTotalVariableDebt; - - uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor); - - if (amountToMint != 0) { - reserve.accruedToTreasury += amountToMint.rayDiv(reserveCache.nextLiquidityIndex).toUint128(); - } - } - - /** - * @notice Updates the reserve indexes and the timestamp of the update. - * @param reserve The reserve reserve to be updated - * @param reserveCache The cache layer holding the cached protocol data - */ - function _updateIndexes( - DataTypes.ReserveData storage reserve, - DataTypes.ReserveCache memory reserveCache - ) internal { - // Only cumulating on the supply side if there is any income being produced - // The case of Reserve Factor 100% is not a problem (currentLiquidityRate == 0), - // as liquidity index should not be updated - if (reserveCache.currLiquidityRate != 0) { - uint256 cumulatedLiquidityInterest = MathUtils.calculateLinearInterest( - reserveCache.currLiquidityRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextLiquidityIndex = cumulatedLiquidityInterest.rayMul( - reserveCache.currLiquidityIndex - ); - reserve.liquidityIndex = reserveCache.nextLiquidityIndex.toUint128(); - } - - // Variable borrow index only gets updated if there is any variable debt. - // reserveCache.currVariableBorrowRate != 0 is not a correct validation, - // because a positive base variable rate can be stored on - // reserveCache.currVariableBorrowRate, but the index should not increase - if (reserveCache.currScaledVariableDebt != 0) { - uint256 cumulatedVariableBorrowInterest = MathUtils.calculateCompoundedInterest( - reserveCache.currVariableBorrowRate, - reserveCache.reserveLastUpdateTimestamp - ); - reserveCache.nextVariableBorrowIndex = cumulatedVariableBorrowInterest.rayMul( - reserveCache.currVariableBorrowIndex - ); - reserve.variableBorrowIndex = reserveCache.nextVariableBorrowIndex.toUint128(); - } - } - - /** - * @notice Creates a cache object to avoid repeated storage reads and external contract calls when updating state and - * interest rates. - * @param reserve The reserve object for which the cache will be filled - * @return The cache object - */ - function cache( - DataTypes.ReserveData storage reserve - ) internal view returns (DataTypes.ReserveCache memory) { - DataTypes.ReserveCache memory reserveCache; - - reserveCache.reserveConfiguration = reserve.configuration; - reserveCache.reserveFactor = reserveCache.reserveConfiguration.getReserveFactor(); - reserveCache.currLiquidityIndex = reserveCache.nextLiquidityIndex = reserve.liquidityIndex; - reserveCache.currVariableBorrowIndex = reserveCache.nextVariableBorrowIndex = reserve - .variableBorrowIndex; - reserveCache.currLiquidityRate = reserve.currentLiquidityRate; - reserveCache.currVariableBorrowRate = reserve.currentVariableBorrowRate; - - reserveCache.aTokenAddress = reserve.aTokenAddress; - reserveCache.variableDebtTokenAddress = reserve.variableDebtTokenAddress; - - reserveCache.reserveLastUpdateTimestamp = reserve.lastUpdateTimestamp; - - reserveCache.currScaledVariableDebt = reserveCache.nextScaledVariableDebt = IVariableDebtToken( - reserveCache.variableDebtTokenAddress - ).scaledTotalSupply(); - - return reserveCache; - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol deleted file mode 100644 index 727886e7..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/SupplyLogic.sol +++ /dev/null @@ -1,300 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; - -/** - * @title SupplyLogic library - * @author Aave - * @notice Implements the base logic for supply/withdraw - */ -library SupplyLogic { - using ReserveLogic for DataTypes.ReserveCache; - using ReserveLogic for DataTypes.ReserveData; - using GPv2SafeERC20 for IERC20; - using UserConfiguration for DataTypes.UserConfigurationMap; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using WadRayMath for uint256; - using PercentageMath for uint256; - - // See `IPool` for descriptions - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @notice Implements the supply feature. Through `supply()`, users supply assets to the Aave protocol. - * @dev Emits the `Supply()` event. - * @dev In the first supply action, `ReserveUsedAsCollateralEnabled()` is emitted, if the asset can be enabled as - * collateral. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the supply function - */ - function executeSupply( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteSupplyParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - reserve.updateState(reserveCache); - - ValidationLogic.validateSupply(reserveCache, reserve, params.amount, params.onBehalfOf); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, params.amount, 0); - - IERC20(params.asset).safeTransferFrom(msg.sender, reserveCache.aTokenAddress, params.amount); - - bool isFirstSupply = IAToken(reserveCache.aTokenAddress).mint( - msg.sender, - params.onBehalfOf, - params.amount, - reserveCache.nextLiquidityIndex - ); - - if (isFirstSupply) { - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration, - reserveCache.aTokenAddress - ) - ) { - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.onBehalfOf); - } - } - - emit Supply(params.asset, msg.sender, params.onBehalfOf, params.amount, params.referralCode); - } - - /** - * @notice Implements the withdraw feature. Through `withdraw()`, users redeem their aTokens for the underlying asset - * previously supplied in the Aave protocol. - * @dev Emits the `Withdraw()` event. - * @dev If the user withdraws everything, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the withdraw function - * @return The actual amount withdrawn - */ - function executeWithdraw( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteWithdrawParams memory params - ) external returns (uint256) { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - require(params.to != reserveCache.aTokenAddress, Errors.WITHDRAW_TO_ATOKEN); - - reserve.updateState(reserveCache); - - uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( - reserveCache.nextLiquidityIndex - ); - - uint256 amountToWithdraw = params.amount; - - if (params.amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - - ValidationLogic.validateWithdraw(reserveCache, amountToWithdraw, userBalance); - - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, amountToWithdraw); - - bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); - - if (isCollateral && amountToWithdraw == userBalance) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - params.to, - amountToWithdraw, - reserveCache.nextLiquidityIndex - ); - - if (isCollateral && userConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - params.asset, - msg.sender, - params.reservesCount, - params.oracle, - params.userEModeCategory - ); - } - - emit Withdraw(params.asset, msg.sender, params.to, amountToWithdraw); - - return amountToWithdraw; - } - - /** - * @notice Validates a transfer of aTokens. The sender is subjected to health factor validation to avoid - * collateralization constraints violation. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event for the `to` account, if the asset is being activated as - * collateral. - * @dev In case the `from` user transfers everything, `ReserveUsedAsCollateralDisabled()` is emitted for `from`. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param usersConfig The users configuration mapping that track the supplied/borrowed assets - * @param params The additional parameters needed to execute the finalizeTransfer function - */ - function executeFinalizeTransfer( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - mapping(address => DataTypes.UserConfigurationMap) storage usersConfig, - DataTypes.FinalizeTransferParams memory params - ) external { - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - - ValidationLogic.validateTransfer(reserve); - - uint256 reserveId = reserve.id; - uint256 scaledAmount = params.amount.rayDiv(reserve.getNormalizedIncome()); - - if (params.from != params.to && scaledAmount != 0) { - DataTypes.UserConfigurationMap storage fromConfig = usersConfig[params.from]; - - if (fromConfig.isUsingAsCollateral(reserveId)) { - if (fromConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - usersConfig[params.from], - params.asset, - params.from, - params.reservesCount, - params.oracle, - params.fromEModeCategory - ); - } - if (params.balanceFromBefore == params.amount) { - fromConfig.setUsingAsCollateral(reserveId, false); - emit ReserveUsedAsCollateralDisabled(params.asset, params.from); - } - } - - if (params.balanceToBefore == 0) { - DataTypes.UserConfigurationMap storage toConfig = usersConfig[params.to]; - if ( - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - toConfig, - reserve.configuration, - reserve.aTokenAddress - ) - ) { - toConfig.setUsingAsCollateral(reserveId, true); - emit ReserveUsedAsCollateralEnabled(params.asset, params.to); - } - } - } - } - - /** - * @notice Executes the 'set as collateral' feature. A user can choose to activate or deactivate an asset as - * collateral at any point in time. Deactivating an asset as collateral is subjected to the usual health factor - * checks to ensure collateralization. - * @dev Emits the `ReserveUsedAsCollateralEnabled()` event if the asset can be activated as collateral. - * @dev In case the asset is being deactivated as collateral, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The users configuration mapping that track the supplied/borrowed assets - * @param asset The address of the asset being configured as collateral - * @param useAsCollateral True if the user wants to set the asset as collateral, false otherwise - * @param reservesCount The number of initialized reserves - * @param priceOracle The address of the price oracle - * @param userEModeCategory The eMode category chosen by the user - */ - function executeUseReserveAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - address asset, - bool useAsCollateral, - uint256 reservesCount, - address priceOracle, - uint8 userEModeCategory - ) external { - DataTypes.ReserveData storage reserve = reservesData[asset]; - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - - uint256 userBalance = IERC20(reserveCache.aTokenAddress).balanceOf(msg.sender); - - ValidationLogic.validateSetUseReserveAsCollateral(reserveCache, userBalance); - - if (useAsCollateral == userConfig.isUsingAsCollateral(reserve.id)) return; - - if (useAsCollateral) { - require( - ValidationLogic.validateUseAsCollateral( - reservesData, - reservesList, - userConfig, - reserveCache.reserveConfiguration - ), - Errors.USER_IN_ISOLATION_MODE_OR_LTV_ZERO - ); - - userConfig.setUsingAsCollateral(reserve.id, true); - emit ReserveUsedAsCollateralEnabled(asset, msg.sender); - } else { - userConfig.setUsingAsCollateral(reserve.id, false); - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - asset, - msg.sender, - reservesCount, - priceOracle, - userEModeCategory - ); - - emit ReserveUsedAsCollateralDisabled(asset, msg.sender); - } - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol deleted file mode 100644 index e08a30e8..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {Address} from '../../../dependencies/openzeppelin/contracts/Address.sol'; -import {GPv2SafeERC20} from '../../../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IReserveInterestRateStrategy} from '../../../interfaces/IReserveInterestRateStrategy.sol'; -import {IScaledBalanceToken} from '../../../interfaces/IScaledBalanceToken.sol'; -import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {IPriceOracleSentinel} from '../../../interfaces/IPriceOracleSentinel.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IAccessControl} from '../../../dependencies/openzeppelin/contracts/IAccessControl.sol'; -import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {EModeConfiguration} from '../configuration/EModeConfiguration.sol'; -import {Errors} from '../helpers/Errors.sol'; -import {WadRayMath} from '../math/WadRayMath.sol'; -import {PercentageMath} from '../math/PercentageMath.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveLogic} from './ReserveLogic.sol'; -import {GenericLogic} from './GenericLogic.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; - -/** - * @title ReserveLogic library - * @author Aave - * @notice Implements functions to validate the different actions of the protocol - */ -library ValidationLogic { - using ReserveLogic for DataTypes.ReserveData; - using WadRayMath for uint256; - using PercentageMath for uint256; - using SafeCast for uint256; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using Address for address; - - // Factor to apply to "only-variable-debt" liquidity rate to get threshold for rebalancing, expressed in bps - // A value of 0.9e4 results in 90% - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 0.9e4; - - // Minimum health factor allowed under any circumstance - // A value of 0.95e18 results in 0.95 - uint256 public constant MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 0.95e18; - - /** - * @dev Minimum health factor to consider a user position healthy - * A value of 1e18 results in 1 - */ - uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; - - /** - * @dev Role identifier for the role allowed to supply isolated reserves as collateral - */ - bytes32 public constant ISOLATED_COLLATERAL_SUPPLIER_ROLE = - keccak256('ISOLATED_COLLATERAL_SUPPLIER'); - - /** - * @notice Validates a supply action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be supplied - */ - function validateSupply( - DataTypes.ReserveCache memory reserveCache, - DataTypes.ReserveData storage reserve, - uint256 amount, - address onBehalfOf - ) internal view { - require(amount != 0, Errors.INVALID_AMOUNT); - - (bool isActive, bool isFrozen, , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - require(!isFrozen, Errors.RESERVE_FROZEN); - require(onBehalfOf != reserveCache.aTokenAddress, Errors.SUPPLY_TO_ATOKEN); - - uint256 supplyCap = reserveCache.reserveConfiguration.getSupplyCap(); - require( - supplyCap == 0 || - ((IAToken(reserveCache.aTokenAddress).scaledTotalSupply() + - uint256(reserve.accruedToTreasury)).rayMul(reserveCache.nextLiquidityIndex) + amount) <= - supplyCap * (10 ** reserveCache.reserveConfiguration.getDecimals()), - Errors.SUPPLY_CAP_EXCEEDED - ); - } - - /** - * @notice Validates a withdraw action. - * @param reserveCache The cached data of the reserve - * @param amount The amount to be withdrawn - * @param userBalance The balance of the user - */ - function validateWithdraw( - DataTypes.ReserveCache memory reserveCache, - uint256 amount, - uint256 userBalance - ) internal pure { - require(amount != 0, Errors.INVALID_AMOUNT); - require(amount <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - struct ValidateBorrowLocalVars { - uint256 currentLtv; - uint256 collateralNeededInBaseCurrency; - uint256 userCollateralInBaseCurrency; - uint256 userDebtInBaseCurrency; - uint256 availableLiquidity; - uint256 healthFactor; - uint256 totalDebt; - uint256 totalSupplyVariableDebt; - uint256 reserveDecimals; - uint256 borrowCap; - uint256 amountInBaseCurrency; - uint256 assetUnit; - address siloedBorrowingAddress; - bool isActive; - bool isFrozen; - bool isPaused; - bool borrowingEnabled; - bool siloedBorrowingEnabled; - } - - /** - * @notice Validates a borrow action. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param params Additional params needed for the validation - */ - function validateBorrow( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.ValidateBorrowParams memory params - ) internal view { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - ValidateBorrowLocalVars memory vars; - - (vars.isActive, vars.isFrozen, vars.borrowingEnabled, vars.isPaused) = params - .reserveCache - .reserveConfiguration - .getFlags(); - - require(vars.isActive, Errors.RESERVE_INACTIVE); - require(!vars.isPaused, Errors.RESERVE_PAUSED); - require(!vars.isFrozen, Errors.RESERVE_FROZEN); - require(vars.borrowingEnabled, Errors.BORROWING_NOT_ENABLED); - require( - !params.reserveCache.reserveConfiguration.getIsVirtualAccActive() || - IERC20(params.reserveCache.aTokenAddress).totalSupply() >= params.amount, - Errors.INVALID_AMOUNT - ); - - require( - params.priceOracleSentinel == address(0) || - IPriceOracleSentinel(params.priceOracleSentinel).isBorrowAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - //validate interest rate mode - require( - params.interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - - vars.reserveDecimals = params.reserveCache.reserveConfiguration.getDecimals(); - vars.borrowCap = params.reserveCache.reserveConfiguration.getBorrowCap(); - unchecked { - vars.assetUnit = 10 ** vars.reserveDecimals; - } - - if (vars.borrowCap != 0) { - vars.totalSupplyVariableDebt = params.reserveCache.currScaledVariableDebt.rayMul( - params.reserveCache.nextVariableBorrowIndex - ); - - vars.totalDebt = vars.totalSupplyVariableDebt + params.amount; - - unchecked { - require(vars.totalDebt <= vars.borrowCap * vars.assetUnit, Errors.BORROW_CAP_EXCEEDED); - } - } - - if (params.isolationModeActive) { - // check that the asset being borrowed is borrowable in isolation mode AND - // the total exposure is no bigger than the collateral debt ceiling - require( - params.reserveCache.reserveConfiguration.getBorrowableInIsolation(), - Errors.ASSET_NOT_BORROWABLE_IN_ISOLATION - ); - - require( - reservesData[params.isolationModeCollateralAddress].isolationModeTotalDebt + - (params.amount / - 10 ** (vars.reserveDecimals - ReserveConfiguration.DEBT_CEILING_DECIMALS)) - .toUint128() <= - params.isolationModeDebtCeiling, - Errors.DEBT_CEILING_EXCEEDED - ); - } - - if (params.userEModeCategory != 0) { - require( - EModeConfiguration.isReserveEnabledOnBitmap( - eModeCategories[params.userEModeCategory].borrowableBitmap, - reservesData[params.asset].id - ), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - - ( - vars.userCollateralInBaseCurrency, - vars.userDebtInBaseCurrency, - vars.currentLtv, - , - vars.healthFactor, - - ) = GenericLogic.calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: params.userConfig, - reservesCount: params.reservesCount, - user: params.userAddress, - oracle: params.oracle, - userEModeCategory: params.userEModeCategory - }) - ); - - require(vars.userCollateralInBaseCurrency != 0, Errors.COLLATERAL_BALANCE_IS_ZERO); - require(vars.currentLtv != 0, Errors.LTV_VALIDATION_FAILED); - - require( - vars.healthFactor > HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - vars.amountInBaseCurrency = - IPriceOracleGetter(params.oracle).getAssetPrice(params.asset) * - params.amount; - unchecked { - vars.amountInBaseCurrency /= vars.assetUnit; - } - - //add the current already borrowed amount to the amount requested to calculate the total collateral needed. - vars.collateralNeededInBaseCurrency = (vars.userDebtInBaseCurrency + vars.amountInBaseCurrency) - .percentDiv(vars.currentLtv); //LTV is calculated in percentage - - require( - vars.collateralNeededInBaseCurrency <= vars.userCollateralInBaseCurrency, - Errors.COLLATERAL_CANNOT_COVER_NEW_BORROW - ); - - if (params.userConfig.isBorrowingAny()) { - (vars.siloedBorrowingEnabled, vars.siloedBorrowingAddress) = params - .userConfig - .getSiloedBorrowingState(reservesData, reservesList); - - if (vars.siloedBorrowingEnabled) { - require(vars.siloedBorrowingAddress == params.asset, Errors.SILOED_BORROWING_VIOLATION); - } else { - require( - !params.reserveCache.reserveConfiguration.getSiloedBorrowing(), - Errors.SILOED_BORROWING_VIOLATION - ); - } - } - } - - /** - * @notice Validates a repay action. - * @param reserveCache The cached data of the reserve - * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) - * @param onBehalfOf The address of the user msg.sender is repaying for - * @param debt The borrow balance of the user - */ - function validateRepay( - DataTypes.ReserveCache memory reserveCache, - uint256 amountSent, - DataTypes.InterestRateMode interestRateMode, - address onBehalfOf, - uint256 debt - ) internal view { - require(amountSent != 0, Errors.INVALID_AMOUNT); - require( - interestRateMode == DataTypes.InterestRateMode.VARIABLE, - Errors.INVALID_INTEREST_RATE_MODE_SELECTED - ); - require( - amountSent != type(uint256).max || msg.sender == onBehalfOf, - Errors.NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF - ); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - - require(debt != 0, Errors.NO_DEBT_OF_SELECTED_TYPE); - } - - /** - * @notice Validates the action of setting an asset as collateral. - * @param reserveCache The cached data of the reserve - * @param userBalance The balance of the user - */ - function validateSetUseReserveAsCollateral( - DataTypes.ReserveCache memory reserveCache, - uint256 userBalance - ) internal pure { - require(userBalance != 0, Errors.UNDERLYING_BALANCE_ZERO); - - (bool isActive, , , bool isPaused) = reserveCache.reserveConfiguration.getFlags(); - require(isActive, Errors.RESERVE_INACTIVE); - require(!isPaused, Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a flashloan action. - * @param reservesData The state of all the reserves - * @param assets The assets being flash-borrowed - * @param amounts The amounts for each asset being borrowed - */ - function validateFlashloan( - mapping(address => DataTypes.ReserveData) storage reservesData, - address[] memory assets, - uint256[] memory amounts - ) internal view { - require(assets.length == amounts.length, Errors.INCONSISTENT_FLASHLOAN_PARAMS); - for (uint256 i = 0; i < assets.length; i++) { - for (uint256 j = i + 1; j < assets.length; j++) { - require(assets[i] != assets[j], Errors.INCONSISTENT_FLASHLOAN_PARAMS); - } - validateFlashloanSimple(reservesData[assets[i]], amounts[i]); - } - } - - /** - * @notice Validates a flashloan action. - * @param reserve The state of the reserve - */ - function validateFlashloanSimple( - DataTypes.ReserveData storage reserve, - uint256 amount - ) internal view { - DataTypes.ReserveConfigurationMap memory configuration = reserve.configuration; - require(!configuration.getPaused(), Errors.RESERVE_PAUSED); - require(configuration.getActive(), Errors.RESERVE_INACTIVE); - require(configuration.getFlashLoanEnabled(), Errors.FLASHLOAN_DISABLED); - require( - !configuration.getIsVirtualAccActive() || - IERC20(reserve.aTokenAddress).totalSupply() >= amount, - Errors.INVALID_AMOUNT - ); - } - - struct ValidateLiquidationCallLocalVars { - bool collateralReserveActive; - bool collateralReservePaused; - bool principalReserveActive; - bool principalReservePaused; - bool isCollateralEnabled; - } - - /** - * @notice Validates the liquidation action. - * @param userConfig The user configuration mapping - * @param collateralReserve The reserve data of the collateral - * @param debtReserve The reserve data of the debt - * @param params Additional parameters needed for the validation - */ - function validateLiquidationCall( - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveData storage debtReserve, - DataTypes.ValidateLiquidationCallParams memory params - ) internal view { - ValidateLiquidationCallLocalVars memory vars; - - (vars.collateralReserveActive, , , vars.collateralReservePaused) = collateralReserve - .configuration - .getFlags(); - - (vars.principalReserveActive, , , vars.principalReservePaused) = params - .debtReserveCache - .reserveConfiguration - .getFlags(); - - require(vars.collateralReserveActive && vars.principalReserveActive, Errors.RESERVE_INACTIVE); - require(!vars.collateralReservePaused && !vars.principalReservePaused, Errors.RESERVE_PAUSED); - - require( - params.priceOracleSentinel == address(0) || - params.healthFactor < MINIMUM_HEALTH_FACTOR_LIQUIDATION_THRESHOLD || - IPriceOracleSentinel(params.priceOracleSentinel).isLiquidationAllowed(), - Errors.PRICE_ORACLE_SENTINEL_CHECK_FAILED - ); - - require( - collateralReserve.liquidationGracePeriodUntil < uint40(block.timestamp) && - debtReserve.liquidationGracePeriodUntil < uint40(block.timestamp), - Errors.LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED - ); - - require( - params.healthFactor < HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_NOT_BELOW_THRESHOLD - ); - - vars.isCollateralEnabled = - collateralReserve.configuration.getLiquidationThreshold() != 0 && - userConfig.isUsingAsCollateral(collateralReserve.id); - - //if collateral isn't enabled as collateral by user, it cannot be liquidated - require(vars.isCollateralEnabled, Errors.COLLATERAL_CANNOT_BE_LIQUIDATED); - require(params.totalDebt != 0, Errors.SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - } - - /** - * @notice Validates the health factor of a user. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param user The user to validate health factor of - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function validateHealthFactor( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) internal view returns (uint256, bool) { - (, , , , uint256 healthFactor, bool hasZeroLtvCollateral) = GenericLogic - .calculateUserAccountData( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - - require( - healthFactor >= HEALTH_FACTOR_LIQUIDATION_THRESHOLD, - Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ); - - return (healthFactor, hasZeroLtvCollateral); - } - - /** - * @notice Validates the health factor of a user and the ltv of the asset being withdrawn. - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param eModeCategories The configuration of all the efficiency mode categories - * @param userConfig The state of the user for the specific reserve - * @param asset The asset for which the ltv will be validated - * @param from The user from which the aTokens are being transferred - * @param reservesCount The number of available reserves - * @param oracle The price oracle - * @param userEModeCategory The users active efficiency mode category - */ - function validateHFAndLtv( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - address asset, - address from, - uint256 reservesCount, - address oracle, - uint8 userEModeCategory - ) internal view { - DataTypes.ReserveData memory reserve = reservesData[asset]; - - (, bool hasZeroLtvCollateral) = validateHealthFactor( - reservesData, - reservesList, - eModeCategories, - userConfig, - from, - userEModeCategory, - reservesCount, - oracle - ); - - require( - !hasZeroLtvCollateral || reserve.configuration.getLtv() == 0, - Errors.LTV_VALIDATION_FAILED - ); - } - - /** - * @notice Validates a transfer action. - * @param reserve The reserve object - */ - function validateTransfer(DataTypes.ReserveData storage reserve) internal view { - require(!reserve.configuration.getPaused(), Errors.RESERVE_PAUSED); - } - - /** - * @notice Validates a drop reserve action. - * @param reservesList The addresses of all the active reserves - * @param reserve The reserve object - * @param asset The address of the reserve's underlying asset - */ - function validateDropReserve( - mapping(uint256 => address) storage reservesList, - DataTypes.ReserveData storage reserve, - address asset - ) internal view { - require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID); - require(reserve.id != 0 || reservesList[0] == asset, Errors.ASSET_NOT_LISTED); - require( - IERC20(reserve.variableDebtTokenAddress).totalSupply() == 0, - Errors.VARIABLE_DEBT_SUPPLY_NOT_ZERO - ); - require( - IERC20(reserve.aTokenAddress).totalSupply() == 0 && reserve.accruedToTreasury == 0, - Errors.UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO - ); - } - - /** - * @notice Validates the action of setting efficiency mode. - * @param eModeCategories a mapping storing configurations for all efficiency mode categories - * @param userConfig the user configuration - * @param reservesCount The total number of valid reserves - * @param categoryId The id of the category - */ - function validateSetUserEMode( - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap memory userConfig, - uint256 reservesCount, - uint8 categoryId - ) internal view { - DataTypes.EModeCategory storage eModeCategory = eModeCategories[categoryId]; - // category is invalid if the liq threshold is not set - require( - categoryId == 0 || eModeCategory.liquidationThreshold != 0, - Errors.INCONSISTENT_EMODE_CATEGORY - ); - - // eMode can always be enabled if the user hasn't supplied anything - if (userConfig.isEmpty()) { - return; - } - - // if user is trying to set another category than default we require that - // either the user is not borrowing, or it's borrowing assets of categoryId - if (categoryId != 0) { - unchecked { - for (uint256 i = 0; i < reservesCount; i++) { - if (userConfig.isBorrowing(i)) { - require( - EModeConfiguration.isReserveEnabledOnBitmap(eModeCategory.borrowableBitmap, i), - Errors.NOT_BORROWABLE_IN_EMODE - ); - } - } - } - } - } - - /** - * @notice Validates the action of activating the asset as collateral. - * @dev Only possible if the asset has non-zero LTV and the user is not in isolation mode - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig - ) internal view returns (bool) { - if (reserveConfig.getLtv() == 0) { - return false; - } - if (!userConfig.isUsingAsCollateralAny()) { - return true; - } - (bool isolationModeActive, , ) = userConfig.getIsolationModeState(reservesData, reservesList); - - return (!isolationModeActive && reserveConfig.getDebtCeiling() == 0); - } - - /** - * @notice Validates if an asset should be automatically activated as collateral in the following actions: supply, - * transfer, mint unbacked, and liquidate - * @dev This is used to ensure that isolated assets are not enabled as collateral automatically - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @param userConfig the user configuration - * @param reserveConfig The reserve configuration - * @return True if the asset can be activated as collateral, false otherwise - */ - function validateAutomaticUseAsCollateral( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ReserveConfigurationMap memory reserveConfig, - address aTokenAddress - ) internal view returns (bool) { - if (reserveConfig.getDebtCeiling() != 0) { - // ensures only the ISOLATED_COLLATERAL_SUPPLIER_ROLE can enable collateral as side-effect of an action - IPoolAddressesProvider addressesProvider = IncentivizedERC20(aTokenAddress) - .POOL() - .ADDRESSES_PROVIDER(); - if ( - !IAccessControl(addressesProvider.getACLManager()).hasRole( - ISOLATED_COLLATERAL_SUPPLIER_ROLE, - msg.sender - ) - ) return false; - } - return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol deleted file mode 100644 index 9adca939..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/MathUtils.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {WadRayMath} from './WadRayMath.sol'; - -/** - * @title MathUtils library - * @author Aave - * @notice Provides functions to perform linear and compounded interest calculations - */ -library MathUtils { - using WadRayMath for uint256; - - /// @dev Ignoring leap years - uint256 internal constant SECONDS_PER_YEAR = 365 days; - - /** - * @dev Function to calculate the interest accumulated using a linear interest rate formula - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate linearly accumulated during the timeDelta, in ray - */ - function calculateLinearInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - //solium-disable-next-line - uint256 result = rate * (block.timestamp - uint256(lastUpdateTimestamp)); - unchecked { - result = result / SECONDS_PER_YEAR; - } - - return WadRayMath.RAY + result; - } - - /** - * @dev Function to calculate the interest using a compounded interest rate formula - * To avoid expensive exponentiation, the calculation is performed using a binomial approximation: - * - * (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3... - * - * The approximation slightly underpays liquidity providers and undercharges borrowers, with the advantage of great - * gas cost reductions. The whitepaper contains reference to the approximation and a table showing the margin of - * error per different time periods - * - * @param rate The interest rate, in ray - * @param lastUpdateTimestamp The timestamp of the last update of the interest - * @return The interest rate compounded during the timeDelta, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp, - uint256 currentTimestamp - ) internal pure returns (uint256) { - //solium-disable-next-line - uint256 exp = currentTimestamp - uint256(lastUpdateTimestamp); - - if (exp == 0) { - return WadRayMath.RAY; - } - - uint256 expMinusOne; - uint256 expMinusTwo; - uint256 basePowerTwo; - uint256 basePowerThree; - unchecked { - expMinusOne = exp - 1; - - expMinusTwo = exp > 2 ? exp - 2 : 0; - - basePowerTwo = rate.rayMul(rate) / (SECONDS_PER_YEAR * SECONDS_PER_YEAR); - basePowerThree = basePowerTwo.rayMul(rate) / SECONDS_PER_YEAR; - } - - uint256 secondTerm = exp * expMinusOne * basePowerTwo; - unchecked { - secondTerm /= 2; - } - uint256 thirdTerm = exp * expMinusOne * expMinusTwo * basePowerThree; - unchecked { - thirdTerm /= 6; - } - - return WadRayMath.RAY + (rate * exp) / SECONDS_PER_YEAR + secondTerm + thirdTerm; - } - - /** - * @dev Calculates the compounded interest between the timestamp of the last update and the current block timestamp - * @param rate The interest rate (in ray) - * @param lastUpdateTimestamp The timestamp from which the interest accumulation needs to be calculated - * @return The interest rate compounded between lastUpdateTimestamp and current block timestamp, in ray - */ - function calculateCompoundedInterest( - uint256 rate, - uint40 lastUpdateTimestamp - ) internal view returns (uint256) { - return calculateCompoundedInterest(rate, lastUpdateTimestamp, block.timestamp); - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol deleted file mode 100644 index c000be3a..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/PercentageMath.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title PercentageMath library - * @author Aave - * @notice Provides functions to perform percentage calculations - * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library PercentageMath { - // Maximum percentage factor (100.00%) - uint256 internal constant PERCENTAGE_FACTOR = 1e4; - - // Half percentage factor (50.00%) - uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; - - /** - * @notice Executes a percentage multiplication - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentmul percentage - */ - function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage - assembly { - if iszero( - or( - iszero(percentage), - iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) - ) - ) { - revert(0, 0) - } - - result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) - } - } - - /** - * @notice Executes a percentage division - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param value The value of which the percentage needs to be calculated - * @param percentage The percentage of the value to be calculated - * @return result value percentdiv percentage - */ - function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { - // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR - assembly { - if or( - iszero(percentage), - iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) - ) { - revert(0, 0) - } - - result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) - } - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/LINEA/SUPPLY_LOGIC/SupplyLogic/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER.sol deleted file mode 100644 index 64c6bd56..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER.sol +++ /dev/null @@ -1,4044 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol - -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol - -/** - * @title IRewardsDistributor - * @author Aave - * @notice Defines the basic interface for a Rewards Distributor. - */ -interface IRewardsDistributor { - /** - * @dev Emitted when the configuration of the rewards of an asset is updated. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param oldEmission The old emissions per second value of the reward distribution - * @param newEmission The new emissions per second value of the reward distribution - * @param oldDistributionEnd The old end timestamp of the reward distribution - * @param newDistributionEnd The new end timestamp of the reward distribution - * @param assetIndex The index of the asset distribution - */ - event AssetConfigUpdated( - address indexed asset, - address indexed reward, - uint256 oldEmission, - uint256 newEmission, - uint256 oldDistributionEnd, - uint256 newDistributionEnd, - uint256 assetIndex - ); - - /** - * @dev Emitted when rewards of an asset are accrued on behalf of a user. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param user The address of the user that rewards are accrued on behalf of - * @param assetIndex The index of the asset distribution - * @param userIndex The index of the asset distribution on behalf of the user - * @param rewardsAccrued The amount of rewards accrued - */ - event Accrued( - address indexed asset, - address indexed reward, - address indexed user, - uint256 assetIndex, - uint256 userIndex, - uint256 rewardsAccrued - ); - - /** - * @dev Sets the end date for the distribution - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Gets the end date for the distribution - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The timestamp with the end of the distribution, in unix time format - **/ - function getDistributionEnd(address asset, address reward) external view returns (uint256); - - /** - * @dev Returns the index of a user on a reward distribution - * @param user Address of the user - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The current user asset index, not including new distributions - **/ - function getUserAssetIndex( - address user, - address asset, - address reward - ) external view returns (uint256); - - /** - * @dev Returns the configuration of the distribution reward for a certain asset - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The index of the asset distribution - * @return The emission per second of the reward distribution - * @return The timestamp of the last update of the index - * @return The timestamp of the distribution end - **/ - function getRewardsData( - address asset, - address reward - ) external view returns (uint256, uint256, uint256, uint256); - - /** - * @dev Calculates the next value of an specific distribution index, with validations. - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The old index of the asset distribution - * @return The new index of the asset distribution - **/ - function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); - - /** - * @dev Returns the list of available reward token addresses of an incentivized asset - * @param asset The incentivized asset - * @return List of rewards addresses of the input asset - **/ - function getRewardsByAsset(address asset) external view returns (address[] memory); - - /** - * @dev Returns the list of available reward addresses - * @return List of rewards supported in this contract - **/ - function getRewardsList() external view returns (address[] memory); - - /** - * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. - * @param user The address of the user - * @param reward The address of the reward token - * @return Unclaimed rewards, not including new distributions - **/ - function getUserAccruedRewards(address user, address reward) external view returns (uint256); - - /** - * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @param reward The address of the reward token - * @return The rewards amount - **/ - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view returns (uint256); - - /** - * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @return The list of reward addresses - * @return The list of unclaimed amount of rewards - **/ - function getAllUserRewards( - address[] calldata assets, - address user - ) external view returns (address[] memory, uint256[] memory); - - /** - * @dev Returns the decimals of an asset to calculate the distribution delta - * @param asset The address to retrieve decimals - * @return The decimals of an underlying asset - */ - function getAssetDecimals(address asset) external view returns (uint8); - - /** - * @dev Returns the address of the emission manager - * @return The address of the EmissionManager - */ - function EMISSION_MANAGER() external view returns (address); - - /** - * @dev Returns the address of the emission manager. - * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. - * @return The address of the EmissionManager - */ - function getEmissionManager() external view returns (address); -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol - -interface ITransferStrategyBase { - event EmergencyWithdrawal( - address indexed caller, - address indexed token, - address indexed to, - uint256 amount - ); - - /** - * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation - * @param to Account to transfer rewards - * @param reward Address of the reward token - * @param amount Amount to transfer to the "to" address parameter - * @return Returns true bool if transfer logic succeeds - */ - function performTransfer(address to, address reward, uint256 amount) external returns (bool); - - /** - * @return Returns the address of the Incentives Controller - */ - function getIncentivesController() external view returns (address); - - /** - * @return Returns the address of the Rewards admin - */ - function getRewardsAdmin() external view returns (address); - - /** - * @dev Perform an emergency token withdrawal only callable by the Rewards admin - * @param token Address of the token to withdraw funds from this contract - * @param to Address of the recipient of the withdrawal - * @param amount Amount of the withdrawal - */ - function emergencyWithdrawal(address token, address to, uint256 amount) external; -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol - -interface IUiIncentiveDataProviderV3 { - struct AggregatedReserveIncentiveData { - address underlyingAsset; - IncentiveData aIncentiveData; - IncentiveData vIncentiveData; - } - - struct IncentiveData { - address tokenAddress; - address incentiveControllerAddress; - RewardInfo[] rewardsTokenInformation; - } - - struct RewardInfo { - string rewardTokenSymbol; - address rewardTokenAddress; - address rewardOracleAddress; - uint256 emissionPerSecond; - uint256 incentivesLastUpdateTimestamp; - uint256 tokenIncentivesIndex; - uint256 emissionEndTimestamp; - int256 rewardPriceFeed; - uint8 rewardTokenDecimals; - uint8 precision; - uint8 priceFeedDecimals; - } - - struct UserReserveIncentiveData { - address underlyingAsset; - UserIncentiveData aTokenIncentivesUserData; - UserIncentiveData vTokenIncentivesUserData; - } - - struct UserIncentiveData { - address tokenAddress; - address incentiveControllerAddress; - UserRewardInfo[] userRewardsInformation; - } - - struct UserRewardInfo { - string rewardTokenSymbol; - address rewardOracleAddress; - address rewardTokenAddress; - uint256 userUnclaimedRewards; - uint256 tokenIncentivesUserIndex; - int256 rewardPriceFeed; - uint8 priceFeedDecimals; - uint8 rewardTokenDecimals; - } - - function getReservesIncentivesData( - IPoolAddressesProvider provider - ) external view returns (AggregatedReserveIncentiveData[] memory); - - function getUserReservesIncentivesData( - IPoolAddressesProvider provider, - address user - ) external view returns (UserReserveIncentiveData[] memory); - - // generic method with full data - function getFullReservesIncentiveData( - IPoolAddressesProvider provider, - address user - ) - external - view - returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory); -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol - -library RewardsDataTypes { - struct RewardsConfigInput { - uint88 emissionPerSecond; - uint256 totalSupply; - uint32 distributionEnd; - address asset; - address reward; - ITransferStrategyBase transferStrategy; - IEACAggregatorProxy rewardOracle; - } - - struct UserAssetBalance { - address asset; - uint256 userBalance; - uint256 totalSupply; - } - - struct UserData { - // Liquidity index of the reward distribution for the user - uint104 index; - // Amount of accrued rewards for the user since last user index update - uint128 accrued; - } - - struct RewardData { - // Liquidity index of the reward distribution - uint104 index; - // Amount of reward tokens distributed per second - uint88 emissionPerSecond; - // Timestamp of the last reward index update - uint32 lastUpdateTimestamp; - // The end of the distribution of rewards (in seconds) - uint32 distributionEnd; - // Map of user addresses and their rewards data (userAddress => userData) - mapping(address => UserData) usersData; - } - - struct AssetData { - // Map of reward token addresses and their data (rewardTokenAddress => rewardData) - mapping(address => RewardData) rewards; - // List of reward token addresses for the asset - mapping(uint128 => address) availableRewards; - // Count of reward tokens for the asset - uint128 availableRewardsCount; - // Number of decimals of the asset - uint8 decimals; - } -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol - -/** - * @title IRewardsController - * @author Aave - * @notice Defines the basic interface for a Rewards Controller. - */ -interface IRewardsController is IRewardsDistributor { - /** - * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user - * @param user The address of the user - * @param claimer The address of the claimer - */ - event ClaimerSet(address indexed user, address indexed claimer); - - /** - * @dev Emitted when rewards are claimed - * @param user The address of the user rewards has been claimed on behalf of - * @param reward The address of the token reward is claimed - * @param to The address of the receiver of the rewards - * @param claimer The address of the claimer - * @param amount The amount of rewards claimed - */ - event RewardsClaimed( - address indexed user, - address indexed reward, - address indexed to, - address claimer, - uint256 amount - ); - - /** - * @dev Emitted when a transfer strategy is installed for the reward distribution - * @param reward The address of the token reward - * @param transferStrategy The address of TransferStrategy contract - */ - event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); - - /** - * @dev Emitted when the reward oracle is updated - * @param reward The address of the token reward - * @param rewardOracle The address of oracle - */ - event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Get the price aggregator oracle address - * @param reward The address of the reward - * @return The price oracle of the reward - */ - function getRewardOracle(address reward) external view returns (address); - - /** - * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) - * @param user The address of the user - * @return The claimer address - */ - function getClaimer(address user) external view returns (address); - - /** - * @dev Returns the Transfer Strategy implementation contract address being used for a reward address - * @param reward The address of the reward - * @return The address of the TransferStrategy contract - */ - function getTransferStrategy(address reward) external view returns (address); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - **/ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - - /** - * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The - * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external returns (uint256); - - /** - * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" - **/ - function claimAllRewards( - address[] calldata assets, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must - * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsToSelf( - address[] calldata assets - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} - -// downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol - -contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { - using UserConfiguration for DataTypes.UserConfigurationMap; - - function getFullReservesIncentiveData( - IPoolAddressesProvider provider, - address user - ) - external - view - override - returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory) - { - return (_getReservesIncentivesData(provider), _getUserReservesIncentivesData(provider, user)); - } - - function getReservesIncentivesData( - IPoolAddressesProvider provider - ) external view override returns (AggregatedReserveIncentiveData[] memory) { - return _getReservesIncentivesData(provider); - } - - function _getReservesIncentivesData( - IPoolAddressesProvider provider - ) private view returns (AggregatedReserveIncentiveData[] memory) { - IPool pool = IPool(provider.getPool()); - address[] memory reserves = pool.getReservesList(); - AggregatedReserveIncentiveData[] - memory reservesIncentiveData = new AggregatedReserveIncentiveData[](reserves.length); - // Iterate through the reserves to get all the information from the (a/s/v) Tokens - for (uint256 i = 0; i < reserves.length; i++) { - AggregatedReserveIncentiveData memory reserveIncentiveData = reservesIncentiveData[i]; - reserveIncentiveData.underlyingAsset = reserves[i]; - - DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); - - // Get aTokens rewards information - IRewardsController aTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) - ); - RewardInfo[] memory aRewardsInformation; - if (address(aTokenIncentiveController) != address(0)) { - address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( - baseData.aTokenAddress - ); - - aRewardsInformation = new RewardInfo[](aTokenRewardAddresses.length); - for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { - RewardInfo memory rewardInformation; - rewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; - - ( - rewardInformation.tokenIncentivesIndex, - rewardInformation.emissionPerSecond, - rewardInformation.incentivesLastUpdateTimestamp, - rewardInformation.emissionEndTimestamp - ) = aTokenIncentiveController.getRewardsData( - baseData.aTokenAddress, - rewardInformation.rewardTokenAddress - ); - - rewardInformation.precision = aTokenIncentiveController.getAssetDecimals( - baseData.aTokenAddress - ); - rewardInformation.rewardTokenDecimals = IERC20Detailed( - rewardInformation.rewardTokenAddress - ).decimals(); - rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) - .symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - rewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( - rewardInformation.rewardTokenAddress - ); - rewardInformation.priceFeedDecimals = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).decimals(); - rewardInformation.rewardPriceFeed = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).latestAnswer(); - - aRewardsInformation[j] = rewardInformation; - } - } - - reserveIncentiveData.aIncentiveData = IncentiveData( - baseData.aTokenAddress, - address(aTokenIncentiveController), - aRewardsInformation - ); - - // Get vTokens rewards information - IRewardsController vTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) - ); - RewardInfo[] memory vRewardsInformation; - if (address(vTokenIncentiveController) != address(0)) { - address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( - baseData.variableDebtTokenAddress - ); - vRewardsInformation = new RewardInfo[](vTokenRewardAddresses.length); - for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { - RewardInfo memory rewardInformation; - rewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; - - ( - rewardInformation.tokenIncentivesIndex, - rewardInformation.emissionPerSecond, - rewardInformation.incentivesLastUpdateTimestamp, - rewardInformation.emissionEndTimestamp - ) = vTokenIncentiveController.getRewardsData( - baseData.variableDebtTokenAddress, - rewardInformation.rewardTokenAddress - ); - - rewardInformation.precision = vTokenIncentiveController.getAssetDecimals( - baseData.variableDebtTokenAddress - ); - rewardInformation.rewardTokenDecimals = IERC20Detailed( - rewardInformation.rewardTokenAddress - ).decimals(); - rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) - .symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - rewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( - rewardInformation.rewardTokenAddress - ); - rewardInformation.priceFeedDecimals = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).decimals(); - rewardInformation.rewardPriceFeed = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).latestAnswer(); - - vRewardsInformation[j] = rewardInformation; - } - } - - reserveIncentiveData.vIncentiveData = IncentiveData( - baseData.variableDebtTokenAddress, - address(vTokenIncentiveController), - vRewardsInformation - ); - } - - return (reservesIncentiveData); - } - - function getUserReservesIncentivesData( - IPoolAddressesProvider provider, - address user - ) external view override returns (UserReserveIncentiveData[] memory) { - return _getUserReservesIncentivesData(provider, user); - } - - function _getUserReservesIncentivesData( - IPoolAddressesProvider provider, - address user - ) private view returns (UserReserveIncentiveData[] memory) { - IPool pool = IPool(provider.getPool()); - address[] memory reserves = pool.getReservesList(); - - UserReserveIncentiveData[] memory userReservesIncentivesData = new UserReserveIncentiveData[]( - user != address(0) ? reserves.length : 0 - ); - - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); - - // user reserve data - userReservesIncentivesData[i].underlyingAsset = reserves[i]; - - IRewardsController aTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) - ); - if (address(aTokenIncentiveController) != address(0)) { - // get all rewards information from the asset - address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( - baseData.aTokenAddress - ); - UserRewardInfo[] memory aUserRewardsInformation = new UserRewardInfo[]( - aTokenRewardAddresses.length - ); - for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { - UserRewardInfo memory userRewardInformation; - userRewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; - - userRewardInformation.tokenIncentivesUserIndex = aTokenIncentiveController - .getUserAssetIndex( - user, - baseData.aTokenAddress, - userRewardInformation.rewardTokenAddress - ); - - userRewardInformation.userUnclaimedRewards = aTokenIncentiveController - .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); - userRewardInformation.rewardTokenDecimals = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).decimals(); - userRewardInformation.rewardTokenSymbol = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - userRewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( - userRewardInformation.rewardTokenAddress - ); - userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).decimals(); - userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).latestAnswer(); - - aUserRewardsInformation[j] = userRewardInformation; - } - - userReservesIncentivesData[i].aTokenIncentivesUserData = UserIncentiveData( - baseData.aTokenAddress, - address(aTokenIncentiveController), - aUserRewardsInformation - ); - } - - // variable debt token - IRewardsController vTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) - ); - if (address(vTokenIncentiveController) != address(0)) { - // get all rewards information from the asset - address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( - baseData.variableDebtTokenAddress - ); - UserRewardInfo[] memory vUserRewardsInformation = new UserRewardInfo[]( - vTokenRewardAddresses.length - ); - for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { - UserRewardInfo memory userRewardInformation; - userRewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; - - userRewardInformation.tokenIncentivesUserIndex = vTokenIncentiveController - .getUserAssetIndex( - user, - baseData.variableDebtTokenAddress, - userRewardInformation.rewardTokenAddress - ); - - userRewardInformation.userUnclaimedRewards = vTokenIncentiveController - .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); - userRewardInformation.rewardTokenDecimals = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).decimals(); - userRewardInformation.rewardTokenSymbol = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - userRewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( - userRewardInformation.rewardTokenAddress - ); - userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).decimals(); - userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).latestAnswer(); - - vUserRewardsInformation[j] = userRewardInformation; - } - - userReservesIncentivesData[i].vTokenIncentivesUserData = UserIncentiveData( - baseData.variableDebtTokenAddress, - address(aTokenIncentiveController), - vUserRewardsInformation - ); - } - } - - return (userReservesIncentivesData); - } -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol deleted file mode 100644 index fa24a0a1..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/SafeCast.sol +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) -pragma solidity ^0.8.10; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, 'SafeCast: value must be positive'); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require( - value >= type(int128).min && value <= type(int128).max, - "SafeCast: value doesn't fit in 128 bits" - ); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require( - value >= type(int64).min && value <= type(int64).max, - "SafeCast: value doesn't fit in 64 bits" - ); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require( - value >= type(int32).min && value <= type(int32).max, - "SafeCast: value doesn't fit in 32 bits" - ); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require( - value >= type(int16).min && value <= type(int16).max, - "SafeCast: value doesn't fit in 16 bits" - ); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require( - value >= type(int8).min && value <= type(int8).max, - "SafeCast: value doesn't fit in 8 bits" - ); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol deleted file mode 100644 index 79a1829d..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/UiIncentiveDataProviderV3.sol +++ /dev/null @@ -1,294 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../interfaces/IPool.sol'; -import {IncentivizedERC20} from '../protocol/tokenization/base/IncentivizedERC20.sol'; -import {UserConfiguration} from '../../contracts/protocol/libraries/configuration/UserConfiguration.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; -import {IRewardsController} from '../rewards/interfaces/IRewardsController.sol'; -import {IEACAggregatorProxy} from './interfaces/IEACAggregatorProxy.sol'; -import {IUiIncentiveDataProviderV3} from './interfaces/IUiIncentiveDataProviderV3.sol'; - -contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { - using UserConfiguration for DataTypes.UserConfigurationMap; - - function getFullReservesIncentiveData( - IPoolAddressesProvider provider, - address user - ) - external - view - override - returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory) - { - return (_getReservesIncentivesData(provider), _getUserReservesIncentivesData(provider, user)); - } - - function getReservesIncentivesData( - IPoolAddressesProvider provider - ) external view override returns (AggregatedReserveIncentiveData[] memory) { - return _getReservesIncentivesData(provider); - } - - function _getReservesIncentivesData( - IPoolAddressesProvider provider - ) private view returns (AggregatedReserveIncentiveData[] memory) { - IPool pool = IPool(provider.getPool()); - address[] memory reserves = pool.getReservesList(); - AggregatedReserveIncentiveData[] - memory reservesIncentiveData = new AggregatedReserveIncentiveData[](reserves.length); - // Iterate through the reserves to get all the information from the (a/s/v) Tokens - for (uint256 i = 0; i < reserves.length; i++) { - AggregatedReserveIncentiveData memory reserveIncentiveData = reservesIncentiveData[i]; - reserveIncentiveData.underlyingAsset = reserves[i]; - - DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); - - // Get aTokens rewards information - IRewardsController aTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) - ); - RewardInfo[] memory aRewardsInformation; - if (address(aTokenIncentiveController) != address(0)) { - address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( - baseData.aTokenAddress - ); - - aRewardsInformation = new RewardInfo[](aTokenRewardAddresses.length); - for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { - RewardInfo memory rewardInformation; - rewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; - - ( - rewardInformation.tokenIncentivesIndex, - rewardInformation.emissionPerSecond, - rewardInformation.incentivesLastUpdateTimestamp, - rewardInformation.emissionEndTimestamp - ) = aTokenIncentiveController.getRewardsData( - baseData.aTokenAddress, - rewardInformation.rewardTokenAddress - ); - - rewardInformation.precision = aTokenIncentiveController.getAssetDecimals( - baseData.aTokenAddress - ); - rewardInformation.rewardTokenDecimals = IERC20Detailed( - rewardInformation.rewardTokenAddress - ).decimals(); - rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) - .symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - rewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( - rewardInformation.rewardTokenAddress - ); - rewardInformation.priceFeedDecimals = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).decimals(); - rewardInformation.rewardPriceFeed = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).latestAnswer(); - - aRewardsInformation[j] = rewardInformation; - } - } - - reserveIncentiveData.aIncentiveData = IncentiveData( - baseData.aTokenAddress, - address(aTokenIncentiveController), - aRewardsInformation - ); - - // Get vTokens rewards information - IRewardsController vTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) - ); - RewardInfo[] memory vRewardsInformation; - if (address(vTokenIncentiveController) != address(0)) { - address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( - baseData.variableDebtTokenAddress - ); - vRewardsInformation = new RewardInfo[](vTokenRewardAddresses.length); - for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { - RewardInfo memory rewardInformation; - rewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; - - ( - rewardInformation.tokenIncentivesIndex, - rewardInformation.emissionPerSecond, - rewardInformation.incentivesLastUpdateTimestamp, - rewardInformation.emissionEndTimestamp - ) = vTokenIncentiveController.getRewardsData( - baseData.variableDebtTokenAddress, - rewardInformation.rewardTokenAddress - ); - - rewardInformation.precision = vTokenIncentiveController.getAssetDecimals( - baseData.variableDebtTokenAddress - ); - rewardInformation.rewardTokenDecimals = IERC20Detailed( - rewardInformation.rewardTokenAddress - ).decimals(); - rewardInformation.rewardTokenSymbol = IERC20Detailed(rewardInformation.rewardTokenAddress) - .symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - rewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( - rewardInformation.rewardTokenAddress - ); - rewardInformation.priceFeedDecimals = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).decimals(); - rewardInformation.rewardPriceFeed = IEACAggregatorProxy( - rewardInformation.rewardOracleAddress - ).latestAnswer(); - - vRewardsInformation[j] = rewardInformation; - } - } - - reserveIncentiveData.vIncentiveData = IncentiveData( - baseData.variableDebtTokenAddress, - address(vTokenIncentiveController), - vRewardsInformation - ); - } - - return (reservesIncentiveData); - } - - function getUserReservesIncentivesData( - IPoolAddressesProvider provider, - address user - ) external view override returns (UserReserveIncentiveData[] memory) { - return _getUserReservesIncentivesData(provider, user); - } - - function _getUserReservesIncentivesData( - IPoolAddressesProvider provider, - address user - ) private view returns (UserReserveIncentiveData[] memory) { - IPool pool = IPool(provider.getPool()); - address[] memory reserves = pool.getReservesList(); - - UserReserveIncentiveData[] memory userReservesIncentivesData = new UserReserveIncentiveData[]( - user != address(0) ? reserves.length : 0 - ); - - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); - - // user reserve data - userReservesIncentivesData[i].underlyingAsset = reserves[i]; - - IRewardsController aTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.aTokenAddress).getIncentivesController()) - ); - if (address(aTokenIncentiveController) != address(0)) { - // get all rewards information from the asset - address[] memory aTokenRewardAddresses = aTokenIncentiveController.getRewardsByAsset( - baseData.aTokenAddress - ); - UserRewardInfo[] memory aUserRewardsInformation = new UserRewardInfo[]( - aTokenRewardAddresses.length - ); - for (uint256 j = 0; j < aTokenRewardAddresses.length; ++j) { - UserRewardInfo memory userRewardInformation; - userRewardInformation.rewardTokenAddress = aTokenRewardAddresses[j]; - - userRewardInformation.tokenIncentivesUserIndex = aTokenIncentiveController - .getUserAssetIndex( - user, - baseData.aTokenAddress, - userRewardInformation.rewardTokenAddress - ); - - userRewardInformation.userUnclaimedRewards = aTokenIncentiveController - .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); - userRewardInformation.rewardTokenDecimals = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).decimals(); - userRewardInformation.rewardTokenSymbol = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - userRewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( - userRewardInformation.rewardTokenAddress - ); - userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).decimals(); - userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).latestAnswer(); - - aUserRewardsInformation[j] = userRewardInformation; - } - - userReservesIncentivesData[i].aTokenIncentivesUserData = UserIncentiveData( - baseData.aTokenAddress, - address(aTokenIncentiveController), - aUserRewardsInformation - ); - } - - // variable debt token - IRewardsController vTokenIncentiveController = IRewardsController( - address(IncentivizedERC20(baseData.variableDebtTokenAddress).getIncentivesController()) - ); - if (address(vTokenIncentiveController) != address(0)) { - // get all rewards information from the asset - address[] memory vTokenRewardAddresses = vTokenIncentiveController.getRewardsByAsset( - baseData.variableDebtTokenAddress - ); - UserRewardInfo[] memory vUserRewardsInformation = new UserRewardInfo[]( - vTokenRewardAddresses.length - ); - for (uint256 j = 0; j < vTokenRewardAddresses.length; ++j) { - UserRewardInfo memory userRewardInformation; - userRewardInformation.rewardTokenAddress = vTokenRewardAddresses[j]; - - userRewardInformation.tokenIncentivesUserIndex = vTokenIncentiveController - .getUserAssetIndex( - user, - baseData.variableDebtTokenAddress, - userRewardInformation.rewardTokenAddress - ); - - userRewardInformation.userUnclaimedRewards = vTokenIncentiveController - .getUserAccruedRewards(user, userRewardInformation.rewardTokenAddress); - userRewardInformation.rewardTokenDecimals = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).decimals(); - userRewardInformation.rewardTokenSymbol = IERC20Detailed( - userRewardInformation.rewardTokenAddress - ).symbol(); - - // Get price of reward token from Chainlink Proxy Oracle - userRewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( - userRewardInformation.rewardTokenAddress - ); - userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).decimals(); - userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( - userRewardInformation.rewardOracleAddress - ).latestAnswer(); - - vUserRewardsInformation[j] = userRewardInformation; - } - - userReservesIncentivesData[i].vTokenIncentivesUserData = UserIncentiveData( - baseData.variableDebtTokenAddress, - address(aTokenIncentiveController), - vUserRewardsInformation - ); - } - } - - return (userReservesIncentivesData); - } -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol deleted file mode 100644 index c89baee6..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol deleted file mode 100644 index 3402953f..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/helpers/interfaces/IUiIncentiveDataProviderV3.sol +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; - -interface IUiIncentiveDataProviderV3 { - struct AggregatedReserveIncentiveData { - address underlyingAsset; - IncentiveData aIncentiveData; - IncentiveData vIncentiveData; - } - - struct IncentiveData { - address tokenAddress; - address incentiveControllerAddress; - RewardInfo[] rewardsTokenInformation; - } - - struct RewardInfo { - string rewardTokenSymbol; - address rewardTokenAddress; - address rewardOracleAddress; - uint256 emissionPerSecond; - uint256 incentivesLastUpdateTimestamp; - uint256 tokenIncentivesIndex; - uint256 emissionEndTimestamp; - int256 rewardPriceFeed; - uint8 rewardTokenDecimals; - uint8 precision; - uint8 priceFeedDecimals; - } - - struct UserReserveIncentiveData { - address underlyingAsset; - UserIncentiveData aTokenIncentivesUserData; - UserIncentiveData vTokenIncentivesUserData; - } - - struct UserIncentiveData { - address tokenAddress; - address incentiveControllerAddress; - UserRewardInfo[] userRewardsInformation; - } - - struct UserRewardInfo { - string rewardTokenSymbol; - address rewardOracleAddress; - address rewardTokenAddress; - uint256 userUnclaimedRewards; - uint256 tokenIncentivesUserIndex; - int256 rewardPriceFeed; - uint8 priceFeedDecimals; - uint8 rewardTokenDecimals; - } - - function getReservesIncentivesData( - IPoolAddressesProvider provider - ) external view returns (AggregatedReserveIncentiveData[] memory); - - function getUserReservesIncentivesData( - IPoolAddressesProvider provider, - address user - ) external view returns (UserReserveIncentiveData[] memory); - - // generic method with full data - function getFullReservesIncentiveData( - IPoolAddressesProvider provider, - address user - ) - external - view - returns (AggregatedReserveIncentiveData[] memory, UserReserveIncentiveData[] memory); -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol deleted file mode 100644 index 69eca346..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IACLManager.sol +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IACLManager - * @author Aave - * @notice Defines the basic interface for the ACL Manager - */ -interface IACLManager { - /** - * @notice Returns the contract address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the identifier of the PoolAdmin role - * @return The id of the PoolAdmin role - */ - function POOL_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the EmergencyAdmin role - * @return The id of the EmergencyAdmin role - */ - function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the RiskAdmin role - * @return The id of the RiskAdmin role - */ - function RISK_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the FlashBorrower role - * @return The id of the FlashBorrower role - */ - function FLASH_BORROWER_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the Bridge role - * @return The id of the Bridge role - */ - function BRIDGE_ROLE() external view returns (bytes32); - - /** - * @notice Returns the identifier of the AssetListingAdmin role - * @return The id of the AssetListingAdmin role - */ - function ASSET_LISTING_ADMIN_ROLE() external view returns (bytes32); - - /** - * @notice Set the role as admin of a specific role. - * @dev By default the admin role for all roles is `DEFAULT_ADMIN_ROLE`. - * @param role The role to be managed by the admin role - * @param adminRole The admin role - */ - function setRoleAdmin(bytes32 role, bytes32 adminRole) external; - - /** - * @notice Adds a new admin as PoolAdmin - * @param admin The address of the new admin - */ - function addPoolAdmin(address admin) external; - - /** - * @notice Removes an admin as PoolAdmin - * @param admin The address of the admin to remove - */ - function removePoolAdmin(address admin) external; - - /** - * @notice Returns true if the address is PoolAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is PoolAdmin, false otherwise - */ - function isPoolAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as EmergencyAdmin - * @param admin The address of the new admin - */ - function addEmergencyAdmin(address admin) external; - - /** - * @notice Removes an admin as EmergencyAdmin - * @param admin The address of the admin to remove - */ - function removeEmergencyAdmin(address admin) external; - - /** - * @notice Returns true if the address is EmergencyAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is EmergencyAdmin, false otherwise - */ - function isEmergencyAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new admin as RiskAdmin - * @param admin The address of the new admin - */ - function addRiskAdmin(address admin) external; - - /** - * @notice Removes an admin as RiskAdmin - * @param admin The address of the admin to remove - */ - function removeRiskAdmin(address admin) external; - - /** - * @notice Returns true if the address is RiskAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is RiskAdmin, false otherwise - */ - function isRiskAdmin(address admin) external view returns (bool); - - /** - * @notice Adds a new address as FlashBorrower - * @param borrower The address of the new FlashBorrower - */ - function addFlashBorrower(address borrower) external; - - /** - * @notice Removes an address as FlashBorrower - * @param borrower The address of the FlashBorrower to remove - */ - function removeFlashBorrower(address borrower) external; - - /** - * @notice Returns true if the address is FlashBorrower, false otherwise - * @param borrower The address to check - * @return True if the given address is FlashBorrower, false otherwise - */ - function isFlashBorrower(address borrower) external view returns (bool); - - /** - * @notice Adds a new address as Bridge - * @param bridge The address of the new Bridge - */ - function addBridge(address bridge) external; - - /** - * @notice Removes an address as Bridge - * @param bridge The address of the bridge to remove - */ - function removeBridge(address bridge) external; - - /** - * @notice Returns true if the address is Bridge, false otherwise - * @param bridge The address to check - * @return True if the given address is Bridge, false otherwise - */ - function isBridge(address bridge) external view returns (bool); - - /** - * @notice Adds a new admin as AssetListingAdmin - * @param admin The address of the new admin - */ - function addAssetListingAdmin(address admin) external; - - /** - * @notice Removes an admin as AssetListingAdmin - * @param admin The address of the admin to remove - */ - function removeAssetListingAdmin(address admin) external; - - /** - * @notice Returns true if the address is AssetListingAdmin, false otherwise - * @param admin The address to check - * @return True if the given address is AssetListingAdmin, false otherwise - */ - function isAssetListingAdmin(address admin) external view returns (bool); -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol deleted file mode 100644 index 4bca0483..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/protocol/tokenization/base/IncentivizedERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol'; -import {IERC20} from '../../../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IERC20Detailed} from '../../../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; -import {WadRayMath} from '../../libraries/math/WadRayMath.sol'; -import {Errors} from '../../libraries/helpers/Errors.sol'; -import {IAaveIncentivesController} from '../../../interfaces/IAaveIncentivesController.sol'; -import {IPoolAddressesProvider} from '../../../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../../../interfaces/IPool.sol'; -import {IACLManager} from '../../../interfaces/IACLManager.sol'; - -/** - * @title IncentivizedERC20 - * @author Aave, inspired by the Openzeppelin ERC20 implementation - * @notice Basic ERC20 implementation - */ -abstract contract IncentivizedERC20 is Context, IERC20Detailed { - using WadRayMath for uint256; - using SafeCast for uint256; - - /** - * @dev Only pool admin can call functions marked by this modifier. - */ - modifier onlyPoolAdmin() { - IACLManager aclManager = IACLManager(_addressesProvider.getACLManager()); - require(aclManager.isPoolAdmin(msg.sender), Errors.CALLER_NOT_POOL_ADMIN); - _; - } - - /** - * @dev Only pool can call functions marked by this modifier. - */ - modifier onlyPool() { - require(_msgSender() == address(POOL), Errors.CALLER_MUST_BE_POOL); - _; - } - - /** - * @dev UserState - additionalData is a flexible field. - * ATokens and VariableDebtTokens use this field store the index of the - * user's last supply/withdrawal/borrow/repayment. - */ - struct UserState { - uint128 balance; - uint128 additionalData; - } - // Map of users address and their state data (userAddress => userStateData) - mapping(address => UserState) internal _userState; - - // Map of allowances (delegator => delegatee => allowanceAmount) - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 internal _totalSupply; - string private _name; - string private _symbol; - uint8 private _decimals; - IAaveIncentivesController internal _incentivesController; - IPoolAddressesProvider internal immutable _addressesProvider; - IPool public immutable POOL; - - /** - * @dev Constructor. - * @param pool The reference to the main Pool contract - * @param name_ The name of the token - * @param symbol_ The symbol of the token - * @param decimals_ The number of decimals of the token - */ - constructor(IPool pool, string memory name_, string memory symbol_, uint8 decimals_) { - _addressesProvider = pool.ADDRESSES_PROVIDER(); - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - POOL = pool; - } - - /// @inheritdoc IERC20Detailed - function name() public view override returns (string memory) { - return _name; - } - - /// @inheritdoc IERC20Detailed - function symbol() external view override returns (string memory) { - return _symbol; - } - - /// @inheritdoc IERC20Detailed - function decimals() external view override returns (uint8) { - return _decimals; - } - - /// @inheritdoc IERC20 - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /// @inheritdoc IERC20 - function balanceOf(address account) public view virtual override returns (uint256) { - return _userState[account].balance; - } - - /** - * @notice Returns the address of the Incentives Controller contract - * @return The address of the Incentives Controller - */ - function getIncentivesController() external view virtual returns (IAaveIncentivesController) { - return _incentivesController; - } - - /** - * @notice Sets a new Incentives Controller - * @param controller the new Incentives controller - */ - function setIncentivesController(IAaveIncentivesController controller) external onlyPoolAdmin { - _incentivesController = controller; - } - - /// @inheritdoc IERC20 - function transfer(address recipient, uint256 amount) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _transfer(_msgSender(), recipient, castAmount); - return true; - } - - /// @inheritdoc IERC20 - function allowance( - address owner, - address spender - ) external view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /// @inheritdoc IERC20 - function approve(address spender, uint256 amount) external virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /// @inheritdoc IERC20 - function transferFrom( - address sender, - address recipient, - uint256 amount - ) external virtual override returns (bool) { - uint128 castAmount = amount.toUint128(); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - castAmount); - _transfer(sender, recipient, castAmount); - return true; - } - - /** - * @notice Increases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param addedValue The amount being added to the allowance - * @return `true` - */ - function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - /** - * @notice Decreases the allowance of spender to spend _msgSender() tokens - * @param spender The user allowed to spend on behalf of _msgSender() - * @param subtractedValue The amount being subtracted to the allowance - * @return `true` - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) external virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); - return true; - } - - /** - * @notice Transfers tokens between two users and apply incentives if defined. - * @param sender The source address - * @param recipient The destination address - * @param amount The amount getting transferred - */ - function _transfer(address sender, address recipient, uint128 amount) internal virtual { - uint128 oldSenderBalance = _userState[sender].balance; - _userState[sender].balance = oldSenderBalance - amount; - uint128 oldRecipientBalance = _userState[recipient].balance; - _userState[recipient].balance = oldRecipientBalance + amount; - - IAaveIncentivesController incentivesControllerLocal = _incentivesController; - if (address(incentivesControllerLocal) != address(0)) { - uint256 currentTotalSupply = _totalSupply; - incentivesControllerLocal.handleAction(sender, currentTotalSupply, oldSenderBalance); - if (sender != recipient) { - incentivesControllerLocal.handleAction(recipient, currentTotalSupply, oldRecipientBalance); - } - } - } - - /** - * @notice Approve `spender` to use `amount` of `owner`s balance - * @param owner The address owning the tokens - * @param spender The address approved for spending - * @param amount The amount of tokens to approve spending of - */ - function _approve(address owner, address spender, uint256 amount) internal virtual { - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @notice Update the name of the token - * @param newName The new name for the token - */ - function _setName(string memory newName) internal { - _name = newName; - } - - /** - * @notice Update the symbol for the token - * @param newSymbol The new symbol for the token - */ - function _setSymbol(string memory newSymbol) internal { - _symbol = newSymbol; - } - - /** - * @notice Update the number of decimals for the token - * @param newDecimals The new number of decimals for the token - */ - function _setDecimals(uint8 newDecimals) internal { - _decimals = newDecimals; - } -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol deleted file mode 100644 index cdb2ac29..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsController.sol +++ /dev/null @@ -1,203 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IRewardsDistributor} from './IRewardsDistributor.sol'; -import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; -import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; - -/** - * @title IRewardsController - * @author Aave - * @notice Defines the basic interface for a Rewards Controller. - */ -interface IRewardsController is IRewardsDistributor { - /** - * @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user - * @param user The address of the user - * @param claimer The address of the claimer - */ - event ClaimerSet(address indexed user, address indexed claimer); - - /** - * @dev Emitted when rewards are claimed - * @param user The address of the user rewards has been claimed on behalf of - * @param reward The address of the token reward is claimed - * @param to The address of the receiver of the rewards - * @param claimer The address of the claimer - * @param amount The amount of rewards claimed - */ - event RewardsClaimed( - address indexed user, - address indexed reward, - address indexed to, - address claimer, - uint256 amount - ); - - /** - * @dev Emitted when a transfer strategy is installed for the reward distribution - * @param reward The address of the token reward - * @param transferStrategy The address of TransferStrategy contract - */ - event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy); - - /** - * @dev Emitted when the reward oracle is updated - * @param reward The address of the token reward - * @param rewardOracle The address of oracle - */ - event RewardOracleUpdated(address indexed reward, address indexed rewardOracle); - - /** - * @dev Whitelists an address to claim the rewards on behalf of another address - * @param user The address of the user - * @param claimer The address of the claimer - */ - function setClaimer(address user, address claimer) external; - - /** - * @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer - * @param reward The address of the reward token - * @param transferStrategy The address of the TransferStrategy logic contract - */ - function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external; - - /** - * @dev Sets an Aave Oracle contract to enforce rewards with a source of value. - * @notice At the moment of reward configuration, the Incentives Controller performs - * a check to see if the reward asset oracle is compatible with IEACAggregator proxy. - * This check is enforced for integrators to be able to show incentives at - * the current Aave UI without the need to setup an external price registry - * @param reward The address of the reward to set the price aggregator - * @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface - */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; - - /** - * @dev Get the price aggregator oracle address - * @param reward The address of the reward - * @return The price oracle of the reward - */ - function getRewardOracle(address reward) external view returns (address); - - /** - * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) - * @param user The address of the user - * @return The claimer address - */ - function getClaimer(address user) external view returns (address); - - /** - * @dev Returns the Transfer Strategy implementation contract address being used for a reward address - * @param reward The address of the reward - * @return The address of the TransferStrategy contract - */ - function getTransferStrategy(address reward) external view returns (address); - - /** - * @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution. - * @param config The assets configuration input, the list of structs contains the following fields: - * uint104 emissionPerSecond: The emission per second following rewards unit decimals. - * uint256 totalSupply: The total supply of the asset to incentivize - * uint40 distributionEnd: The end of the distribution of the incentives for an asset - * address asset: The asset address to incentivize - * address reward: The reward token address - * ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic. - * IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. - * Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible. - */ - function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; - - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - **/ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; - - /** - * @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets List of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewards( - address[] calldata assets, - uint256 amount, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The - * caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsOnBehalf( - address[] calldata assets, - uint256 amount, - address user, - address to, - address reward - ) external returns (uint256); - - /** - * @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param amount The amount of rewards to claim - * @param reward The address of the reward token - * @return The amount of rewards claimed - **/ - function claimRewardsToSelf( - address[] calldata assets, - uint256 amount, - address reward - ) external returns (uint256); - - /** - * @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList" - **/ - function claimAllRewards( - address[] calldata assets, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must - * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager - * @param assets The list of assets to check eligible distributions before claiming rewards - * @param user The address to check and claim rewards - * @param to The address that will be receiving the rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsOnBehalf( - address[] calldata assets, - address user, - address to - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); - - /** - * @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards - * @param assets The list of assets to check eligible distributions before claiming rewards - * @return rewardsList List of addresses of the reward tokens - * @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList" - **/ - function claimAllRewardsToSelf( - address[] calldata assets - ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts); -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol deleted file mode 100644 index 5cb58856..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/IRewardsDistributor.sol +++ /dev/null @@ -1,177 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/** - * @title IRewardsDistributor - * @author Aave - * @notice Defines the basic interface for a Rewards Distributor. - */ -interface IRewardsDistributor { - /** - * @dev Emitted when the configuration of the rewards of an asset is updated. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param oldEmission The old emissions per second value of the reward distribution - * @param newEmission The new emissions per second value of the reward distribution - * @param oldDistributionEnd The old end timestamp of the reward distribution - * @param newDistributionEnd The new end timestamp of the reward distribution - * @param assetIndex The index of the asset distribution - */ - event AssetConfigUpdated( - address indexed asset, - address indexed reward, - uint256 oldEmission, - uint256 newEmission, - uint256 oldDistributionEnd, - uint256 newDistributionEnd, - uint256 assetIndex - ); - - /** - * @dev Emitted when rewards of an asset are accrued on behalf of a user. - * @param asset The address of the incentivized asset - * @param reward The address of the reward token - * @param user The address of the user that rewards are accrued on behalf of - * @param assetIndex The index of the asset distribution - * @param userIndex The index of the asset distribution on behalf of the user - * @param rewardsAccrued The amount of rewards accrued - */ - event Accrued( - address indexed asset, - address indexed reward, - address indexed user, - uint256 assetIndex, - uint256 userIndex, - uint256 rewardsAccrued - ); - - /** - * @dev Sets the end date for the distribution - * @param asset The asset to incentivize - * @param reward The reward token that incentives the asset - * @param newDistributionEnd The end date of the incentivization, in unix time format - **/ - function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external; - - /** - * @dev Sets the emission per second of a set of reward distributions - * @param asset The asset is being incentivized - * @param rewards List of reward addresses are being distributed - * @param newEmissionsPerSecond List of new reward emissions per second - */ - function setEmissionPerSecond( - address asset, - address[] calldata rewards, - uint88[] calldata newEmissionsPerSecond - ) external; - - /** - * @dev Gets the end date for the distribution - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The timestamp with the end of the distribution, in unix time format - **/ - function getDistributionEnd(address asset, address reward) external view returns (uint256); - - /** - * @dev Returns the index of a user on a reward distribution - * @param user Address of the user - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The current user asset index, not including new distributions - **/ - function getUserAssetIndex( - address user, - address asset, - address reward - ) external view returns (uint256); - - /** - * @dev Returns the configuration of the distribution reward for a certain asset - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The index of the asset distribution - * @return The emission per second of the reward distribution - * @return The timestamp of the last update of the index - * @return The timestamp of the distribution end - **/ - function getRewardsData( - address asset, - address reward - ) external view returns (uint256, uint256, uint256, uint256); - - /** - * @dev Calculates the next value of an specific distribution index, with validations. - * @param asset The incentivized asset - * @param reward The reward token of the incentivized asset - * @return The old index of the asset distribution - * @return The new index of the asset distribution - **/ - function getAssetIndex(address asset, address reward) external view returns (uint256, uint256); - - /** - * @dev Returns the list of available reward token addresses of an incentivized asset - * @param asset The incentivized asset - * @return List of rewards addresses of the input asset - **/ - function getRewardsByAsset(address asset) external view returns (address[] memory); - - /** - * @dev Returns the list of available reward addresses - * @return List of rewards supported in this contract - **/ - function getRewardsList() external view returns (address[] memory); - - /** - * @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution. - * @param user The address of the user - * @param reward The address of the reward token - * @return Unclaimed rewards, not including new distributions - **/ - function getUserAccruedRewards(address user, address reward) external view returns (uint256); - - /** - * @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards. - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @param reward The address of the reward token - * @return The rewards amount - **/ - function getUserRewards( - address[] calldata assets, - address user, - address reward - ) external view returns (uint256); - - /** - * @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards - * @param assets List of incentivized assets to check eligible distributions - * @param user The address of the user - * @return The list of reward addresses - * @return The list of unclaimed amount of rewards - **/ - function getAllUserRewards( - address[] calldata assets, - address user - ) external view returns (address[] memory, uint256[] memory); - - /** - * @dev Returns the decimals of an asset to calculate the distribution delta - * @param asset The address to retrieve decimals - * @return The decimals of an underlying asset - */ - function getAssetDecimals(address asset) external view returns (uint8); - - /** - * @dev Returns the address of the emission manager - * @return The address of the EmissionManager - */ - function EMISSION_MANAGER() external view returns (address); - - /** - * @dev Returns the address of the emission manager. - * Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead. - * @return The address of the EmissionManager - */ - function getEmissionManager() external view returns (address); -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol deleted file mode 100644 index d2848fef..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/interfaces/ITransferStrategyBase.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -interface ITransferStrategyBase { - event EmergencyWithdrawal( - address indexed caller, - address indexed token, - address indexed to, - uint256 amount - ); - - /** - * @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation - * @param to Account to transfer rewards - * @param reward Address of the reward token - * @param amount Amount to transfer to the "to" address parameter - * @return Returns true bool if transfer logic succeeds - */ - function performTransfer(address to, address reward, uint256 amount) external returns (bool); - - /** - * @return Returns the address of the Incentives Controller - */ - function getIncentivesController() external view returns (address); - - /** - * @return Returns the address of the Rewards admin - */ - function getRewardsAdmin() external view returns (address); - - /** - * @dev Perform an emergency token withdrawal only callable by the Rewards admin - * @param token Address of the token to withdraw funds from this contract - * @param to Address of the recipient of the withdrawal - * @param amount Amount of the withdrawal - */ - function emergencyWithdrawal(address token, address to, uint256 amount) external; -} diff --git a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol b/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol deleted file mode 100644 index 38fe87c5..00000000 --- a/downloads/LINEA/UI_INCENTIVE_DATA_PROVIDER/UiIncentiveDataProviderV3/src/contracts/rewards/libraries/RewardsDataTypes.sol +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; - -library RewardsDataTypes { - struct RewardsConfigInput { - uint88 emissionPerSecond; - uint256 totalSupply; - uint32 distributionEnd; - address asset; - address reward; - ITransferStrategyBase transferStrategy; - IEACAggregatorProxy rewardOracle; - } - - struct UserAssetBalance { - address asset; - uint256 userBalance; - uint256 totalSupply; - } - - struct UserData { - // Liquidity index of the reward distribution for the user - uint104 index; - // Amount of accrued rewards for the user since last user index update - uint128 accrued; - } - - struct RewardData { - // Liquidity index of the reward distribution - uint104 index; - // Amount of reward tokens distributed per second - uint88 emissionPerSecond; - // Timestamp of the last reward index update - uint32 lastUpdateTimestamp; - // The end of the distribution of rewards (in seconds) - uint32 distributionEnd; - // Map of user addresses and their rewards data (userAddress => userData) - mapping(address => UserData) usersData; - } - - struct AssetData { - // Map of reward token addresses and their data (rewardTokenAddress => rewardData) - mapping(address => RewardData) rewards; - // List of reward token addresses for the asset - mapping(uint128 => address) availableRewards; - // Count of reward tokens for the asset - uint128 availableRewardsCount; - // Number of decimals of the asset - uint8 decimals; - } -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER.sol deleted file mode 100644 index 2d973663..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER.sol +++ /dev/null @@ -1,4068 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol - -interface IERC20DetailedBytes is IERC20 { - function name() external view returns (bytes32); - - function symbol() external view returns (bytes32); - - function decimals() external view returns (uint8); -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol - -/** - * @title IPoolDataProvider - * @author Aave - * @notice Defines the basic interface of a PoolDataProvider - */ -interface IPoolDataProvider { - struct TokenData { - string symbol; - address tokenAddress; - } - - /** - * @notice Returns the address for the PoolAddressesProvider contract. - * @return The address for the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the list of the existing reserves in the pool. - * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. - * @return The list of reserves, pairs of symbols and addresses - */ - function getAllReservesTokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the list of the existing ATokens in the pool. - * @return The list of ATokens, pairs of symbols and addresses - */ - function getAllATokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the configuration data of the reserve - * @dev Not returning borrow and supply caps for compatibility, nor pause flag - * @param asset The address of the underlying asset of the reserve - * @return decimals The number of decimals of the reserve - * @return ltv The ltv of the reserve - * @return liquidationThreshold The liquidationThreshold of the reserve - * @return liquidationBonus The liquidationBonus of the reserve - * @return reserveFactor The reserveFactor of the reserve - * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise - * @return borrowingEnabled True if borrowing is enabled, false otherwise - * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise - * @return isActive True if it is active, false otherwise - * @return isFrozen True if it is frozen, false otherwise - */ - function getReserveConfigurationData( - address asset - ) - external - view - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ); - - /** - * @notice Returns the caps parameters of the reserve - * @param asset The address of the underlying asset of the reserve - * @return borrowCap The borrow cap of the reserve - * @return supplyCap The supply cap of the reserve - */ - function getReserveCaps( - address asset - ) external view returns (uint256 borrowCap, uint256 supplyCap); - - /** - * @notice Returns if the pool is paused - * @param asset The address of the underlying asset of the reserve - * @return isPaused True if the pool is paused, false otherwise - */ - function getPaused(address asset) external view returns (bool isPaused); - - /** - * @notice Returns the siloed borrowing flag - * @param asset The address of the underlying asset of the reserve - * @return True if the asset is siloed for borrowing - */ - function getSiloedBorrowing(address asset) external view returns (bool); - - /** - * @notice Returns the protocol fee on the liquidation bonus - * @param asset The address of the underlying asset of the reserve - * @return The protocol fee on liquidation - */ - function getLiquidationProtocolFee(address asset) external view returns (uint256); - - /** - * @notice Returns the unbacked mint cap of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The unbacked mint cap of the reserve - */ - function getUnbackedMintCap(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The debt ceiling of the reserve - */ - function getDebtCeiling(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling decimals - * @return The debt ceiling decimals - */ - function getDebtCeilingDecimals() external pure returns (uint256); - - /** - * @notice Returns the reserve data - * @param asset The address of the underlying asset of the reserve - * @return unbacked The amount of unbacked tokens - * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted - * @return totalAToken The total supply of the aToken - * @return totalStableDebt The total stable debt of the reserve - * @return totalVariableDebt The total variable debt of the reserve - * @return liquidityRate The liquidity rate of the reserve - * @return variableBorrowRate The variable borrow rate of the reserve - * @return stableBorrowRate The stable borrow rate of the reserve - * @return averageStableBorrowRate The average stable borrow rate of the reserve - * @return liquidityIndex The liquidity index of the reserve - * @return variableBorrowIndex The variable borrow index of the reserve - * @return lastUpdateTimestamp The timestamp of the last update of the reserve - */ - function getReserveData( - address asset - ) - external - view - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ); - - /** - * @notice Returns the total supply of aTokens for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total supply of the aToken - */ - function getATokenTotalSupply(address asset) external view returns (uint256); - - /** - * @notice Returns the total debt for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total debt for asset - */ - function getTotalDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the user data in a reserve - * @param asset The address of the underlying asset of the reserve - * @param user The address of the user - * @return currentATokenBalance The current AToken balance of the user - * @return currentStableDebt The current stable debt of the user - * @return currentVariableDebt The current variable debt of the user - * @return principalStableDebt The principal stable debt of the user - * @return scaledVariableDebt The scaled variable debt of the user - * @return stableBorrowRate The stable borrow rate of the user - * @return liquidityRate The liquidity rate of the reserve - * @return stableRateLastUpdated The timestamp of the last update of the user stable rate - * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false - * otherwise - */ - function getUserReserveData( - address asset, - address user - ) - external - view - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ); - - /** - * @notice Returns the token addresses of the reserve - * @param asset The address of the underlying asset of the reserve - * @return aTokenAddress The AToken address of the reserve - * @return stableDebtTokenAddress DEPRECATED in v3.2.0 - * @return variableDebtTokenAddress The VariableDebtToken address of the reserve - */ - function getReserveTokensAddresses( - address asset - ) - external - view - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ); - - /** - * @notice Returns the address of the Interest Rate strategy - * @param asset The address of the underlying asset of the reserve - * @return irStrategyAddress The address of the Interest Rate strategy - */ - function getInterestRateStrategyAddress( - address asset - ) external view returns (address irStrategyAddress); - - /** - * @notice Returns whether the reserve has FlashLoans enabled or disabled - * @param asset The address of the underlying asset of the reserve - * @return True if FlashLoans are enabled, false otherwise - */ - function getFlashLoanEnabled(address asset) external view returns (bool); - - /** - * @notice Returns whether virtual accounting is enabled/not for a reserve - * @param asset The address of the underlying asset of the reserve - * @return True if active, false otherwise - */ - function getIsVirtualAccActive(address asset) external view returns (bool); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint256); -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol - -interface IUiPoolDataProviderV3 { - struct AggregatedReserveData { - address underlyingAsset; - string name; - string symbol; - uint256 decimals; - uint256 baseLTVasCollateral; - uint256 reserveLiquidationThreshold; - uint256 reserveLiquidationBonus; - uint256 reserveFactor; - bool usageAsCollateralEnabled; - bool borrowingEnabled; - bool isActive; - bool isFrozen; - // base data - uint128 liquidityIndex; - uint128 variableBorrowIndex; - uint128 liquidityRate; - uint128 variableBorrowRate; - uint40 lastUpdateTimestamp; - address aTokenAddress; - address variableDebtTokenAddress; - address interestRateStrategyAddress; - // - uint256 availableLiquidity; - uint256 totalScaledVariableDebt; - uint256 priceInMarketReferenceCurrency; - address priceOracle; - uint256 variableRateSlope1; - uint256 variableRateSlope2; - uint256 baseVariableBorrowRate; - uint256 optimalUsageRatio; - // v3 only - bool isPaused; - bool isSiloedBorrowing; - uint128 accruedToTreasury; - uint128 unbacked; - uint128 isolationModeTotalDebt; - bool flashLoanEnabled; - // - uint256 debtCeiling; - uint256 debtCeilingDecimals; - uint256 borrowCap; - uint256 supplyCap; - bool borrowableInIsolation; - // v3.1 - bool virtualAccActive; - uint128 virtualUnderlyingBalance; - } - - struct UserReserveData { - address underlyingAsset; - uint256 scaledATokenBalance; - bool usageAsCollateralEnabledOnUser; - uint256 scaledVariableDebt; - } - - struct BaseCurrencyInfo { - uint256 marketReferenceCurrencyUnit; - int256 marketReferenceCurrencyPriceInUsd; - int256 networkBaseTokenPriceInUsd; - uint8 networkBaseTokenPriceDecimals; - } - - struct Emode { - uint8 id; - DataTypes.EModeCategory eMode; - } - - function getReservesList( - IPoolAddressesProvider provider - ) external view returns (address[] memory); - - function getReservesData( - IPoolAddressesProvider provider - ) external view returns (AggregatedReserveData[] memory, BaseCurrencyInfo memory); - - function getUserReservesData( - IPoolAddressesProvider provider, - address user - ) external view returns (UserReserveData[] memory, uint8); - - /** - * @dev Iterates the eModes mapping and returns all eModes found - * @notice The method assumes for id gaps <= 2 within the eMode definitions - * @return an array of eModes that were found in the eMode mapping - */ - function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory); -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol - -/** - * @title IAaveOracle - * @author Aave - * @notice Defines the basic interface for the Aave Oracle - */ -interface IAaveOracle is IPriceOracleGetter { - /** - * @dev Emitted after the base currency is set - * @param baseCurrency The base currency of used for price quotes - * @param baseCurrencyUnit The unit of the base currency - */ - event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); - - /** - * @dev Emitted after the price source of an asset is updated - * @param asset The address of the asset - * @param source The price source of the asset - */ - event AssetSourceUpdated(address indexed asset, address indexed source); - - /** - * @dev Emitted after the address of fallback oracle is updated - * @param fallbackOracle The address of the fallback oracle - */ - event FallbackOracleUpdated(address indexed fallbackOracle); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Sets or replaces price sources of assets - * @param assets The addresses of the assets - * @param sources The addresses of the price sources - */ - function setAssetSources(address[] calldata assets, address[] calldata sources) external; - - /** - * @notice Sets the fallback oracle - * @param fallbackOracle The address of the fallback oracle - */ - function setFallbackOracle(address fallbackOracle) external; - - /** - * @notice Returns a list of prices from a list of assets addresses - * @param assets The list of assets addresses - * @return The prices of the given assets - */ - function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); - - /** - * @notice Returns the address of the source for an asset address - * @param asset The address of the asset - * @return The address of the source - */ - function getSourceOfAsset(address asset) external view returns (address); - - /** - * @notice Returns the address of the fallback oracle - * @return The address of the fallback oracle - */ - function getFallbackOracle() external view returns (address); -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol - -/** - * @title IDefaultInterestRateStrategyV2 - * @author BGD Labs - * @notice Interface of the default interest rate strategy used by the Aave protocol - */ -interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { - /** - * @notice Holds the interest rate data for a given reserve - * - * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This - * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. - * - * @param optimalUsageRatio The optimal usage ratio, in bps - * @param baseVariableBorrowRate The base variable borrow rate, in bps - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps - */ - struct InterestRateData { - uint16 optimalUsageRatio; - uint32 baseVariableBorrowRate; - uint32 variableRateSlope1; - uint32 variableRateSlope2; - } - - /** - * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, - * used in in-memory calculations. - * - * @param optimalUsageRatio The optimal usage ratio - * @param baseVariableBorrowRate The base variable borrow rate - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio - */ - struct InterestRateDataRay { - uint256 optimalUsageRatio; - uint256 baseVariableBorrowRate; - uint256 variableRateSlope1; - uint256 variableRateSlope2; - } - - /** - * @notice emitted when new interest rate data is set in a reserve - * - * @param reserve address of the reserve that has new interest rate data set - * @param optimalUsageRatio The optimal usage ratio, in bps - * @param baseVariableBorrowRate The base variable borrow rate, in bps - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps - */ - event RateDataUpdate( - address indexed reserve, - uint256 optimalUsageRatio, - uint256 baseVariableBorrowRate, - uint256 variableRateSlope1, - uint256 variableRateSlope2 - ); - - /** - * @notice Returns the address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the maximum value achievable for variable borrow rate, in bps - * @return The maximum rate - */ - function MAX_BORROW_RATE() external view returns (uint256); - - /** - * @notice Returns the minimum optimal point, in bps - * @return The optimal point - */ - function MIN_OPTIMAL_POINT() external view returns (uint256); - - /** - * @notice Returns the maximum optimal point, in bps - * @return The optimal point - */ - function MAX_OPTIMAL_POINT() external view returns (uint256); - - /** - * notice Returns the full InterestRateData object for the given reserve, in ray - * - * @param reserve The reserve to get the data of - * - * @return The InterestRateDataRay object for the given reserve - */ - function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); - - /** - * notice Returns the full InterestRateDataRay object for the given reserve, in bps - * - * @param reserve The reserve to get the data of - * - * @return The InterestRateData object for the given reserve - */ - function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); - - /** - * @notice Returns the optimal usage rate for the given reserve in ray - * - * @param reserve The reserve to get the optimal usage rate of - * - * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate - */ - function getOptimalUsageRatio(address reserve) external view returns (uint256); - - /** - * @notice Returns the variable rate slope below optimal usage ratio in ray - * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO - * - * @param reserve The reserve to get the variable rate slope 1 of - * - * @return The variable rate slope - */ - function getVariableRateSlope1(address reserve) external view returns (uint256); - - /** - * @notice Returns the variable rate slope above optimal usage ratio in ray - * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO - * - * @param reserve The reserve to get the variable rate slope 2 of - * - * @return The variable rate slope - */ - function getVariableRateSlope2(address reserve) external view returns (uint256); - - /** - * @notice Returns the base variable borrow rate, in ray - * - * @param reserve The reserve to get the base variable borrow rate of - * - * @return The base variable borrow rate - */ - function getBaseVariableBorrowRate(address reserve) external view returns (uint256); - - /** - * @notice Returns the maximum variable borrow rate, in ray - * - * @param reserve The reserve to get the maximum variable borrow rate of - * - * @return The maximum variable borrow rate - */ - function getMaxVariableBorrowRate(address reserve) external view returns (uint256); - - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The reserve interest rate data to apply to the given reserve - * Being specific to this custom implementation, with custom struct type, - * overloading the function on the generic interface - */ - function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol - -/** - * @title AaveProtocolDataProvider - * @author Aave - * @notice Peripheral contract to collect and pre-process information from the Pool. - */ -contract AaveProtocolDataProvider is IPoolDataProvider { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - - address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; - address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /// @inheritdoc IPoolDataProvider - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @notice Constructor - * @param addressesProvider The address of the PoolAddressesProvider contract - */ - constructor(IPoolAddressesProvider addressesProvider) { - ADDRESSES_PROVIDER = addressesProvider; - } - - /// @inheritdoc IPoolDataProvider - function getAllReservesTokens() external view override returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory reservesTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - if (reserves[i] == MKR) { - reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); - continue; - } - if (reserves[i] == ETH) { - reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); - continue; - } - reservesTokens[i] = TokenData({ - symbol: IERC20Detailed(reserves[i]).symbol(), - tokenAddress: reserves[i] - }); - } - return reservesTokens; - } - - /// @inheritdoc IPoolDataProvider - function getAllATokens() external view override returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory aTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveDataLegacy memory reserveData = pool.getReserveData(reserves[i]); - aTokens[i] = TokenData({ - symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), - tokenAddress: reserveData.aTokenAddress - }); - } - return aTokens; - } - - /// @inheritdoc IPoolDataProvider - function getReserveConfigurationData( - address asset - ) - external - view - override - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ) - { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration - .getParams(); - - (isActive, isFrozen, borrowingEnabled, ) = configuration.getFlags(); - - // @notice all stable debt related parameters deprecated in v3.2.0 - stableBorrowRateEnabled = false; - - usageAsCollateralEnabled = liquidationThreshold != 0; - } - - /// @inheritdoc IPoolDataProvider - function getReserveCaps( - address asset - ) external view override returns (uint256 borrowCap, uint256 supplyCap) { - (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); - } - - /// @inheritdoc IPoolDataProvider - function getPaused(address asset) external view override returns (bool isPaused) { - (, , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); - } - - /// @inheritdoc IPoolDataProvider - function getSiloedBorrowing(address asset) external view override returns (bool) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); - } - - /// @inheritdoc IPoolDataProvider - function getLiquidationProtocolFee(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); - } - - /// @inheritdoc IPoolDataProvider - function getUnbackedMintCap(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); - } - - /// @inheritdoc IPoolDataProvider - function getDebtCeiling(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); - } - - /// @inheritdoc IPoolDataProvider - function getDebtCeilingDecimals() external pure override returns (uint256) { - return ReserveConfiguration.DEBT_CEILING_DECIMALS; - } - - /// @inheritdoc IPoolDataProvider - function getReserveData( - address asset - ) - external - view - override - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - // @notice all stable debt related parameters deprecated in v3.2.0 - return ( - reserve.unbacked, - reserve.accruedToTreasury, - IERC20Detailed(reserve.aTokenAddress).totalSupply(), - 0, - IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), - reserve.currentLiquidityRate, - reserve.currentVariableBorrowRate, - 0, - 0, - reserve.liquidityIndex, - reserve.variableBorrowIndex, - reserve.lastUpdateTimestamp - ); - } - - /// @inheritdoc IPoolDataProvider - function getATokenTotalSupply(address asset) external view override returns (uint256) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.aTokenAddress).totalSupply(); - } - - /// @inheritdoc IPoolDataProvider - function getTotalDebt(address asset) external view override returns (uint256) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); - } - - /// @inheritdoc IPoolDataProvider - function getUserReserveData( - address asset, - address user - ) - external - view - override - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) - .getUserConfiguration(user); - - currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); - currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); - - // @notice all stable debt related parameters deprecated in v3.2.0 - currentStableDebt = principalStableDebt = stableBorrowRate = stableRateLastUpdated = 0; - - scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); - liquidityRate = reserve.currentLiquidityRate; - usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); - } - - /// @inheritdoc IPoolDataProvider - function getReserveTokensAddresses( - address asset - ) - external - view - override - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - // @notice all stable debt related parameters deprecated in v3.2.0 - return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); - } - - /// @inheritdoc IPoolDataProvider - function getInterestRateStrategyAddress( - address asset - ) external view override returns (address irStrategyAddress) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - return (reserve.interestRateStrategyAddress); - } - - /// @inheritdoc IPoolDataProvider - function getFlashLoanEnabled(address asset) external view override returns (bool) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - return configuration.getFlashLoanEnabled(); - } - - /// @inheritdoc IPoolDataProvider - function getIsVirtualAccActive(address asset) external view override returns (bool) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - return configuration.getIsVirtualAccActive(); - } - - /// @inheritdoc IPoolDataProvider - function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); - } -} - -// downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol - -contract UiPoolDataProviderV3 is IUiPoolDataProviderV3 { - using WadRayMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - IEACAggregatorProxy public immutable networkBaseTokenPriceInUsdProxyAggregator; - IEACAggregatorProxy public immutable marketReferenceCurrencyPriceInUsdProxyAggregator; - uint256 public constant ETH_CURRENCY_UNIT = 1 ether; - address public constant MKR_ADDRESS = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; - - constructor( - IEACAggregatorProxy _networkBaseTokenPriceInUsdProxyAggregator, - IEACAggregatorProxy _marketReferenceCurrencyPriceInUsdProxyAggregator - ) { - networkBaseTokenPriceInUsdProxyAggregator = _networkBaseTokenPriceInUsdProxyAggregator; - marketReferenceCurrencyPriceInUsdProxyAggregator = _marketReferenceCurrencyPriceInUsdProxyAggregator; - } - - function getReservesList( - IPoolAddressesProvider provider - ) external view override returns (address[] memory) { - IPool pool = IPool(provider.getPool()); - return pool.getReservesList(); - } - - function getReservesData( - IPoolAddressesProvider provider - ) external view override returns (AggregatedReserveData[] memory, BaseCurrencyInfo memory) { - IAaveOracle oracle = IAaveOracle(provider.getPriceOracle()); - IPool pool = IPool(provider.getPool()); - AaveProtocolDataProvider poolDataProvider = AaveProtocolDataProvider( - provider.getPoolDataProvider() - ); - - address[] memory reserves = pool.getReservesList(); - AggregatedReserveData[] memory reservesData = new AggregatedReserveData[](reserves.length); - - for (uint256 i = 0; i < reserves.length; i++) { - AggregatedReserveData memory reserveData = reservesData[i]; - reserveData.underlyingAsset = reserves[i]; - - // reserve current state - DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData( - reserveData.underlyingAsset - ); - //the liquidity index. Expressed in ray - reserveData.liquidityIndex = baseData.liquidityIndex; - //variable borrow index. Expressed in ray - reserveData.variableBorrowIndex = baseData.variableBorrowIndex; - //the current supply rate. Expressed in ray - reserveData.liquidityRate = baseData.currentLiquidityRate; - //the current variable borrow rate. Expressed in ray - reserveData.variableBorrowRate = baseData.currentVariableBorrowRate; - reserveData.lastUpdateTimestamp = baseData.lastUpdateTimestamp; - reserveData.aTokenAddress = baseData.aTokenAddress; - reserveData.variableDebtTokenAddress = baseData.variableDebtTokenAddress; - //address of the interest rate strategy - reserveData.interestRateStrategyAddress = baseData.interestRateStrategyAddress; - reserveData.priceInMarketReferenceCurrency = oracle.getAssetPrice( - reserveData.underlyingAsset - ); - reserveData.priceOracle = oracle.getSourceOfAsset(reserveData.underlyingAsset); - reserveData.availableLiquidity = IERC20Detailed(reserveData.underlyingAsset).balanceOf( - reserveData.aTokenAddress - ); - reserveData.totalScaledVariableDebt = IVariableDebtToken(reserveData.variableDebtTokenAddress) - .scaledTotalSupply(); - - // Due we take the symbol from underlying token we need a special case for $MKR as symbol() returns bytes32 - if (address(reserveData.underlyingAsset) == address(MKR_ADDRESS)) { - bytes32 symbol = IERC20DetailedBytes(reserveData.underlyingAsset).symbol(); - bytes32 name = IERC20DetailedBytes(reserveData.underlyingAsset).name(); - reserveData.symbol = bytes32ToString(symbol); - reserveData.name = bytes32ToString(name); - } else { - reserveData.symbol = IERC20Detailed(reserveData.underlyingAsset).symbol(); - reserveData.name = IERC20Detailed(reserveData.underlyingAsset).name(); - } - - //stores the reserve configuration - DataTypes.ReserveConfigurationMap memory reserveConfigurationMap = baseData.configuration; - ( - reserveData.baseLTVasCollateral, - reserveData.reserveLiquidationThreshold, - reserveData.reserveLiquidationBonus, - reserveData.decimals, - reserveData.reserveFactor - ) = reserveConfigurationMap.getParams(); - reserveData.usageAsCollateralEnabled = reserveData.baseLTVasCollateral != 0; - - ( - reserveData.isActive, - reserveData.isFrozen, - reserveData.borrowingEnabled, - reserveData.isPaused - ) = reserveConfigurationMap.getFlags(); - - // interest rates - try - IDefaultInterestRateStrategyV2(reserveData.interestRateStrategyAddress).getInterestRateData( - reserveData.underlyingAsset - ) - returns (IDefaultInterestRateStrategyV2.InterestRateDataRay memory res) { - reserveData.baseVariableBorrowRate = res.baseVariableBorrowRate; - reserveData.variableRateSlope1 = res.variableRateSlope1; - reserveData.variableRateSlope2 = res.variableRateSlope2; - reserveData.optimalUsageRatio = res.optimalUsageRatio; - } catch {} - - // v3 only - reserveData.debtCeiling = reserveConfigurationMap.getDebtCeiling(); - reserveData.debtCeilingDecimals = poolDataProvider.getDebtCeilingDecimals(); - (reserveData.borrowCap, reserveData.supplyCap) = reserveConfigurationMap.getCaps(); - - try poolDataProvider.getFlashLoanEnabled(reserveData.underlyingAsset) returns ( - bool flashLoanEnabled - ) { - reserveData.flashLoanEnabled = flashLoanEnabled; - } catch (bytes memory) { - reserveData.flashLoanEnabled = true; - } - - reserveData.isSiloedBorrowing = reserveConfigurationMap.getSiloedBorrowing(); - reserveData.unbacked = baseData.unbacked; - reserveData.isolationModeTotalDebt = baseData.isolationModeTotalDebt; - reserveData.accruedToTreasury = baseData.accruedToTreasury; - - reserveData.borrowableInIsolation = reserveConfigurationMap.getBorrowableInIsolation(); - - try poolDataProvider.getIsVirtualAccActive(reserveData.underlyingAsset) returns ( - bool virtualAccActive - ) { - reserveData.virtualAccActive = virtualAccActive; - } catch (bytes memory) { - reserveData.virtualAccActive = false; - } - - try pool.getVirtualUnderlyingBalance(reserveData.underlyingAsset) returns ( - uint128 virtualUnderlyingBalance - ) { - reserveData.virtualUnderlyingBalance = virtualUnderlyingBalance; - } catch (bytes memory) { - reserveData.virtualUnderlyingBalance = 0; - } - } - - BaseCurrencyInfo memory baseCurrencyInfo; - baseCurrencyInfo.networkBaseTokenPriceInUsd = networkBaseTokenPriceInUsdProxyAggregator - .latestAnswer(); - baseCurrencyInfo.networkBaseTokenPriceDecimals = networkBaseTokenPriceInUsdProxyAggregator - .decimals(); - - try oracle.BASE_CURRENCY_UNIT() returns (uint256 baseCurrencyUnit) { - baseCurrencyInfo.marketReferenceCurrencyUnit = baseCurrencyUnit; - baseCurrencyInfo.marketReferenceCurrencyPriceInUsd = int256(baseCurrencyUnit); - } catch (bytes memory /*lowLevelData*/) { - baseCurrencyInfo.marketReferenceCurrencyUnit = ETH_CURRENCY_UNIT; - baseCurrencyInfo - .marketReferenceCurrencyPriceInUsd = marketReferenceCurrencyPriceInUsdProxyAggregator - .latestAnswer(); - } - - return (reservesData, baseCurrencyInfo); - } - - /// @inheritdoc IUiPoolDataProviderV3 - function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory) { - IPool pool = IPool(provider.getPool()); - Emode[] memory tempCategories = new Emode[](256); - uint8 eModesFound = 0; - uint8 missCounter = 0; - for (uint8 i = 1; i < 256; i++) { - DataTypes.CollateralConfig memory cfg = pool.getEModeCategoryCollateralConfig(i); - if (cfg.liquidationThreshold != 0) { - tempCategories[eModesFound] = Emode({ - eMode: DataTypes.EModeCategory({ - ltv: cfg.ltv, - liquidationThreshold: cfg.liquidationThreshold, - liquidationBonus: cfg.liquidationBonus, - label: pool.getEModeCategoryLabel(i), - collateralBitmap: pool.getEModeCategoryCollateralBitmap(i), - borrowableBitmap: pool.getEModeCategoryBorrowableBitmap(i) - }), - id: i - }); - ++eModesFound; - missCounter = 0; - } else { - ++missCounter; - } - // assumes there will never be a gap > 2 when setting eModes - if (missCounter > 2) break; - } - Emode[] memory categories = new Emode[](eModesFound); - for (uint8 i = 0; i < eModesFound; i++) { - categories[i] = tempCategories[i]; - } - return categories; - } - - function getUserReservesData( - IPoolAddressesProvider provider, - address user - ) external view override returns (UserReserveData[] memory, uint8) { - IPool pool = IPool(provider.getPool()); - address[] memory reserves = pool.getReservesList(); - DataTypes.UserConfigurationMap memory userConfig = pool.getUserConfiguration(user); - - uint8 userEmodeCategoryId = uint8(pool.getUserEMode(user)); - - UserReserveData[] memory userReservesData = new UserReserveData[]( - user != address(0) ? reserves.length : 0 - ); - - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); - - // user reserve data - userReservesData[i].underlyingAsset = reserves[i]; - userReservesData[i].scaledATokenBalance = IAToken(baseData.aTokenAddress).scaledBalanceOf( - user - ); - userReservesData[i].usageAsCollateralEnabledOnUser = userConfig.isUsingAsCollateral(i); - - if (userConfig.isBorrowing(i)) { - userReservesData[i].scaledVariableDebt = IVariableDebtToken( - baseData.variableDebtTokenAddress - ).scaledBalanceOf(user); - } - } - - return (userReservesData, userEmodeCategoryId); - } - - function bytes32ToString(bytes32 _bytes32) public pure returns (string memory) { - uint8 i = 0; - while (i < 32 && _bytes32[i] != 0) { - i++; - } - bytes memory bytesArray = new bytes(i); - for (i = 0; i < 32 && _bytes32[i] != 0; i++) { - bytesArray[i] = _bytes32[i]; - } - return string(bytesArray); - } -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol deleted file mode 100644 index a1d01d4f..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from './IERC20.sol'; - -interface IERC20Detailed is IERC20 { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol deleted file mode 100644 index 671b658b..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/AaveProtocolDataProvider.sol +++ /dev/null @@ -1,295 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; -import {WadRayMath} from '../protocol/libraries/math/WadRayMath.sol'; -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {IVariableDebtToken} from '../interfaces/IVariableDebtToken.sol'; -import {IPool} from '../interfaces/IPool.sol'; -import {IPoolDataProvider} from '../interfaces/IPoolDataProvider.sol'; - -/** - * @title AaveProtocolDataProvider - * @author Aave - * @notice Peripheral contract to collect and pre-process information from the Pool. - */ -contract AaveProtocolDataProvider is IPoolDataProvider { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using WadRayMath for uint256; - - address constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; - address constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /// @inheritdoc IPoolDataProvider - IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; - - /** - * @notice Constructor - * @param addressesProvider The address of the PoolAddressesProvider contract - */ - constructor(IPoolAddressesProvider addressesProvider) { - ADDRESSES_PROVIDER = addressesProvider; - } - - /// @inheritdoc IPoolDataProvider - function getAllReservesTokens() external view override returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory reservesTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - if (reserves[i] == MKR) { - reservesTokens[i] = TokenData({symbol: 'MKR', tokenAddress: reserves[i]}); - continue; - } - if (reserves[i] == ETH) { - reservesTokens[i] = TokenData({symbol: 'ETH', tokenAddress: reserves[i]}); - continue; - } - reservesTokens[i] = TokenData({ - symbol: IERC20Detailed(reserves[i]).symbol(), - tokenAddress: reserves[i] - }); - } - return reservesTokens; - } - - /// @inheritdoc IPoolDataProvider - function getAllATokens() external view override returns (TokenData[] memory) { - IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); - address[] memory reserves = pool.getReservesList(); - TokenData[] memory aTokens = new TokenData[](reserves.length); - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveDataLegacy memory reserveData = pool.getReserveData(reserves[i]); - aTokens[i] = TokenData({ - symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), - tokenAddress: reserveData.aTokenAddress - }); - } - return aTokens; - } - - /// @inheritdoc IPoolDataProvider - function getReserveConfigurationData( - address asset - ) - external - view - override - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ) - { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - (ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration - .getParams(); - - (isActive, isFrozen, borrowingEnabled, ) = configuration.getFlags(); - - // @notice all stable debt related parameters deprecated in v3.2.0 - stableBorrowRateEnabled = false; - - usageAsCollateralEnabled = liquidationThreshold != 0; - } - - /// @inheritdoc IPoolDataProvider - function getReserveCaps( - address asset - ) external view override returns (uint256 borrowCap, uint256 supplyCap) { - (borrowCap, supplyCap) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getCaps(); - } - - /// @inheritdoc IPoolDataProvider - function getPaused(address asset) external view override returns (bool isPaused) { - (, , , isPaused) = IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getFlags(); - } - - /// @inheritdoc IPoolDataProvider - function getSiloedBorrowing(address asset) external view override returns (bool) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getSiloedBorrowing(); - } - - /// @inheritdoc IPoolDataProvider - function getLiquidationProtocolFee(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getLiquidationProtocolFee(); - } - - /// @inheritdoc IPoolDataProvider - function getUnbackedMintCap(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getUnbackedMintCap(); - } - - /// @inheritdoc IPoolDataProvider - function getDebtCeiling(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getConfiguration(asset).getDebtCeiling(); - } - - /// @inheritdoc IPoolDataProvider - function getDebtCeilingDecimals() external pure override returns (uint256) { - return ReserveConfiguration.DEBT_CEILING_DECIMALS; - } - - /// @inheritdoc IPoolDataProvider - function getReserveData( - address asset - ) - external - view - override - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - // @notice all stable debt related parameters deprecated in v3.2.0 - return ( - reserve.unbacked, - reserve.accruedToTreasury, - IERC20Detailed(reserve.aTokenAddress).totalSupply(), - 0, - IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(), - reserve.currentLiquidityRate, - reserve.currentVariableBorrowRate, - 0, - 0, - reserve.liquidityIndex, - reserve.variableBorrowIndex, - reserve.lastUpdateTimestamp - ); - } - - /// @inheritdoc IPoolDataProvider - function getATokenTotalSupply(address asset) external view override returns (uint256) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.aTokenAddress).totalSupply(); - } - - /// @inheritdoc IPoolDataProvider - function getTotalDebt(address asset) external view override returns (uint256) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - return IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(); - } - - /// @inheritdoc IPoolDataProvider - function getUserReserveData( - address asset, - address user - ) - external - view - override - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - DataTypes.UserConfigurationMap memory userConfig = IPool(ADDRESSES_PROVIDER.getPool()) - .getUserConfiguration(user); - - currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user); - currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user); - - // @notice all stable debt related parameters deprecated in v3.2.0 - currentStableDebt = principalStableDebt = stableBorrowRate = stableRateLastUpdated = 0; - - scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user); - liquidityRate = reserve.currentLiquidityRate; - usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id); - } - - /// @inheritdoc IPoolDataProvider - function getReserveTokensAddresses( - address asset - ) - external - view - override - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ) - { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - // @notice all stable debt related parameters deprecated in v3.2.0 - return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); - } - - /// @inheritdoc IPoolDataProvider - function getInterestRateStrategyAddress( - address asset - ) external view override returns (address irStrategyAddress) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); - - return (reserve.interestRateStrategyAddress); - } - - /// @inheritdoc IPoolDataProvider - function getFlashLoanEnabled(address asset) external view override returns (bool) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - return configuration.getFlashLoanEnabled(); - } - - /// @inheritdoc IPoolDataProvider - function getIsVirtualAccActive(address asset) external view override returns (bool) { - DataTypes.ReserveConfigurationMap memory configuration = IPool(ADDRESSES_PROVIDER.getPool()) - .getConfiguration(asset); - - return configuration.getIsVirtualAccActive(); - } - - /// @inheritdoc IPoolDataProvider - function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { - return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); - } -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol deleted file mode 100644 index b079d2dd..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/UiPoolDataProviderV3.sol +++ /dev/null @@ -1,265 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../interfaces/IPool.sol'; -import {IAaveOracle} from '../interfaces/IAaveOracle.sol'; -import {IAToken} from '../interfaces/IAToken.sol'; -import {IVariableDebtToken} from '../interfaces/IVariableDebtToken.sol'; -import {IDefaultInterestRateStrategyV2} from '../interfaces/IDefaultInterestRateStrategyV2.sol'; -import {AaveProtocolDataProvider} from './AaveProtocolDataProvider.sol'; -import {WadRayMath} from '../protocol/libraries/math/WadRayMath.sol'; -import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; -import {IEACAggregatorProxy} from './interfaces/IEACAggregatorProxy.sol'; -import {IERC20DetailedBytes} from './interfaces/IERC20DetailedBytes.sol'; -import {IUiPoolDataProviderV3} from './interfaces/IUiPoolDataProviderV3.sol'; - -contract UiPoolDataProviderV3 is IUiPoolDataProviderV3 { - using WadRayMath for uint256; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - - IEACAggregatorProxy public immutable networkBaseTokenPriceInUsdProxyAggregator; - IEACAggregatorProxy public immutable marketReferenceCurrencyPriceInUsdProxyAggregator; - uint256 public constant ETH_CURRENCY_UNIT = 1 ether; - address public constant MKR_ADDRESS = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; - - constructor( - IEACAggregatorProxy _networkBaseTokenPriceInUsdProxyAggregator, - IEACAggregatorProxy _marketReferenceCurrencyPriceInUsdProxyAggregator - ) { - networkBaseTokenPriceInUsdProxyAggregator = _networkBaseTokenPriceInUsdProxyAggregator; - marketReferenceCurrencyPriceInUsdProxyAggregator = _marketReferenceCurrencyPriceInUsdProxyAggregator; - } - - function getReservesList( - IPoolAddressesProvider provider - ) external view override returns (address[] memory) { - IPool pool = IPool(provider.getPool()); - return pool.getReservesList(); - } - - function getReservesData( - IPoolAddressesProvider provider - ) external view override returns (AggregatedReserveData[] memory, BaseCurrencyInfo memory) { - IAaveOracle oracle = IAaveOracle(provider.getPriceOracle()); - IPool pool = IPool(provider.getPool()); - AaveProtocolDataProvider poolDataProvider = AaveProtocolDataProvider( - provider.getPoolDataProvider() - ); - - address[] memory reserves = pool.getReservesList(); - AggregatedReserveData[] memory reservesData = new AggregatedReserveData[](reserves.length); - - for (uint256 i = 0; i < reserves.length; i++) { - AggregatedReserveData memory reserveData = reservesData[i]; - reserveData.underlyingAsset = reserves[i]; - - // reserve current state - DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData( - reserveData.underlyingAsset - ); - //the liquidity index. Expressed in ray - reserveData.liquidityIndex = baseData.liquidityIndex; - //variable borrow index. Expressed in ray - reserveData.variableBorrowIndex = baseData.variableBorrowIndex; - //the current supply rate. Expressed in ray - reserveData.liquidityRate = baseData.currentLiquidityRate; - //the current variable borrow rate. Expressed in ray - reserveData.variableBorrowRate = baseData.currentVariableBorrowRate; - reserveData.lastUpdateTimestamp = baseData.lastUpdateTimestamp; - reserveData.aTokenAddress = baseData.aTokenAddress; - reserveData.variableDebtTokenAddress = baseData.variableDebtTokenAddress; - //address of the interest rate strategy - reserveData.interestRateStrategyAddress = baseData.interestRateStrategyAddress; - reserveData.priceInMarketReferenceCurrency = oracle.getAssetPrice( - reserveData.underlyingAsset - ); - reserveData.priceOracle = oracle.getSourceOfAsset(reserveData.underlyingAsset); - reserveData.availableLiquidity = IERC20Detailed(reserveData.underlyingAsset).balanceOf( - reserveData.aTokenAddress - ); - reserveData.totalScaledVariableDebt = IVariableDebtToken(reserveData.variableDebtTokenAddress) - .scaledTotalSupply(); - - // Due we take the symbol from underlying token we need a special case for $MKR as symbol() returns bytes32 - if (address(reserveData.underlyingAsset) == address(MKR_ADDRESS)) { - bytes32 symbol = IERC20DetailedBytes(reserveData.underlyingAsset).symbol(); - bytes32 name = IERC20DetailedBytes(reserveData.underlyingAsset).name(); - reserveData.symbol = bytes32ToString(symbol); - reserveData.name = bytes32ToString(name); - } else { - reserveData.symbol = IERC20Detailed(reserveData.underlyingAsset).symbol(); - reserveData.name = IERC20Detailed(reserveData.underlyingAsset).name(); - } - - //stores the reserve configuration - DataTypes.ReserveConfigurationMap memory reserveConfigurationMap = baseData.configuration; - ( - reserveData.baseLTVasCollateral, - reserveData.reserveLiquidationThreshold, - reserveData.reserveLiquidationBonus, - reserveData.decimals, - reserveData.reserveFactor - ) = reserveConfigurationMap.getParams(); - reserveData.usageAsCollateralEnabled = reserveData.baseLTVasCollateral != 0; - - ( - reserveData.isActive, - reserveData.isFrozen, - reserveData.borrowingEnabled, - reserveData.isPaused - ) = reserveConfigurationMap.getFlags(); - - // interest rates - try - IDefaultInterestRateStrategyV2(reserveData.interestRateStrategyAddress).getInterestRateData( - reserveData.underlyingAsset - ) - returns (IDefaultInterestRateStrategyV2.InterestRateDataRay memory res) { - reserveData.baseVariableBorrowRate = res.baseVariableBorrowRate; - reserveData.variableRateSlope1 = res.variableRateSlope1; - reserveData.variableRateSlope2 = res.variableRateSlope2; - reserveData.optimalUsageRatio = res.optimalUsageRatio; - } catch {} - - // v3 only - reserveData.debtCeiling = reserveConfigurationMap.getDebtCeiling(); - reserveData.debtCeilingDecimals = poolDataProvider.getDebtCeilingDecimals(); - (reserveData.borrowCap, reserveData.supplyCap) = reserveConfigurationMap.getCaps(); - - try poolDataProvider.getFlashLoanEnabled(reserveData.underlyingAsset) returns ( - bool flashLoanEnabled - ) { - reserveData.flashLoanEnabled = flashLoanEnabled; - } catch (bytes memory) { - reserveData.flashLoanEnabled = true; - } - - reserveData.isSiloedBorrowing = reserveConfigurationMap.getSiloedBorrowing(); - reserveData.unbacked = baseData.unbacked; - reserveData.isolationModeTotalDebt = baseData.isolationModeTotalDebt; - reserveData.accruedToTreasury = baseData.accruedToTreasury; - - reserveData.borrowableInIsolation = reserveConfigurationMap.getBorrowableInIsolation(); - - try poolDataProvider.getIsVirtualAccActive(reserveData.underlyingAsset) returns ( - bool virtualAccActive - ) { - reserveData.virtualAccActive = virtualAccActive; - } catch (bytes memory) { - reserveData.virtualAccActive = false; - } - - try pool.getVirtualUnderlyingBalance(reserveData.underlyingAsset) returns ( - uint128 virtualUnderlyingBalance - ) { - reserveData.virtualUnderlyingBalance = virtualUnderlyingBalance; - } catch (bytes memory) { - reserveData.virtualUnderlyingBalance = 0; - } - } - - BaseCurrencyInfo memory baseCurrencyInfo; - baseCurrencyInfo.networkBaseTokenPriceInUsd = networkBaseTokenPriceInUsdProxyAggregator - .latestAnswer(); - baseCurrencyInfo.networkBaseTokenPriceDecimals = networkBaseTokenPriceInUsdProxyAggregator - .decimals(); - - try oracle.BASE_CURRENCY_UNIT() returns (uint256 baseCurrencyUnit) { - baseCurrencyInfo.marketReferenceCurrencyUnit = baseCurrencyUnit; - baseCurrencyInfo.marketReferenceCurrencyPriceInUsd = int256(baseCurrencyUnit); - } catch (bytes memory /*lowLevelData*/) { - baseCurrencyInfo.marketReferenceCurrencyUnit = ETH_CURRENCY_UNIT; - baseCurrencyInfo - .marketReferenceCurrencyPriceInUsd = marketReferenceCurrencyPriceInUsdProxyAggregator - .latestAnswer(); - } - - return (reservesData, baseCurrencyInfo); - } - - /// @inheritdoc IUiPoolDataProviderV3 - function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory) { - IPool pool = IPool(provider.getPool()); - Emode[] memory tempCategories = new Emode[](256); - uint8 eModesFound = 0; - uint8 missCounter = 0; - for (uint8 i = 1; i < 256; i++) { - DataTypes.CollateralConfig memory cfg = pool.getEModeCategoryCollateralConfig(i); - if (cfg.liquidationThreshold != 0) { - tempCategories[eModesFound] = Emode({ - eMode: DataTypes.EModeCategory({ - ltv: cfg.ltv, - liquidationThreshold: cfg.liquidationThreshold, - liquidationBonus: cfg.liquidationBonus, - label: pool.getEModeCategoryLabel(i), - collateralBitmap: pool.getEModeCategoryCollateralBitmap(i), - borrowableBitmap: pool.getEModeCategoryBorrowableBitmap(i) - }), - id: i - }); - ++eModesFound; - missCounter = 0; - } else { - ++missCounter; - } - // assumes there will never be a gap > 2 when setting eModes - if (missCounter > 2) break; - } - Emode[] memory categories = new Emode[](eModesFound); - for (uint8 i = 0; i < eModesFound; i++) { - categories[i] = tempCategories[i]; - } - return categories; - } - - function getUserReservesData( - IPoolAddressesProvider provider, - address user - ) external view override returns (UserReserveData[] memory, uint8) { - IPool pool = IPool(provider.getPool()); - address[] memory reserves = pool.getReservesList(); - DataTypes.UserConfigurationMap memory userConfig = pool.getUserConfiguration(user); - - uint8 userEmodeCategoryId = uint8(pool.getUserEMode(user)); - - UserReserveData[] memory userReservesData = new UserReserveData[]( - user != address(0) ? reserves.length : 0 - ); - - for (uint256 i = 0; i < reserves.length; i++) { - DataTypes.ReserveDataLegacy memory baseData = pool.getReserveData(reserves[i]); - - // user reserve data - userReservesData[i].underlyingAsset = reserves[i]; - userReservesData[i].scaledATokenBalance = IAToken(baseData.aTokenAddress).scaledBalanceOf( - user - ); - userReservesData[i].usageAsCollateralEnabledOnUser = userConfig.isUsingAsCollateral(i); - - if (userConfig.isBorrowing(i)) { - userReservesData[i].scaledVariableDebt = IVariableDebtToken( - baseData.variableDebtTokenAddress - ).scaledBalanceOf(user); - } - } - - return (userReservesData, userEmodeCategoryId); - } - - function bytes32ToString(bytes32 _bytes32) public pure returns (string memory) { - uint8 i = 0; - while (i < 32 && _bytes32[i] != 0) { - i++; - } - bytes memory bytesArray = new bytes(i); - for (i = 0; i < 32 && _bytes32[i] != 0; i++) { - bytesArray[i] = _bytes32[i]; - } - return string(bytesArray); - } -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol deleted file mode 100644 index c89baee6..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -interface IEACAggregatorProxy { - function decimals() external view returns (uint8); - - function latestAnswer() external view returns (int256); - - function latestTimestamp() external view returns (uint256); - - function latestRound() external view returns (uint256); - - function getAnswer(uint256 roundId) external view returns (int256); - - function getTimestamp(uint256 roundId) external view returns (uint256); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); - event NewRound(uint256 indexed roundId, address indexed startedBy); -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol deleted file mode 100644 index 0541f0da..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IERC20DetailedBytes.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; - -interface IERC20DetailedBytes is IERC20 { - function name() external view returns (bytes32); - - function symbol() external view returns (bytes32); - - function decimals() external view returns (uint8); -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol deleted file mode 100644 index 3280d75b..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol +++ /dev/null @@ -1,95 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; -import {DataTypes} from '../../protocol/libraries/types/DataTypes.sol'; - -interface IUiPoolDataProviderV3 { - struct AggregatedReserveData { - address underlyingAsset; - string name; - string symbol; - uint256 decimals; - uint256 baseLTVasCollateral; - uint256 reserveLiquidationThreshold; - uint256 reserveLiquidationBonus; - uint256 reserveFactor; - bool usageAsCollateralEnabled; - bool borrowingEnabled; - bool isActive; - bool isFrozen; - // base data - uint128 liquidityIndex; - uint128 variableBorrowIndex; - uint128 liquidityRate; - uint128 variableBorrowRate; - uint40 lastUpdateTimestamp; - address aTokenAddress; - address variableDebtTokenAddress; - address interestRateStrategyAddress; - // - uint256 availableLiquidity; - uint256 totalScaledVariableDebt; - uint256 priceInMarketReferenceCurrency; - address priceOracle; - uint256 variableRateSlope1; - uint256 variableRateSlope2; - uint256 baseVariableBorrowRate; - uint256 optimalUsageRatio; - // v3 only - bool isPaused; - bool isSiloedBorrowing; - uint128 accruedToTreasury; - uint128 unbacked; - uint128 isolationModeTotalDebt; - bool flashLoanEnabled; - // - uint256 debtCeiling; - uint256 debtCeilingDecimals; - uint256 borrowCap; - uint256 supplyCap; - bool borrowableInIsolation; - // v3.1 - bool virtualAccActive; - uint128 virtualUnderlyingBalance; - } - - struct UserReserveData { - address underlyingAsset; - uint256 scaledATokenBalance; - bool usageAsCollateralEnabledOnUser; - uint256 scaledVariableDebt; - } - - struct BaseCurrencyInfo { - uint256 marketReferenceCurrencyUnit; - int256 marketReferenceCurrencyPriceInUsd; - int256 networkBaseTokenPriceInUsd; - uint8 networkBaseTokenPriceDecimals; - } - - struct Emode { - uint8 id; - DataTypes.EModeCategory eMode; - } - - function getReservesList( - IPoolAddressesProvider provider - ) external view returns (address[] memory); - - function getReservesData( - IPoolAddressesProvider provider - ) external view returns (AggregatedReserveData[] memory, BaseCurrencyInfo memory); - - function getUserReservesData( - IPoolAddressesProvider provider, - address user - ) external view returns (UserReserveData[] memory, uint8); - - /** - * @dev Iterates the eModes mapping and returns all eModes found - * @notice The method assumes for id gaps <= 2 within the eMode definitions - * @return an array of eModes that were found in the eMode mapping - */ - function getEModes(IPoolAddressesProvider provider) external view returns (Emode[] memory); -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol deleted file mode 100644 index 265d2560..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IAaveOracle.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPriceOracleGetter} from './IPriceOracleGetter.sol'; -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IAaveOracle - * @author Aave - * @notice Defines the basic interface for the Aave Oracle - */ -interface IAaveOracle is IPriceOracleGetter { - /** - * @dev Emitted after the base currency is set - * @param baseCurrency The base currency of used for price quotes - * @param baseCurrencyUnit The unit of the base currency - */ - event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); - - /** - * @dev Emitted after the price source of an asset is updated - * @param asset The address of the asset - * @param source The price source of the asset - */ - event AssetSourceUpdated(address indexed asset, address indexed source); - - /** - * @dev Emitted after the address of fallback oracle is updated - * @param fallbackOracle The address of the fallback oracle - */ - event FallbackOracleUpdated(address indexed fallbackOracle); - - /** - * @notice Returns the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Sets or replaces price sources of assets - * @param assets The addresses of the assets - * @param sources The addresses of the price sources - */ - function setAssetSources(address[] calldata assets, address[] calldata sources) external; - - /** - * @notice Sets the fallback oracle - * @param fallbackOracle The address of the fallback oracle - */ - function setFallbackOracle(address fallbackOracle) external; - - /** - * @notice Returns a list of prices from a list of assets addresses - * @param assets The list of assets addresses - * @return The prices of the given assets - */ - function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); - - /** - * @notice Returns the address of the source for an asset address - * @param asset The address of the asset - * @return The address of the source - */ - function getSourceOfAsset(address asset) external view returns (address); - - /** - * @notice Returns the address of the fallback oracle - * @return The address of the fallback oracle - */ - function getFallbackOracle() external view returns (address); -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol deleted file mode 100644 index 938e2d8f..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol +++ /dev/null @@ -1,161 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IReserveInterestRateStrategy} from './IReserveInterestRateStrategy.sol'; -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IDefaultInterestRateStrategyV2 - * @author BGD Labs - * @notice Interface of the default interest rate strategy used by the Aave protocol - */ -interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { - /** - * @notice Holds the interest rate data for a given reserve - * - * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This - * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. - * - * @param optimalUsageRatio The optimal usage ratio, in bps - * @param baseVariableBorrowRate The base variable borrow rate, in bps - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps - */ - struct InterestRateData { - uint16 optimalUsageRatio; - uint32 baseVariableBorrowRate; - uint32 variableRateSlope1; - uint32 variableRateSlope2; - } - - /** - * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, - * used in in-memory calculations. - * - * @param optimalUsageRatio The optimal usage ratio - * @param baseVariableBorrowRate The base variable borrow rate - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio - */ - struct InterestRateDataRay { - uint256 optimalUsageRatio; - uint256 baseVariableBorrowRate; - uint256 variableRateSlope1; - uint256 variableRateSlope2; - } - - /** - * @notice emitted when new interest rate data is set in a reserve - * - * @param reserve address of the reserve that has new interest rate data set - * @param optimalUsageRatio The optimal usage ratio, in bps - * @param baseVariableBorrowRate The base variable borrow rate, in bps - * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps - * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps - */ - event RateDataUpdate( - address indexed reserve, - uint256 optimalUsageRatio, - uint256 baseVariableBorrowRate, - uint256 variableRateSlope1, - uint256 variableRateSlope2 - ); - - /** - * @notice Returns the address of the PoolAddressesProvider - * @return The address of the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the maximum value achievable for variable borrow rate, in bps - * @return The maximum rate - */ - function MAX_BORROW_RATE() external view returns (uint256); - - /** - * @notice Returns the minimum optimal point, in bps - * @return The optimal point - */ - function MIN_OPTIMAL_POINT() external view returns (uint256); - - /** - * @notice Returns the maximum optimal point, in bps - * @return The optimal point - */ - function MAX_OPTIMAL_POINT() external view returns (uint256); - - /** - * notice Returns the full InterestRateData object for the given reserve, in ray - * - * @param reserve The reserve to get the data of - * - * @return The InterestRateDataRay object for the given reserve - */ - function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); - - /** - * notice Returns the full InterestRateDataRay object for the given reserve, in bps - * - * @param reserve The reserve to get the data of - * - * @return The InterestRateData object for the given reserve - */ - function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); - - /** - * @notice Returns the optimal usage rate for the given reserve in ray - * - * @param reserve The reserve to get the optimal usage rate of - * - * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate - */ - function getOptimalUsageRatio(address reserve) external view returns (uint256); - - /** - * @notice Returns the variable rate slope below optimal usage ratio in ray - * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO - * - * @param reserve The reserve to get the variable rate slope 1 of - * - * @return The variable rate slope - */ - function getVariableRateSlope1(address reserve) external view returns (uint256); - - /** - * @notice Returns the variable rate slope above optimal usage ratio in ray - * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO - * - * @param reserve The reserve to get the variable rate slope 2 of - * - * @return The variable rate slope - */ - function getVariableRateSlope2(address reserve) external view returns (uint256); - - /** - * @notice Returns the base variable borrow rate, in ray - * - * @param reserve The reserve to get the base variable borrow rate of - * - * @return The base variable borrow rate - */ - function getBaseVariableBorrowRate(address reserve) external view returns (uint256); - - /** - * @notice Returns the maximum variable borrow rate, in ray - * - * @param reserve The reserve to get the maximum variable borrow rate of - * - * @return The maximum variable borrow rate - */ - function getMaxVariableBorrowRate(address reserve) external view returns (uint256); - - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The reserve interest rate data to apply to the given reserve - * Being specific to this custom implementation, with custom struct type, - * overloading the function on the generic interface - */ - function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol deleted file mode 100644 index 4729d25c..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IInitializableDebtToken.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableDebtToken - * @author Aave - * @notice Interface for the initialize function common between debt tokens - */ -interface IInitializableDebtToken { - /** - * @dev Emitted when a debt token is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param incentivesController The address of the incentives controller for this aToken - * @param debtTokenDecimals The decimals of the debt token - * @param debtTokenName The name of the debt token - * @param debtTokenSymbol The symbol of the debt token - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address incentivesController, - uint8 debtTokenDecimals, - string debtTokenName, - string debtTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the debt token. - * @param pool The pool contract that is initializing this contract - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param debtTokenDecimals The decimals of the debtToken, same as the underlying asset's - * @param debtTokenName The name of the token - * @param debtTokenSymbol The symbol of the token - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 debtTokenDecimals, - string memory debtTokenName, - string memory debtTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol deleted file mode 100644 index a9df8903..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPoolDataProvider.sol +++ /dev/null @@ -1,250 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; - -/** - * @title IPoolDataProvider - * @author Aave - * @notice Defines the basic interface of a PoolDataProvider - */ -interface IPoolDataProvider { - struct TokenData { - string symbol; - address tokenAddress; - } - - /** - * @notice Returns the address for the PoolAddressesProvider contract. - * @return The address for the PoolAddressesProvider contract - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Returns the list of the existing reserves in the pool. - * @dev Handling MKR and ETH in a different way since they do not have standard `symbol` functions. - * @return The list of reserves, pairs of symbols and addresses - */ - function getAllReservesTokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the list of the existing ATokens in the pool. - * @return The list of ATokens, pairs of symbols and addresses - */ - function getAllATokens() external view returns (TokenData[] memory); - - /** - * @notice Returns the configuration data of the reserve - * @dev Not returning borrow and supply caps for compatibility, nor pause flag - * @param asset The address of the underlying asset of the reserve - * @return decimals The number of decimals of the reserve - * @return ltv The ltv of the reserve - * @return liquidationThreshold The liquidationThreshold of the reserve - * @return liquidationBonus The liquidationBonus of the reserve - * @return reserveFactor The reserveFactor of the reserve - * @return usageAsCollateralEnabled True if the usage as collateral is enabled, false otherwise - * @return borrowingEnabled True if borrowing is enabled, false otherwise - * @return stableBorrowRateEnabled True if stable rate borrowing is enabled, false otherwise - * @return isActive True if it is active, false otherwise - * @return isFrozen True if it is frozen, false otherwise - */ - function getReserveConfigurationData( - address asset - ) - external - view - returns ( - uint256 decimals, - uint256 ltv, - uint256 liquidationThreshold, - uint256 liquidationBonus, - uint256 reserveFactor, - bool usageAsCollateralEnabled, - bool borrowingEnabled, - bool stableBorrowRateEnabled, - bool isActive, - bool isFrozen - ); - - /** - * @notice Returns the caps parameters of the reserve - * @param asset The address of the underlying asset of the reserve - * @return borrowCap The borrow cap of the reserve - * @return supplyCap The supply cap of the reserve - */ - function getReserveCaps( - address asset - ) external view returns (uint256 borrowCap, uint256 supplyCap); - - /** - * @notice Returns if the pool is paused - * @param asset The address of the underlying asset of the reserve - * @return isPaused True if the pool is paused, false otherwise - */ - function getPaused(address asset) external view returns (bool isPaused); - - /** - * @notice Returns the siloed borrowing flag - * @param asset The address of the underlying asset of the reserve - * @return True if the asset is siloed for borrowing - */ - function getSiloedBorrowing(address asset) external view returns (bool); - - /** - * @notice Returns the protocol fee on the liquidation bonus - * @param asset The address of the underlying asset of the reserve - * @return The protocol fee on liquidation - */ - function getLiquidationProtocolFee(address asset) external view returns (uint256); - - /** - * @notice Returns the unbacked mint cap of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The unbacked mint cap of the reserve - */ - function getUnbackedMintCap(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The debt ceiling of the reserve - */ - function getDebtCeiling(address asset) external view returns (uint256); - - /** - * @notice Returns the debt ceiling decimals - * @return The debt ceiling decimals - */ - function getDebtCeilingDecimals() external pure returns (uint256); - - /** - * @notice Returns the reserve data - * @param asset The address of the underlying asset of the reserve - * @return unbacked The amount of unbacked tokens - * @return accruedToTreasuryScaled The scaled amount of tokens accrued to treasury that is to be minted - * @return totalAToken The total supply of the aToken - * @return totalStableDebt The total stable debt of the reserve - * @return totalVariableDebt The total variable debt of the reserve - * @return liquidityRate The liquidity rate of the reserve - * @return variableBorrowRate The variable borrow rate of the reserve - * @return stableBorrowRate The stable borrow rate of the reserve - * @return averageStableBorrowRate The average stable borrow rate of the reserve - * @return liquidityIndex The liquidity index of the reserve - * @return variableBorrowIndex The variable borrow index of the reserve - * @return lastUpdateTimestamp The timestamp of the last update of the reserve - */ - function getReserveData( - address asset - ) - external - view - returns ( - uint256 unbacked, - uint256 accruedToTreasuryScaled, - uint256 totalAToken, - uint256 totalStableDebt, - uint256 totalVariableDebt, - uint256 liquidityRate, - uint256 variableBorrowRate, - uint256 stableBorrowRate, - uint256 averageStableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex, - uint40 lastUpdateTimestamp - ); - - /** - * @notice Returns the total supply of aTokens for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total supply of the aToken - */ - function getATokenTotalSupply(address asset) external view returns (uint256); - - /** - * @notice Returns the total debt for a given asset - * @param asset The address of the underlying asset of the reserve - * @return The total debt for asset - */ - function getTotalDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the user data in a reserve - * @param asset The address of the underlying asset of the reserve - * @param user The address of the user - * @return currentATokenBalance The current AToken balance of the user - * @return currentStableDebt The current stable debt of the user - * @return currentVariableDebt The current variable debt of the user - * @return principalStableDebt The principal stable debt of the user - * @return scaledVariableDebt The scaled variable debt of the user - * @return stableBorrowRate The stable borrow rate of the user - * @return liquidityRate The liquidity rate of the reserve - * @return stableRateLastUpdated The timestamp of the last update of the user stable rate - * @return usageAsCollateralEnabled True if the user is using the asset as collateral, false - * otherwise - */ - function getUserReserveData( - address asset, - address user - ) - external - view - returns ( - uint256 currentATokenBalance, - uint256 currentStableDebt, - uint256 currentVariableDebt, - uint256 principalStableDebt, - uint256 scaledVariableDebt, - uint256 stableBorrowRate, - uint256 liquidityRate, - uint40 stableRateLastUpdated, - bool usageAsCollateralEnabled - ); - - /** - * @notice Returns the token addresses of the reserve - * @param asset The address of the underlying asset of the reserve - * @return aTokenAddress The AToken address of the reserve - * @return stableDebtTokenAddress DEPRECATED in v3.2.0 - * @return variableDebtTokenAddress The VariableDebtToken address of the reserve - */ - function getReserveTokensAddresses( - address asset - ) - external - view - returns ( - address aTokenAddress, - address stableDebtTokenAddress, - address variableDebtTokenAddress - ); - - /** - * @notice Returns the address of the Interest Rate strategy - * @param asset The address of the underlying asset of the reserve - * @return irStrategyAddress The address of the Interest Rate strategy - */ - function getInterestRateStrategyAddress( - address asset - ) external view returns (address irStrategyAddress); - - /** - * @notice Returns whether the reserve has FlashLoans enabled or disabled - * @param asset The address of the underlying asset of the reserve - * @return True if FlashLoans are enabled, false otherwise - */ - function getFlashLoanEnabled(address asset) external view returns (bool); - - /** - * @notice Returns whether virtual accounting is enabled/not for a reserve - * @param asset The address of the underlying asset of the reserve - * @return True if active, false otherwise - */ - function getIsVirtualAccActive(address asset) external view returns (bool); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint256); -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol deleted file mode 100644 index 869851a1..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IPriceOracleGetter.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPriceOracleGetter - * @author Aave - * @notice Interface for the Aave price oracle. - */ -interface IPriceOracleGetter { - /** - * @notice Returns the base currency address - * @dev Address 0x0 is reserved for USD as base currency. - * @return Returns the base currency address. - */ - function BASE_CURRENCY() external view returns (address); - - /** - * @notice Returns the base currency unit - * @dev 1 ether for ETH, 1e8 for USD. - * @return Returns the base currency unit. - */ - function BASE_CURRENCY_UNIT() external view returns (uint256); - - /** - * @notice Returns the asset price in the base currency - * @param asset The address of the asset - * @return The price of the asset - */ - function getAssetPrice(address asset) external view returns (uint256); -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol deleted file mode 100644 index e953cce5..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IReserveInterestRateStrategy.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IReserveInterestRateStrategy - * @author BGD Labs - * @notice Basic interface for any rate strategy used by the Aave protocol - */ -interface IReserveInterestRateStrategy { - /** - * @notice Sets interest rate data for an Aave rate strategy - * @param reserve The reserve to update - * @param rateData The abi encoded reserve interest rate data to apply to the given reserve - * Abstracted this way as rate strategies can be custom - */ - function setInterestRateParams(address reserve, bytes calldata rateData) external; - - /** - * @notice Calculates the interest rates depending on the reserve's state and configurations - * @param params The parameters needed to calculate interest rates - * @return liquidityRate The liquidity rate expressed in ray - * @return variableBorrowRate The variable borrow rate expressed in ray - */ - function calculateInterestRates( - DataTypes.CalculateInterestRatesParams memory params - ) external view returns (uint256, uint256); -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol deleted file mode 100644 index 625d1cb8..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/interfaces/IVariableDebtToken.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableDebtToken} from './IInitializableDebtToken.sol'; - -/** - * @title IVariableDebtToken - * @author Aave - * @notice Defines the basic interface for a variable debt token. - */ -interface IVariableDebtToken is IScaledBalanceToken, IInitializableDebtToken { - /** - * @notice Mints debt token to the `onBehalfOf` address - * @param user The address receiving the borrowed underlying, being the delegatee in case - * of credit delegate, or same as `onBehalfOf` otherwise - * @param onBehalfOf The address receiving the debt tokens - * @param amount The amount of debt being minted - * @param index The variable debt index of the reserve - * @return True if the previous balance of the user is 0, false otherwise - * @return The scaled total debt of the reserve - */ - function mint( - address user, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool, uint256); - - /** - * @notice Burns user variable debt - * @dev In some instances, a burn transaction will emit a mint event - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the debt will be burned - * @param amount The amount getting burned - * @param index The variable debt index of the reserve - * @return The scaled total debt of the reserve - */ - function burn(address from, uint256 amount, uint256 index) external returns (uint256); - - /** - * @notice Returns the address of the underlying asset of this debtToken (E.g. WETH for variableDebtWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol deleted file mode 100644 index f61fe87f..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/math/WadRayMath.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -/** - * @title WadRayMath library - * @author Aave - * @notice Provides functions to perform calculations with Wad and Ray units - * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers - * with 27 digits of precision) - * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. - */ -library WadRayMath { - // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly - uint256 internal constant WAD = 1e18; - uint256 internal constant HALF_WAD = 0.5e18; - - uint256 internal constant RAY = 1e27; - uint256 internal constant HALF_RAY = 0.5e27; - - uint256 internal constant WAD_RAY_RATIO = 1e9; - - /** - * @dev Multiplies two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a*b, in wad - */ - function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_WAD), WAD) - } - } - - /** - * @dev Divides two wad, rounding half up to the nearest wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @param b Wad - * @return c = a/b, in wad - */ - function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / WAD - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { - revert(0, 0) - } - - c := div(add(mul(a, WAD), div(b, 2)), b) - } - } - - /** - * @notice Multiplies two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raymul b - */ - function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b - assembly { - if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { - revert(0, 0) - } - - c := div(add(mul(a, b), HALF_RAY), RAY) - } - } - - /** - * @notice Divides two ray, rounding half up to the nearest ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @param b Ray - * @return c = a raydiv b - */ - function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { - // to avoid overflow, a <= (type(uint256).max - halfB) / RAY - assembly { - if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { - revert(0, 0) - } - - c := div(add(mul(a, RAY), div(b, 2)), b) - } - } - - /** - * @dev Casts ray down to wad - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Ray - * @return b = a converted to wad, rounded half up to the nearest wad - */ - function rayToWad(uint256 a) internal pure returns (uint256 b) { - assembly { - b := div(a, WAD_RAY_RATIO) - let remainder := mod(a, WAD_RAY_RATIO) - if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { - b := add(b, 1) - } - } - } - - /** - * @dev Converts wad up to ray - * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 - * @param a Wad - * @return b = a converted in ray - */ - function wadToRay(uint256 a) internal pure returns (uint256 b) { - // to avoid overflow, b/WAD_RAY_RATIO == a - assembly { - b := mul(a, WAD_RAY_RATIO) - - if iszero(eq(div(b, WAD_RAY_RATIO), a)) { - revert(0, 0) - } - } - } -} diff --git a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/UI_POOL_DATA_PROVIDER/UiPoolDataProviderV3/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER.sol deleted file mode 100644 index a31677f5..00000000 --- a/downloads/LINEA/WALLET_BALANCE_PROVIDER.sol +++ /dev/null @@ -1,2576 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol - -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} - -// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/helpers/WalletBalanceProvider.sol - -/** - * @title WalletBalanceProvider contract - * @author Aave, influenced by https://github.com/wbobeirne/eth-balance-checker/blob/master/contracts/BalanceChecker.sol - * @notice Implements a logic of getting multiple tokens balance for one user address - * @dev NOTE: THIS CONTRACT IS NOT USED WITHIN THE AAVE PROTOCOL. It's an accessory contract used to reduce the number of calls - * towards the blockchain from the Aave backend. - **/ -contract WalletBalanceProvider { - using Address for address payable; - using Address for address; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - address constant MOCK_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /** - @dev Fallback function, don't accept any ETH - **/ - receive() external payable { - //only contracts can send ETH to the core - require(msg.sender.isContract(), '22'); - } - - /** - @dev Check the token balance of a wallet in a token contract - - Returns the balance of the token for user. Avoids possible errors: - - return 0 on non-contract address - **/ - function balanceOf(address user, address token) public view returns (uint256) { - if (token == MOCK_ETH_ADDRESS) { - return user.balance; // ETH balance - // check if token is actually a contract - } else if (token.isContract()) { - return IERC20(token).balanceOf(user); - } - revert('INVALID_TOKEN'); - } - - /** - * @notice Fetches, for a list of _users and _tokens (ETH included with mock address), the balances - * @param users The list of users - * @param tokens The list of tokens - * @return And array with the concatenation of, for each user, his/her balances - **/ - function batchBalanceOf( - address[] calldata users, - address[] calldata tokens - ) external view returns (uint256[] memory) { - uint256[] memory balances = new uint256[](users.length * tokens.length); - - for (uint256 i = 0; i < users.length; i++) { - for (uint256 j = 0; j < tokens.length; j++) { - balances[i * tokens.length + j] = balanceOf(users[i], tokens[j]); - } - } - - return balances; - } - - /** - @dev provides balances of user wallet for all reserves available on the pool - */ - function getUserWalletBalances( - address provider, - address user - ) external view returns (address[] memory, uint256[] memory) { - IPool pool = IPool(IPoolAddressesProvider(provider).getPool()); - - address[] memory reserves = pool.getReservesList(); - address[] memory reservesWithEth = new address[](reserves.length + 1); - for (uint256 i = 0; i < reserves.length; i++) { - reservesWithEth[i] = reserves[i]; - } - reservesWithEth[reserves.length] = MOCK_ETH_ADDRESS; - - uint256[] memory balances = new uint256[](reservesWithEth.length); - - for (uint256 j = 0; j < reserves.length; j++) { - DataTypes.ReserveConfigurationMap memory configuration = pool.getConfiguration( - reservesWithEth[j] - ); - - (bool isActive, , , ) = configuration.getFlags(); - - if (!isActive) { - balances[j] = 0; - continue; - } - balances[j] = balanceOf(user, reservesWithEth[j]); - } - balances[reserves.length] = balanceOf(user, MOCK_ETH_ADDRESS); - - return (reservesWithEth, balances); - } -} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol deleted file mode 100644 index 9a6bb205..00000000 --- a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/Address.sol +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Address.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; - assembly { - size := extcodesize(account) - } - return size > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, 'Address: insufficient balance'); - - (bool success, ) = recipient.call{value: amount}(''); - require(success, 'Address: unable to send value, recipient may have reverted'); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, 'Address: low-level call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, 'Address: insufficient balance for call'); - require(isContract(target), 'Address: call to non-contract'); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data - ) internal view returns (bytes memory) { - return functionStaticCall(target, data, 'Address: low-level static call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), 'Address: static call to non-contract'); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), 'Address: delegate call to non-contract'); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/helpers/WalletBalanceProvider.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/helpers/WalletBalanceProvider.sol deleted file mode 100644 index 54efad64..00000000 --- a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/helpers/WalletBalanceProvider.sol +++ /dev/null @@ -1,108 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {Address} from '../dependencies/openzeppelin/contracts/Address.sol'; -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; - -import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; -import {IPool} from '../interfaces/IPool.sol'; -import {GPv2SafeERC20} from '../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title WalletBalanceProvider contract - * @author Aave, influenced by https://github.com/wbobeirne/eth-balance-checker/blob/master/contracts/BalanceChecker.sol - * @notice Implements a logic of getting multiple tokens balance for one user address - * @dev NOTE: THIS CONTRACT IS NOT USED WITHIN THE AAVE PROTOCOL. It's an accessory contract used to reduce the number of calls - * towards the blockchain from the Aave backend. - **/ -contract WalletBalanceProvider { - using Address for address payable; - using Address for address; - using GPv2SafeERC20 for IERC20; - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - address constant MOCK_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - /** - @dev Fallback function, don't accept any ETH - **/ - receive() external payable { - //only contracts can send ETH to the core - require(msg.sender.isContract(), '22'); - } - - /** - @dev Check the token balance of a wallet in a token contract - - Returns the balance of the token for user. Avoids possible errors: - - return 0 on non-contract address - **/ - function balanceOf(address user, address token) public view returns (uint256) { - if (token == MOCK_ETH_ADDRESS) { - return user.balance; // ETH balance - // check if token is actually a contract - } else if (token.isContract()) { - return IERC20(token).balanceOf(user); - } - revert('INVALID_TOKEN'); - } - - /** - * @notice Fetches, for a list of _users and _tokens (ETH included with mock address), the balances - * @param users The list of users - * @param tokens The list of tokens - * @return And array with the concatenation of, for each user, his/her balances - **/ - function batchBalanceOf( - address[] calldata users, - address[] calldata tokens - ) external view returns (uint256[] memory) { - uint256[] memory balances = new uint256[](users.length * tokens.length); - - for (uint256 i = 0; i < users.length; i++) { - for (uint256 j = 0; j < tokens.length; j++) { - balances[i * tokens.length + j] = balanceOf(users[i], tokens[j]); - } - } - - return balances; - } - - /** - @dev provides balances of user wallet for all reserves available on the pool - */ - function getUserWalletBalances( - address provider, - address user - ) external view returns (address[] memory, uint256[] memory) { - IPool pool = IPool(IPoolAddressesProvider(provider).getPool()); - - address[] memory reserves = pool.getReservesList(); - address[] memory reservesWithEth = new address[](reserves.length + 1); - for (uint256 i = 0; i < reserves.length; i++) { - reservesWithEth[i] = reserves[i]; - } - reservesWithEth[reserves.length] = MOCK_ETH_ADDRESS; - - uint256[] memory balances = new uint256[](reservesWithEth.length); - - for (uint256 j = 0; j < reserves.length; j++) { - DataTypes.ReserveConfigurationMap memory configuration = pool.getConfiguration( - reservesWithEth[j] - ); - - (bool isActive, , , ) = configuration.getFlags(); - - if (!isActive) { - balances[j] = 0; - continue; - } - balances[j] = balanceOf(user, reservesWithEth[j]); - } - balances[reserves.length] = balanceOf(user, MOCK_ETH_ADDRESS); - - return (reservesWithEth, balances); - } -} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPool.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/WALLET_BALANCE_PROVIDER/WalletBalanceProvider/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} diff --git a/downloads/LINEA/WETH_GATEWAY.sol b/downloads/LINEA/WETH_GATEWAY.sol deleted file mode 100644 index cba46080..00000000 --- a/downloads/LINEA/WETH_GATEWAY.sol +++ /dev/null @@ -1,3076 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0 ^0.8.10; - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWETH.sol - -interface IWETH { - function deposit() external payable; - - function withdraw(uint256) external; - - function approve(address guy, uint256 wad) external returns (bool); - - function transferFrom(address src, address dst, uint256 wad) external returns (bool); -} - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol - -interface IWrappedTokenGatewayV3 { - function depositETH(address pool, address onBehalfOf, uint16 referralCode) external payable; - - function withdrawETH(address pool, uint256 amount, address onBehalfOf) external; - - function repayETH(address pool, uint256 amount, address onBehalfOf) external payable; - - function borrowETH(address pool, uint256 amount, uint16 referralCode) external; - - function withdrawETHWithPermit( - address pool, - uint256 amount, - address to, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; -} - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAaveIncentivesController.sol - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPoolAddressesProvider.sol - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IScaledBalanceToken.sol - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/helpers/Errors.sol - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/types/DataTypes.sol - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPool.sol - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IInitializableAToken.sol - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAToken.sol - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} - -// downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/WrappedTokenGatewayV3.sol - -/** - * @dev This contract is an upgrade of the WrappedTokenGatewayV3 contract, with immutable pool address. - * This contract keeps the same interface of the deprecated WrappedTokenGatewayV3 contract. - */ -contract WrappedTokenGatewayV3 is IWrappedTokenGatewayV3, Ownable { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using GPv2SafeERC20 for IERC20; - - IWETH internal immutable WETH; - IPool internal immutable POOL; - - /** - * @dev Sets the WETH address and the PoolAddressesProvider address. Infinite approves pool. - * @param weth Address of the Wrapped Ether contract - * @param owner Address of the owner of this contract - **/ - constructor(address weth, address owner, IPool pool) { - WETH = IWETH(weth); - POOL = pool; - transferOwnership(owner); - IWETH(weth).approve(address(pool), type(uint256).max); - } - - /** - * @dev deposits WETH into the reserve, using native ETH. A corresponding amount of the overlying asset (aTokens) - * is minted. - * @param onBehalfOf address of the user who will receive the aTokens representing the deposit - * @param referralCode integrators are assigned a referral code and can potentially receive rewards. - **/ - function depositETH(address, address onBehalfOf, uint16 referralCode) external payable override { - WETH.deposit{value: msg.value}(); - POOL.deposit(address(WETH), msg.value, onBehalfOf, referralCode); - } - - /** - * @dev withdraws the WETH _reserves of msg.sender. - * @param amount amount of aWETH to withdraw and receive native ETH - * @param to address of the user who will receive native ETH - */ - function withdrawETH(address, uint256 amount, address to) external override { - IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); - uint256 userBalance = aWETH.balanceOf(msg.sender); - uint256 amountToWithdraw = amount; - - // if amount is equal to uint(-1), the user wants to redeem everything - if (amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); - POOL.withdraw(address(WETH), amountToWithdraw, address(this)); - WETH.withdraw(amountToWithdraw); - _safeTransferETH(to, amountToWithdraw); - } - - /** - * @dev repays a borrow on the WETH reserve, for the specified amount (or for the whole amount, if uint256(-1) is specified). - * @param amount the amount to repay, or uint256(-1) if the user wants to repay everything - * @param onBehalfOf the address for which msg.sender is repaying - */ - function repayETH(address, uint256 amount, address onBehalfOf) external payable override { - uint256 paybackAmount = IERC20((POOL.getReserveData(address(WETH))).variableDebtTokenAddress) - .balanceOf(onBehalfOf); - - if (amount < paybackAmount) { - paybackAmount = amount; - } - require(msg.value >= paybackAmount, 'msg.value is less than repayment amount'); - WETH.deposit{value: paybackAmount}(); - POOL.repay( - address(WETH), - paybackAmount, - uint256(DataTypes.InterestRateMode.VARIABLE), - onBehalfOf - ); - - // refund remaining dust eth - if (msg.value > paybackAmount) _safeTransferETH(msg.sender, msg.value - paybackAmount); - } - - /** - * @dev borrow WETH, unwraps to ETH and send both the ETH and DebtTokens to msg.sender, via `approveDelegation` and onBehalf argument in `Pool.borrow`. - * @param amount the amount of ETH to borrow - * @param referralCode integrators are assigned a referral code and can potentially receive rewards - */ - function borrowETH(address, uint256 amount, uint16 referralCode) external override { - POOL.borrow( - address(WETH), - amount, - uint256(DataTypes.InterestRateMode.VARIABLE), - referralCode, - msg.sender - ); - WETH.withdraw(amount); - _safeTransferETH(msg.sender, amount); - } - - /** - * @dev withdraws the WETH _reserves of msg.sender. - * @param amount amount of aWETH to withdraw and receive native ETH - * @param to address of the user who will receive native ETH - * @param deadline validity deadline of permit and so depositWithPermit signature - * @param permitV V parameter of ERC712 permit sig - * @param permitR R parameter of ERC712 permit sig - * @param permitS S parameter of ERC712 permit sig - */ - function withdrawETHWithPermit( - address, - uint256 amount, - address to, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external override { - IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); - uint256 userBalance = aWETH.balanceOf(msg.sender); - uint256 amountToWithdraw = amount; - - // if amount is equal to type(uint256).max, the user wants to redeem everything - if (amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - // permit `amount` rather than `amountToWithdraw` to make it easier for front-ends and integrators - aWETH.permit(msg.sender, address(this), amount, deadline, permitV, permitR, permitS); - aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); - POOL.withdraw(address(WETH), amountToWithdraw, address(this)); - WETH.withdraw(amountToWithdraw); - _safeTransferETH(to, amountToWithdraw); - } - - /** - * @dev transfer ETH to an address, revert if it fails. - * @param to recipient of the transfer - * @param value the amount to send - */ - function _safeTransferETH(address to, uint256 value) internal { - (bool success, ) = to.call{value: value}(new bytes(0)); - require(success, 'ETH_TRANSFER_FAILED'); - } - - /** - * @dev transfer ERC20 from the utility contract, for ERC20 recovery in case of stuck tokens due - * direct transfers to the contract address. - * @param token token to transfer - * @param to recipient of the transfer - * @param amount amount to send - */ - function emergencyTokenTransfer(address token, address to, uint256 amount) external onlyOwner { - IERC20(token).safeTransfer(to, amount); - } - - /** - * @dev transfer native Ether from the utility contract, for native Ether recovery in case of stuck Ether - * due to selfdestructs or ether transfers to the pre-computed contract address before deployment. - * @param to recipient of the transfer - * @param amount amount to send - */ - function emergencyEtherTransfer(address to, uint256 amount) external onlyOwner { - _safeTransferETH(to, amount); - } - - /** - * @dev Get WETH address used by WrappedTokenGatewayV3 - */ - function getWETHAddress() external view returns (address) { - return address(WETH); - } - - /** - * @dev Only WETH contract is allowed to transfer ETH here. Prevent other addresses to send Ether to this contract. - */ - receive() external payable { - require(msg.sender == address(WETH), 'Receive not allowed'); - } - - /** - * @dev Revert fallback calls - */ - fallback() external payable { - revert('Fallback not allowed'); - } -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol deleted file mode 100644 index d404c60d..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-later -pragma solidity ^0.8.10; - -import {IERC20} from '../../openzeppelin/contracts/IERC20.sol'; - -/// @title Gnosis Protocol v2 Safe ERC20 Transfer Library -/// @author Gnosis Developers -/// @dev Gas-efficient version of Openzeppelin's SafeERC20 contract. -library GPv2SafeERC20 { - /// @dev Wrapper around a call to the ERC20 function `transfer` that reverts - /// also when the token returns `false`. - function safeTransfer(IERC20 token, address to, uint256 value) internal { - bytes4 selector_ = token.transfer.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transfer'); - } - - /// @dev Wrapper around a call to the ERC20 function `transferFrom` that - /// reverts also when the token returns `false`. - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - bytes4 selector_ = token.transferFrom.selector; - - // solhint-disable-next-line no-inline-assembly - assembly { - let freeMemoryPointer := mload(0x40) - mstore(freeMemoryPointer, selector_) - mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) - mstore(add(freeMemoryPointer, 68), value) - - if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)) { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - - require(getLastTransferResult(token), 'GPv2: failed transferFrom'); - } - - /// @dev Verifies that the last return was a successful `transfer*` call. - /// This is done by checking that the return data is either empty, or - /// is a valid ABI encoded boolean. - function getLastTransferResult(IERC20 token) private view returns (bool success) { - // NOTE: Inspecting previous return data requires assembly. Note that - // we write the return data to memory 0 in the case where the return - // data size is 32, this is OK since the first 64 bytes of memory are - // reserved by Solidy as a scratch space that can be used within - // assembly blocks. - // - // solhint-disable-next-line no-inline-assembly - assembly { - /// @dev Revert with an ABI encoded Solidity error with a message - /// that fits into 32-bytes. - /// - /// An ABI encoded Solidity error has the following memory layout: - /// - /// ------------+---------------------------------- - /// byte range | value - /// ------------+---------------------------------- - /// 0x00..0x04 | selector("Error(string)") - /// 0x04..0x24 | string offset (always 0x20) - /// 0x24..0x44 | string length - /// 0x44..0x64 | string value, padded to 32-bytes - function revertWithMessage(length, message) { - mstore(0x00, '\x08\xc3\x79\xa0') - mstore(0x04, 0x20) - mstore(0x24, length) - mstore(0x44, message) - revert(0x00, 0x64) - } - - switch returndatasize() - // Non-standard ERC20 transfer without return. - case 0 { - // NOTE: When the return data size is 0, verify that there - // is code at the address. This is done in order to maintain - // compatibility with Solidity calling conventions. - // - if iszero(extcodesize(token)) { - revertWithMessage(20, 'GPv2: not a contract') - } - - success := 1 - } - // Standard ERC20 transfer returning boolean success value. - case 32 { - returndatacopy(0, 0, returndatasize()) - - // NOTE: For ABI encoding v1, any non-zero value is accepted - // as `true` for a boolean. In order to stay compatible with - // OpenZeppelin's `SafeERC20` library which is known to work - // with the existing ERC20 implementation we care about, - // make sure we return success for any non-zero return value - // from the `transfer*` call. - success := iszero(iszero(mload(0))) - } - default { - revertWithMessage(31, 'GPv2: malformed transfer result') - } - } - } -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol deleted file mode 100644 index 93f354b0..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Context.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view virtual returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol deleted file mode 100644 index 0554ac2b..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/IERC20.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol deleted file mode 100644 index 7917b722..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/dependencies/openzeppelin/contracts/Ownable.sol +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.10; - -import './Context.sol'; - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), 'Ownable: caller is not the owner'); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), 'Ownable: new owner is the zero address'); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/WrappedTokenGatewayV3.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/WrappedTokenGatewayV3.sol deleted file mode 100644 index 56725d5e..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/WrappedTokenGatewayV3.sol +++ /dev/null @@ -1,197 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.10; - -import {Ownable} from '../dependencies/openzeppelin/contracts/Ownable.sol'; -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '../dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {IWETH} from './interfaces/IWETH.sol'; -import {IPool} from '../interfaces/IPool.sol'; -import {IAToken} from '../interfaces/IAToken.sol'; -import {ReserveConfiguration} from '../protocol/libraries/configuration/ReserveConfiguration.sol'; -import {UserConfiguration} from '../protocol/libraries/configuration/UserConfiguration.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; -import {IWrappedTokenGatewayV3} from './interfaces/IWrappedTokenGatewayV3.sol'; - -/** - * @dev This contract is an upgrade of the WrappedTokenGatewayV3 contract, with immutable pool address. - * This contract keeps the same interface of the deprecated WrappedTokenGatewayV3 contract. - */ -contract WrappedTokenGatewayV3 is IWrappedTokenGatewayV3, Ownable { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; - using GPv2SafeERC20 for IERC20; - - IWETH internal immutable WETH; - IPool internal immutable POOL; - - /** - * @dev Sets the WETH address and the PoolAddressesProvider address. Infinite approves pool. - * @param weth Address of the Wrapped Ether contract - * @param owner Address of the owner of this contract - **/ - constructor(address weth, address owner, IPool pool) { - WETH = IWETH(weth); - POOL = pool; - transferOwnership(owner); - IWETH(weth).approve(address(pool), type(uint256).max); - } - - /** - * @dev deposits WETH into the reserve, using native ETH. A corresponding amount of the overlying asset (aTokens) - * is minted. - * @param onBehalfOf address of the user who will receive the aTokens representing the deposit - * @param referralCode integrators are assigned a referral code and can potentially receive rewards. - **/ - function depositETH(address, address onBehalfOf, uint16 referralCode) external payable override { - WETH.deposit{value: msg.value}(); - POOL.deposit(address(WETH), msg.value, onBehalfOf, referralCode); - } - - /** - * @dev withdraws the WETH _reserves of msg.sender. - * @param amount amount of aWETH to withdraw and receive native ETH - * @param to address of the user who will receive native ETH - */ - function withdrawETH(address, uint256 amount, address to) external override { - IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); - uint256 userBalance = aWETH.balanceOf(msg.sender); - uint256 amountToWithdraw = amount; - - // if amount is equal to uint(-1), the user wants to redeem everything - if (amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); - POOL.withdraw(address(WETH), amountToWithdraw, address(this)); - WETH.withdraw(amountToWithdraw); - _safeTransferETH(to, amountToWithdraw); - } - - /** - * @dev repays a borrow on the WETH reserve, for the specified amount (or for the whole amount, if uint256(-1) is specified). - * @param amount the amount to repay, or uint256(-1) if the user wants to repay everything - * @param onBehalfOf the address for which msg.sender is repaying - */ - function repayETH(address, uint256 amount, address onBehalfOf) external payable override { - uint256 paybackAmount = IERC20((POOL.getReserveData(address(WETH))).variableDebtTokenAddress) - .balanceOf(onBehalfOf); - - if (amount < paybackAmount) { - paybackAmount = amount; - } - require(msg.value >= paybackAmount, 'msg.value is less than repayment amount'); - WETH.deposit{value: paybackAmount}(); - POOL.repay( - address(WETH), - paybackAmount, - uint256(DataTypes.InterestRateMode.VARIABLE), - onBehalfOf - ); - - // refund remaining dust eth - if (msg.value > paybackAmount) _safeTransferETH(msg.sender, msg.value - paybackAmount); - } - - /** - * @dev borrow WETH, unwraps to ETH and send both the ETH and DebtTokens to msg.sender, via `approveDelegation` and onBehalf argument in `Pool.borrow`. - * @param amount the amount of ETH to borrow - * @param referralCode integrators are assigned a referral code and can potentially receive rewards - */ - function borrowETH(address, uint256 amount, uint16 referralCode) external override { - POOL.borrow( - address(WETH), - amount, - uint256(DataTypes.InterestRateMode.VARIABLE), - referralCode, - msg.sender - ); - WETH.withdraw(amount); - _safeTransferETH(msg.sender, amount); - } - - /** - * @dev withdraws the WETH _reserves of msg.sender. - * @param amount amount of aWETH to withdraw and receive native ETH - * @param to address of the user who will receive native ETH - * @param deadline validity deadline of permit and so depositWithPermit signature - * @param permitV V parameter of ERC712 permit sig - * @param permitR R parameter of ERC712 permit sig - * @param permitS S parameter of ERC712 permit sig - */ - function withdrawETHWithPermit( - address, - uint256 amount, - address to, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external override { - IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); - uint256 userBalance = aWETH.balanceOf(msg.sender); - uint256 amountToWithdraw = amount; - - // if amount is equal to type(uint256).max, the user wants to redeem everything - if (amount == type(uint256).max) { - amountToWithdraw = userBalance; - } - // permit `amount` rather than `amountToWithdraw` to make it easier for front-ends and integrators - aWETH.permit(msg.sender, address(this), amount, deadline, permitV, permitR, permitS); - aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); - POOL.withdraw(address(WETH), amountToWithdraw, address(this)); - WETH.withdraw(amountToWithdraw); - _safeTransferETH(to, amountToWithdraw); - } - - /** - * @dev transfer ETH to an address, revert if it fails. - * @param to recipient of the transfer - * @param value the amount to send - */ - function _safeTransferETH(address to, uint256 value) internal { - (bool success, ) = to.call{value: value}(new bytes(0)); - require(success, 'ETH_TRANSFER_FAILED'); - } - - /** - * @dev transfer ERC20 from the utility contract, for ERC20 recovery in case of stuck tokens due - * direct transfers to the contract address. - * @param token token to transfer - * @param to recipient of the transfer - * @param amount amount to send - */ - function emergencyTokenTransfer(address token, address to, uint256 amount) external onlyOwner { - IERC20(token).safeTransfer(to, amount); - } - - /** - * @dev transfer native Ether from the utility contract, for native Ether recovery in case of stuck Ether - * due to selfdestructs or ether transfers to the pre-computed contract address before deployment. - * @param to recipient of the transfer - * @param amount amount to send - */ - function emergencyEtherTransfer(address to, uint256 amount) external onlyOwner { - _safeTransferETH(to, amount); - } - - /** - * @dev Get WETH address used by WrappedTokenGatewayV3 - */ - function getWETHAddress() external view returns (address) { - return address(WETH); - } - - /** - * @dev Only WETH contract is allowed to transfer ETH here. Prevent other addresses to send Ether to this contract. - */ - receive() external payable { - require(msg.sender == address(WETH), 'Receive not allowed'); - } - - /** - * @dev Revert fallback calls - */ - fallback() external payable { - revert('Fallback not allowed'); - } -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWETH.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWETH.sol deleted file mode 100644 index 98281d0a..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWETH.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -interface IWETH { - function deposit() external payable; - - function withdraw(uint256) external; - - function approve(address guy, uint256 wad) external returns (bool); - - function transferFrom(address src, address dst, uint256 wad) external returns (bool); -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol deleted file mode 100644 index ae8f5980..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -interface IWrappedTokenGatewayV3 { - function depositETH(address pool, address onBehalfOf, uint16 referralCode) external payable; - - function withdrawETH(address pool, uint256 amount, address onBehalfOf) external; - - function repayETH(address pool, uint256 amount, address onBehalfOf) external payable; - - function borrowETH(address pool, uint256 amount, uint16 referralCode) external; - - function withdrawETHWithPermit( - address pool, - uint256 amount, - address to, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAToken.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAToken.sol deleted file mode 100644 index 9078c626..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAToken.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; -import {IInitializableAToken} from './IInitializableAToken.sol'; - -/** - * @title IAToken - * @author Aave - * @notice Defines the basic interface for an AToken. - */ -interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { - /** - * @dev Emitted during the transfer action - * @param from The user whose tokens are being transferred - * @param to The recipient - * @param value The scaled amount being transferred - * @param index The next liquidity index of the reserve - */ - event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); - - /** - * @notice Mints `amount` aTokens to `user` - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted aTokens - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - * @return `true` if the the previous balance of the user was 0 - */ - function mint( - address caller, - address onBehalfOf, - uint256 amount, - uint256 index - ) external returns (bool); - - /** - * @notice Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` - * @dev In some instances, the mint event could be emitted from a burn transaction - * if the amount to burn is less than the interest that the user accrued - * @param from The address from which the aTokens will be burned - * @param receiverOfUnderlying The address that will receive the underlying - * @param amount The amount being burned - * @param index The next liquidity index of the reserve - */ - function burn(address from, address receiverOfUnderlying, uint256 amount, uint256 index) external; - - /** - * @notice Mints aTokens to the reserve treasury - * @param amount The amount of tokens getting minted - * @param index The next liquidity index of the reserve - */ - function mintToTreasury(uint256 amount, uint256 index) external; - - /** - * @notice Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken - * @param from The address getting liquidated, current owner of the aTokens - * @param to The recipient - * @param value The amount of tokens getting transferred - */ - function transferOnLiquidation(address from, address to, uint256 value) external; - - /** - * @notice Transfers the underlying asset to `target`. - * @dev Used by the Pool to transfer assets in borrow(), withdraw() and flashLoan() - * @param target The recipient of the underlying - * @param amount The amount getting transferred - */ - function transferUnderlyingTo(address target, uint256 amount) external; - - /** - * @notice Handles the underlying received by the aToken after the transfer has been completed. - * @dev The default implementation is empty as with standard ERC20 tokens, nothing needs to be done after the - * transfer is concluded. However in the future there may be aTokens that allow for example to stake the underlying - * to receive LM rewards. In that case, `handleRepayment()` would perform the staking of the underlying asset. - * @param user The user executing the repayment - * @param onBehalfOf The address of the user who will get his debt reduced/removed - * @param amount The amount getting repaid - */ - function handleRepayment(address user, address onBehalfOf, uint256 amount) external; - - /** - * @notice Allow passing a signed message to approve spending - * @dev implements the permit function as for - * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md - * @param owner The owner of the funds - * @param spender The spender - * @param value The amount - * @param deadline The deadline timestamp, type(uint256).max for max deadline - * @param v Signature param - * @param s Signature param - * @param r Signature param - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @return The address of the underlying asset - */ - function UNDERLYING_ASSET_ADDRESS() external view returns (address); - - /** - * @notice Returns the address of the Aave treasury, receiving the fees on this aToken. - * @return Address of the Aave treasury - */ - function RESERVE_TREASURY_ADDRESS() external view returns (address); - - /** - * @notice Get the domain separator for the token - * @dev Return cached value if chainId matches cache, otherwise recomputes separator - * @return The domain separator of the token at current chain - */ - function DOMAIN_SEPARATOR() external view returns (bytes32); - - /** - * @notice Returns the nonce for owner. - * @param owner The address of the owner - * @return The nonce of the owner - */ - function nonces(address owner) external view returns (uint256); - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAaveIncentivesController.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAaveIncentivesController.sol deleted file mode 100644 index 7cc84212..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IAaveIncentivesController.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IAaveIncentivesController - * @author Aave - * @notice Defines the basic interface for an Aave Incentives Controller. - * @dev It only contains one single function, needed as a hook on aToken and debtToken transfers. - */ -interface IAaveIncentivesController { - /** - * @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution. - * @dev The units of `totalSupply` and `userBalance` should be the same. - * @param user The address of the user whose asset balance has changed - * @param totalSupply The total supply of the asset prior to user balance change - * @param userBalance The previous user balance prior to balance change - */ - function handleAction(address user, uint256 totalSupply, uint256 userBalance) external; -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IInitializableAToken.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IInitializableAToken.sol deleted file mode 100644 index fdc18588..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IInitializableAToken.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IAaveIncentivesController} from './IAaveIncentivesController.sol'; -import {IPool} from './IPool.sol'; - -/** - * @title IInitializableAToken - * @author Aave - * @notice Interface for the initialize function on AToken - */ -interface IInitializableAToken { - /** - * @dev Emitted when an aToken is initialized - * @param underlyingAsset The address of the underlying asset - * @param pool The address of the associated pool - * @param treasury The address of the treasury - * @param incentivesController The address of the incentives controller for this aToken - * @param aTokenDecimals The decimals of the underlying - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - event Initialized( - address indexed underlyingAsset, - address indexed pool, - address treasury, - address incentivesController, - uint8 aTokenDecimals, - string aTokenName, - string aTokenSymbol, - bytes params - ); - - /** - * @notice Initializes the aToken - * @param pool The pool contract that is initializing this contract - * @param treasury The address of the Aave treasury, receiving the fees on this aToken - * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) - * @param incentivesController The smart contract managing potential incentives distribution - * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's - * @param aTokenName The name of the aToken - * @param aTokenSymbol The symbol of the aToken - * @param params A set of encoded parameters for additional initialization - */ - function initialize( - IPool pool, - address treasury, - address underlyingAsset, - IAaveIncentivesController incentivesController, - uint8 aTokenDecimals, - string calldata aTokenName, - string calldata aTokenSymbol, - bytes calldata params - ) external; -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPool.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPool.sol deleted file mode 100644 index 4ed19d05..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPool.sol +++ /dev/null @@ -1,834 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; -import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; - -/** - * @title IPool - * @author Aave - * @notice Defines the basic interface for an Aave Pool. - */ -interface IPool { - /** - * @dev Emitted on mintUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens - * @param amount The amount of supplied assets - * @param referralCode The referral code used - */ - event MintUnbacked( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on backUnbacked() - * @param reserve The address of the underlying asset of the reserve - * @param backer The address paying for the backing - * @param amount The amount added as backing - * @param fee The amount paid in fees - */ - event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); - - /** - * @dev Emitted on supply() - * @param reserve The address of the underlying asset of the reserve - * @param user The address initiating the supply - * @param onBehalfOf The beneficiary of the supply, receiving the aTokens - * @param amount The amount supplied - * @param referralCode The referral code used - */ - event Supply( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on withdraw() - * @param reserve The address of the underlying asset being withdrawn - * @param user The address initiating the withdrawal, owner of aTokens - * @param to The address that will receive the underlying - * @param amount The amount to be withdrawn - */ - event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - - /** - * @dev Emitted on borrow() and flashLoan() when debt needs to be opened - * @param reserve The address of the underlying asset being borrowed - * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just - * initiator of the transaction on flashLoan() - * @param onBehalfOf The address that will be getting the debt - * @param amount The amount borrowed out - * @param interestRateMode The rate mode: 2 for Variable, 1 is deprecated (changed on v3.2.0) - * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray - * @param referralCode The referral code used - */ - event Borrow( - address indexed reserve, - address user, - address indexed onBehalfOf, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 borrowRate, - uint16 indexed referralCode - ); - - /** - * @dev Emitted on repay() - * @param reserve The address of the underlying asset of the reserve - * @param user The beneficiary of the repayment, getting his debt reduced - * @param repayer The address of the user initiating the repay(), providing the funds - * @param amount The amount repaid - * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly - */ - event Repay( - address indexed reserve, - address indexed user, - address indexed repayer, - uint256 amount, - bool useATokens - ); - - /** - * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets - * @param asset The address of the underlying asset of the reserve - * @param totalDebt The total isolation mode debt for the reserve - */ - event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - - /** - * @dev Emitted when the user selects a certain asset category for eMode - * @param user The address of the user - * @param categoryId The category id - */ - event UserEModeSet(address indexed user, uint8 categoryId); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on setUserUseReserveAsCollateral() - * @param reserve The address of the underlying asset of the reserve - * @param user The address of the user enabling the usage as collateral - */ - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - - /** - * @dev Emitted on flashLoan() - * @param target The address of the flash loan receiver contract - * @param initiator The address initiating the flash loan - * @param asset The address of the asset being flash borrowed - * @param amount The amount flash borrowed - * @param interestRateMode The flashloan mode: 0 for regular flashloan, - * 1 for Stable (Deprecated on v3.2.0), 2 for Variable - * @param premium The fee flash borrowed - * @param referralCode The referral code used - */ - event FlashLoan( - address indexed target, - address initiator, - address indexed asset, - uint256 amount, - DataTypes.InterestRateMode interestRateMode, - uint256 premium, - uint16 indexed referralCode - ); - - /** - * @dev Emitted when a borrower is liquidated. - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param liquidatedCollateralAmount The amount of collateral received by the liquidator - * @param liquidator The address of the liquidator - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - event LiquidationCall( - address indexed collateralAsset, - address indexed debtAsset, - address indexed user, - uint256 debtToCover, - uint256 liquidatedCollateralAmount, - address liquidator, - bool receiveAToken - ); - - /** - * @dev Emitted when the state of a reserve is updated. - * @param reserve The address of the underlying asset of the reserve - * @param liquidityRate The next liquidity rate - * @param stableBorrowRate The next stable borrow rate @note deprecated on v3.2.0 - * @param variableBorrowRate The next variable borrow rate - * @param liquidityIndex The next liquidity index - * @param variableBorrowIndex The next variable borrow index - */ - event ReserveDataUpdated( - address indexed reserve, - uint256 liquidityRate, - uint256 stableBorrowRate, - uint256 variableBorrowRate, - uint256 liquidityIndex, - uint256 variableBorrowIndex - ); - - /** - * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. - * @param reserve The address of the reserve - * @param amountMinted The amount minted to the treasury - */ - event MintedToTreasury(address indexed reserve, uint256 amountMinted); - - /** - * @notice Mints an `amount` of aTokens to the `onBehalfOf` - * @param asset The address of the underlying asset to mint - * @param amount The amount to mint - * @param onBehalfOf The address that will receive the aTokens - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function mintUnbacked( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @notice Back the current unbacked underlying with `amount` and pay `fee`. - * @param asset The address of the underlying asset to back - * @param amount The amount to back - * @param fee The amount paid in fees - * @return The backed amount - */ - function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Supply with transfer approval of asset to be supplied done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param deadline The deadline timestamp that the permit is valid - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - */ - function supplyWithPermit( - address asset, - uint256 amount, - address onBehalfOf, - uint16 referralCode, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); - - /** - * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower - * already supplied enough collateral, or he was given enough allowance by a credit delegator on the VariableDebtToken - * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet - * and 100 variable debt tokens - * @param asset The address of the underlying asset to borrow - * @param amount The amount to be borrowed - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - * @param onBehalfOf The address of the user who will receive the debt. Should be the address of the borrower itself - * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator - * if he has been given credit delegation allowance - */ - function borrow( - address asset, - uint256 amount, - uint256 interestRateMode, - uint16 referralCode, - address onBehalfOf - ) external; - - /** - * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned - * - E.g. User repays 100 USDC, burning 100 variable debt tokens of the `onBehalfOf` address - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf The address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @return The final amount repaid - */ - function repay( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf - ) external returns (uint256); - - /** - * @notice Repay with transfer approval of asset to be repaid done via permit function - * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0 - * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the - * user calling the function if he wants to reduce/remove his own debt, or the address of any other - * other borrower whose debt should be removed - * @param deadline The deadline timestamp that the permit is valid - * @param permitV The V parameter of ERC712 permit sig - * @param permitR The R parameter of ERC712 permit sig - * @param permitS The S parameter of ERC712 permit sig - * @return The final amount repaid - */ - function repayWithPermit( - address asset, - uint256 amount, - uint256 interestRateMode, - address onBehalfOf, - uint256 deadline, - uint8 permitV, - bytes32 permitR, - bytes32 permitS - ) external returns (uint256); - - /** - * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the - * equivalent debt tokens - * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable debt tokens - * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken - * balance is not enough to cover the whole debt - * @param asset The address of the borrowed underlying asset previously borrowed - * @param amount The amount to repay - * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` - * @param interestRateMode DEPRECATED in v3.2.0 - * @return The final amount repaid - */ - function repayWithATokens( - address asset, - uint256 amount, - uint256 interestRateMode - ) external returns (uint256); - - /** - * @notice Allows suppliers to enable/disable a specific supplied asset as collateral - * @param asset The address of the underlying asset supplied - * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise - */ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; - - /** - * @notice Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 - * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives - * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk - * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation - * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation - * @param user The address of the borrower getting liquidated - * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover - * @param receiveAToken True if the liquidators wants to receive the collateral aTokens, `false` if he wants - * to receive the underlying collateral asset directly - */ - function liquidationCall( - address collateralAsset, - address debtAsset, - address user, - uint256 debtToCover, - bool receiveAToken - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface - * @param assets The addresses of the assets being flash-borrowed - * @param amounts The amounts of the assets being flash-borrowed - * @param interestRateModes Types of the debt to open if the flash loan is not returned: - * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver - * 1 -> Deprecated on v3.2.0 - * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address - * @param onBehalfOf The address that will receive the debt in the case of using 2 on `modes` - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoan( - address receiverAddress, - address[] calldata assets, - uint256[] calldata amounts, - uint256[] calldata interestRateModes, - address onBehalfOf, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, - * as long as the amount taken plus a fee is returned. - * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept - * into consideration. For further details please visit https://docs.aave.com/developers/ - * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface - * @param asset The address of the asset being flash-borrowed - * @param amount The amount of the asset being flash-borrowed - * @param params Variadic packed params to pass to the receiver as extra information - * @param referralCode The code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function flashLoanSimple( - address receiverAddress, - address asset, - uint256 amount, - bytes calldata params, - uint16 referralCode - ) external; - - /** - * @notice Returns the user account data across all the reserves - * @param user The address of the user - * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed - * @return totalDebtBase The total debt of the user in the base currency used by the price feed - * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed - * @return currentLiquidationThreshold The liquidation threshold of the user - * @return ltv The loan to value of The user - * @return healthFactor The current health factor of the user - */ - function getUserAccountData( - address user - ) - external - view - returns ( - uint256 totalCollateralBase, - uint256 totalDebtBase, - uint256 availableBorrowsBase, - uint256 currentLiquidationThreshold, - uint256 ltv, - uint256 healthFactor - ); - - /** - * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an - * interest rate strategy - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param aTokenAddress The address of the aToken that will be assigned to the reserve - * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve - * @param interestRateStrategyAddress The address of the interest rate strategy contract - */ - function initReserve( - address asset, - address aTokenAddress, - address variableDebtAddress, - address interestRateStrategyAddress - ) external; - - /** - * @notice Drop a reserve - * @dev Only callable by the PoolConfigurator contract - * @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve. - * @param asset The address of the underlying asset of the reserve - */ - function dropReserve(address asset) external; - - /** - * @notice Updates the address of the interest rate strategy contract - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param rateStrategyAddress The address of the interest rate strategy contract - */ - function setReserveInterestRateStrategyAddress( - address asset, - address rateStrategyAddress - ) external; - - /** - * @notice Accumulates interest to all indexes of the reserve - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncIndexesState(address asset) external; - - /** - * @notice Updates interest rates on the reserve data - * @dev Only callable by the PoolConfigurator contract - * @dev To be used when required by the configurator, for example when updating interest rates strategy data - * @param asset The address of the underlying asset of the reserve - */ - function syncRatesState(address asset) external; - - /** - * @notice Sets the configuration bitmap of the reserve as a whole - * @dev Only callable by the PoolConfigurator contract - * @param asset The address of the underlying asset of the reserve - * @param configuration The new configuration bitmap - */ - function setConfiguration( - address asset, - DataTypes.ReserveConfigurationMap calldata configuration - ) external; - - /** - * @notice Returns the configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The configuration of the reserve - */ - function getConfiguration( - address asset - ) external view returns (DataTypes.ReserveConfigurationMap memory); - - /** - * @notice Returns the configuration of the user across all the reserves - * @param user The user address - * @return The configuration of the user - */ - function getUserConfiguration( - address user - ) external view returns (DataTypes.UserConfigurationMap memory); - - /** - * @notice Returns the normalized income of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve's normalized income - */ - function getReserveNormalizedIncome(address asset) external view returns (uint256); - - /** - * @notice Returns the normalized variable debt per unit of asset - * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a - * "dynamic" variable index based on time, current stored index and virtual rate at the current - * moment (approx. a borrower would get if opening a position). This means that is always used in - * combination with variable debt supply/balances. - * If using this function externally, consider that is possible to have an increasing normalized - * variable debt that is not equivalent to how the variable debt index would be updated in storage - * (e.g. only updates with non-zero variable debt supply) - * @param asset The address of the underlying asset of the reserve - * @return The reserve normalized variable debt - */ - function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (DataTypes.ReserveDataLegacy memory); - - /** - * @notice Returns the state and configuration of the reserve, including extra data included with Aave v3.1 - * @dev DEPRECATED use independent getters instead (getReserveData, getLiquidationGracePeriod) - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve with virtual accounting - */ - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory); - - /** - * @notice Returns the virtual underlying balance of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The reserve virtual underlying balance - */ - function getVirtualUnderlyingBalance(address asset) external view returns (uint128); - - /** - * @notice Validates and finalizes an aToken transfer - * @dev Only callable by the overlying aToken of the `asset` - * @param asset The address of the underlying asset of the aToken - * @param from The user from which the aTokens are transferred - * @param to The user receiving the aTokens - * @param amount The amount being transferred/withdrawn - * @param balanceFromBefore The aToken balance of the `from` user before the transfer - * @param balanceToBefore The aToken balance of the `to` user before the transfer - */ - function finalizeTransfer( - address asset, - address from, - address to, - uint256 amount, - uint256 balanceFromBefore, - uint256 balanceToBefore - ) external; - - /** - * @notice Returns the list of the underlying assets of all the initialized reserves - * @dev It does not include dropped reserves - * @return The addresses of the underlying assets of the initialized reserves - */ - function getReservesList() external view returns (address[] memory); - - /** - * @notice Returns the number of initialized reserves - * @dev It includes dropped reserves - * @return The count - */ - function getReservesCount() external view returns (uint256); - - /** - * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct - * @param id The id of the reserve as stored in the DataTypes.ReserveData struct - * @return The address of the reserve associated with id - */ - function getReserveAddressById(uint16 id) external view returns (address); - - /** - * @notice Returns the PoolAddressesProvider connected to this contract - * @return The address of the PoolAddressesProvider - */ - function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); - - /** - * @notice Updates the protocol fee on the bridging - * @param bridgeProtocolFee The part of the premium sent to the protocol treasury - */ - function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; - - /** - * @notice Updates flash loan premiums. Flash loan premium consists of two parts: - * - A part is sent to aToken holders as extra, one time accumulated interest - * - A part is collected by the protocol treasury - * @dev The total premium is calculated on the total borrowed amount - * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` - * @dev Only callable by the PoolConfigurator contract - * @param flashLoanPremiumTotal The total premium, expressed in bps - * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps - */ - function updateFlashloanPremiums( - uint128 flashLoanPremiumTotal, - uint128 flashLoanPremiumToProtocol - ) external; - - /** - * @notice Configures a new or alters an existing collateral configuration of an eMode. - * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. - * The category 0 is reserved as it's the default for volatile assets - * @param id The id of the category - * @param config The configuration of the category - */ - function configureEModeCategory( - uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory config - ) external; - - /** - * @notice Replaces the current eMode collateralBitmap. - * @param id The id of the category - * @param collateralBitmap The collateralBitmap of the category - */ - function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external; - - /** - * @notice Replaces the current eMode borrowableBitmap. - * @param id The id of the category - * @param borrowableBitmap The borrowableBitmap of the category - */ - function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external; - - /** - * @notice Returns the data of an eMode category - * @dev DEPRECATED use independent getters instead - * @param id The id of the category - * @return The configuration data of the category - */ - function getEModeCategoryData( - uint8 id - ) external view returns (DataTypes.EModeCategoryLegacy memory); - - /** - * @notice Returns the label of an eMode category - * @param id The id of the category - * @return The label of the category - */ - function getEModeCategoryLabel(uint8 id) external view returns (string memory); - - /** - * @notice Returns the collateral config of an eMode category - * @param id The id of the category - * @return The ltv,lt,lb of the category - */ - function getEModeCategoryCollateralConfig( - uint8 id - ) external view returns (DataTypes.CollateralConfig memory); - - /** - * @notice Returns the collateralBitmap of an eMode category - * @param id The id of the category - * @return The collateralBitmap of the category - */ - function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Returns the borrowableBitmap of an eMode category - * @param id The id of the category - * @return The borrowableBitmap of the category - */ - function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128); - - /** - * @notice Allows a user to use the protocol in eMode - * @param categoryId The id of the category - */ - function setUserEMode(uint8 categoryId) external; - - /** - * @notice Returns the eMode the user is using - * @param user The address of the user - * @return The eMode id - */ - function getUserEMode(address user) external view returns (uint256); - - /** - * @notice Resets the isolation mode total debt of the given asset to zero - * @dev It requires the given asset has zero debt ceiling - * @param asset The address of the underlying asset to reset the isolationModeTotalDebt - */ - function resetIsolationModeTotalDebt(address asset) external; - - /** - * @notice Sets the liquidation grace period of the given asset - * @dev To enable a liquidation grace period, a timestamp in the future should be set, - * To disable a liquidation grace period, any timestamp in the past works, like 0 - * @param asset The address of the underlying asset to set the liquidationGracePeriod - * @param until Timestamp when the liquidation grace period will end - **/ - function setLiquidationGracePeriod(address asset, uint40 until) external; - - /** - * @notice Returns the liquidation grace period of the given asset - * @param asset The address of the underlying asset - * @return Timestamp when the liquidation grace period will end - **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); - - /** - * @notice Returns the total fee on flash loans - * @return The total fee on flashloans - */ - function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); - - /** - * @notice Returns the part of the bridge fees sent to protocol - * @return The bridge fee sent to the protocol treasury - */ - function BRIDGE_PROTOCOL_FEE() external view returns (uint256); - - /** - * @notice Returns the part of the flashloan fees sent to protocol - * @return The flashloan fee sent to the protocol treasury - */ - function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); - - /** - * @notice Returns the maximum number of reserves supported to be listed in this Pool - * @return The maximum number of reserves supported - */ - function MAX_NUMBER_RESERVES() external view returns (uint16); - - /** - * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens - * @param assets The list of reserves for which the minting needs to be executed - */ - function mintToTreasury(address[] calldata assets) external; - - /** - * @notice Rescue and transfer tokens locked in this contract - * @param token The address of the token - * @param to The address of the recipient - * @param amount The amount of token to transfer - */ - function rescueTokens(address token, address to, uint256 amount) external; - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @dev Deprecated: Use the `supply` function instead - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Gets the address of the external FlashLoanLogic - */ - function getFlashLoanLogic() external view returns (address); - - /** - * @notice Gets the address of the external BorrowLogic - */ - function getBorrowLogic() external view returns (address); - - /** - * @notice Gets the address of the external BridgeLogic - */ - function getBridgeLogic() external view returns (address); - - /** - * @notice Gets the address of the external EModeLogic - */ - function getEModeLogic() external view returns (address); - - /** - * @notice Gets the address of the external LiquidationLogic - */ - function getLiquidationLogic() external view returns (address); - - /** - * @notice Gets the address of the external PoolLogic - */ - function getPoolLogic() external view returns (address); - - /** - * @notice Gets the address of the external SupplyLogic - */ - function getSupplyLogic() external view returns (address); -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPoolAddressesProvider.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPoolAddressesProvider.sol deleted file mode 100644 index c2c2a83d..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IPoolAddressesProvider.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IPoolAddressesProvider - * @author Aave - * @notice Defines the basic interface for a Pool Addresses Provider. - */ -interface IPoolAddressesProvider { - /** - * @dev Emitted when the market identifier is updated. - * @param oldMarketId The old id of the market - * @param newMarketId The new id of the market - */ - event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); - - /** - * @dev Emitted when the pool is updated. - * @param oldAddress The old address of the Pool - * @param newAddress The new address of the Pool - */ - event PoolUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool configurator is updated. - * @param oldAddress The old address of the PoolConfigurator - * @param newAddress The new address of the PoolConfigurator - */ - event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle is updated. - * @param oldAddress The old address of the PriceOracle - * @param newAddress The new address of the PriceOracle - */ - event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL manager is updated. - * @param oldAddress The old address of the ACLManager - * @param newAddress The new address of the ACLManager - */ - event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the ACL admin is updated. - * @param oldAddress The old address of the ACLAdmin - * @param newAddress The new address of the ACLAdmin - */ - event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the price oracle sentinel is updated. - * @param oldAddress The old address of the PriceOracleSentinel - * @param newAddress The new address of the PriceOracleSentinel - */ - event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the pool data provider is updated. - * @param oldAddress The old address of the PoolDataProvider - * @param newAddress The new address of the PoolDataProvider - */ - event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when a new proxy is created. - * @param id The identifier of the proxy - * @param proxyAddress The address of the created proxy contract - * @param implementationAddress The address of the implementation contract - */ - event ProxyCreated( - bytes32 indexed id, - address indexed proxyAddress, - address indexed implementationAddress - ); - - /** - * @dev Emitted when a new non-proxied contract address is registered. - * @param id The identifier of the contract - * @param oldAddress The address of the old contract - * @param newAddress The address of the new contract - */ - event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); - - /** - * @dev Emitted when the implementation of the proxy registered with id is updated - * @param id The identifier of the contract - * @param proxyAddress The address of the proxy contract - * @param oldImplementationAddress The address of the old implementation contract - * @param newImplementationAddress The address of the new implementation contract - */ - event AddressSetAsProxy( - bytes32 indexed id, - address indexed proxyAddress, - address oldImplementationAddress, - address indexed newImplementationAddress - ); - - /** - * @notice Returns the id of the Aave market to which this contract points to. - * @return The market id - */ - function getMarketId() external view returns (string memory); - - /** - * @notice Associates an id with a specific PoolAddressesProvider. - * @dev This can be used to create an onchain registry of PoolAddressesProviders to - * identify and validate multiple Aave markets. - * @param newMarketId The market id - */ - function setMarketId(string calldata newMarketId) external; - - /** - * @notice Returns an address by its identifier. - * @dev The returned address might be an EOA or a contract, potentially proxied - * @dev It returns ZERO if there is no registered address with the given id - * @param id The id - * @return The address of the registered for the specified id - */ - function getAddress(bytes32 id) external view returns (address); - - /** - * @notice General function to update the implementation of a proxy registered with - * certain `id`. If there is no proxy registered, it will instantiate one and - * set as implementation the `newImplementationAddress`. - * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit - * setter function, in order to avoid unexpected consequences - * @param id The id - * @param newImplementationAddress The address of the new implementation - */ - function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; - - /** - * @notice Sets an address for an id replacing the address saved in the addresses map. - * @dev IMPORTANT Use this function carefully, as it will do a hard replacement - * @param id The id - * @param newAddress The address to set - */ - function setAddress(bytes32 id, address newAddress) external; - - /** - * @notice Returns the address of the Pool proxy. - * @return The Pool proxy address - */ - function getPool() external view returns (address); - - /** - * @notice Updates the implementation of the Pool, or creates a proxy - * setting the new `pool` implementation when the function is called for the first time. - * @param newPoolImpl The new Pool implementation - */ - function setPoolImpl(address newPoolImpl) external; - - /** - * @notice Returns the address of the PoolConfigurator proxy. - * @return The PoolConfigurator proxy address - */ - function getPoolConfigurator() external view returns (address); - - /** - * @notice Updates the implementation of the PoolConfigurator, or creates a proxy - * setting the new `PoolConfigurator` implementation when the function is called for the first time. - * @param newPoolConfiguratorImpl The new PoolConfigurator implementation - */ - function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; - - /** - * @notice Returns the address of the price oracle. - * @return The address of the PriceOracle - */ - function getPriceOracle() external view returns (address); - - /** - * @notice Updates the address of the price oracle. - * @param newPriceOracle The address of the new PriceOracle - */ - function setPriceOracle(address newPriceOracle) external; - - /** - * @notice Returns the address of the ACL manager. - * @return The address of the ACLManager - */ - function getACLManager() external view returns (address); - - /** - * @notice Updates the address of the ACL manager. - * @param newAclManager The address of the new ACLManager - */ - function setACLManager(address newAclManager) external; - - /** - * @notice Returns the address of the ACL admin. - * @return The address of the ACL admin - */ - function getACLAdmin() external view returns (address); - - /** - * @notice Updates the address of the ACL admin. - * @param newAclAdmin The address of the new ACL admin - */ - function setACLAdmin(address newAclAdmin) external; - - /** - * @notice Returns the address of the price oracle sentinel. - * @return The address of the PriceOracleSentinel - */ - function getPriceOracleSentinel() external view returns (address); - - /** - * @notice Updates the address of the price oracle sentinel. - * @param newPriceOracleSentinel The address of the new PriceOracleSentinel - */ - function setPriceOracleSentinel(address newPriceOracleSentinel) external; - - /** - * @notice Returns the address of the data provider. - * @return The address of the DataProvider - */ - function getPoolDataProvider() external view returns (address); - - /** - * @notice Updates the address of the data provider. - * @param newDataProvider The address of the new DataProvider - */ - function setPoolDataProvider(address newDataProvider) external; -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IScaledBalanceToken.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IScaledBalanceToken.sol deleted file mode 100644 index 006fbb41..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/interfaces/IScaledBalanceToken.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title IScaledBalanceToken - * @author Aave - * @notice Defines the basic interface for a scaled-balance token. - */ -interface IScaledBalanceToken { - /** - * @dev Emitted after the mint action - * @param caller The address performing the mint - * @param onBehalfOf The address of the user that will receive the minted tokens - * @param value The scaled-up amount being minted (based on user entered amount and balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'onBehalfOf' - * @param index The next liquidity index of the reserve - */ - event Mint( - address indexed caller, - address indexed onBehalfOf, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @dev Emitted after the burn action - * @dev If the burn function does not involve a transfer of the underlying asset, the target defaults to zero address - * @param from The address from which the tokens will be burned - * @param target The address that will receive the underlying, if any - * @param value The scaled-up amount being burned (user entered amount - balance increase from interest) - * @param balanceIncrease The increase in scaled-up balance since the last action of 'from' - * @param index The next liquidity index of the reserve - */ - event Burn( - address indexed from, - address indexed target, - uint256 value, - uint256 balanceIncrease, - uint256 index - ); - - /** - * @notice Returns the scaled balance of the user. - * @dev The scaled balance is the sum of all the updated stored balance divided by the reserve's liquidity index - * at the moment of the update - * @param user The user whose balance is calculated - * @return The scaled balance of the user - */ - function scaledBalanceOf(address user) external view returns (uint256); - - /** - * @notice Returns the scaled balance of the user and the scaled total supply. - * @param user The address of the user - * @return The scaled balance of the user - * @return The scaled total supply - */ - function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); - - /** - * @notice Returns the scaled total supply of the scaled balance token. Represents sum(debt/index) - * @return The scaled total supply - */ - function scaledTotalSupply() external view returns (uint256); - - /** - * @notice Returns last index interest was accrued to the user's balance - * @param user The address of the user - * @return The last index interest was accrued to the user's balance, expressed in ray - */ - function getPreviousIndex(address user) external view returns (uint256); -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol deleted file mode 100644 index 2008acb6..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ /dev/null @@ -1,584 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; - -/** - * @title ReserveConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the reserve configuration - */ -library ReserveConfiguration { - uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore - uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_BONUS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF; // prettier-ignore - uint256 internal constant DECIMALS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF; // prettier-ignore - uint256 internal constant ACTIVE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FROZEN_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 1 bit at position 59 from pre 3.2 stableBorrowRateEnabled - uint256 internal constant PAUSED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SILOED_BORROWING_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant FLASHLOAN_ENABLED_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant RESERVE_FACTOR_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0xFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - // @notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_MASK = 0xFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant DEBT_CEILING_MASK = 0xF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0xEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // prettier-ignore - - /// @dev For the LTV, the start bit is 0 (up to 15), hence no bitshifting is needed - uint256 internal constant LIQUIDATION_THRESHOLD_START_BIT_POSITION = 16; - uint256 internal constant LIQUIDATION_BONUS_START_BIT_POSITION = 32; - uint256 internal constant RESERVE_DECIMALS_START_BIT_POSITION = 48; - uint256 internal constant IS_ACTIVE_START_BIT_POSITION = 56; - uint256 internal constant IS_FROZEN_START_BIT_POSITION = 57; - uint256 internal constant BORROWING_ENABLED_START_BIT_POSITION = 58; - uint256 internal constant IS_PAUSED_START_BIT_POSITION = 60; - uint256 internal constant BORROWABLE_IN_ISOLATION_START_BIT_POSITION = 61; - uint256 internal constant SILOED_BORROWING_START_BIT_POSITION = 62; - uint256 internal constant FLASHLOAN_ENABLED_START_BIT_POSITION = 63; - uint256 internal constant RESERVE_FACTOR_START_BIT_POSITION = 64; - uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80; - uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116; - uint256 internal constant LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION = 152; - //@notice there is an unoccupied hole of 8 bits from 168 to 176 left from pre 3.2 eModeCategory - uint256 internal constant UNBACKED_MINT_CAP_START_BIT_POSITION = 176; - uint256 internal constant DEBT_CEILING_START_BIT_POSITION = 212; - uint256 internal constant VIRTUAL_ACC_START_BIT_POSITION = 252; - - uint256 internal constant MAX_VALID_LTV = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_THRESHOLD = 65535; - uint256 internal constant MAX_VALID_LIQUIDATION_BONUS = 65535; - uint256 internal constant MAX_VALID_DECIMALS = 255; - uint256 internal constant MAX_VALID_RESERVE_FACTOR = 65535; - uint256 internal constant MAX_VALID_BORROW_CAP = 68719476735; - uint256 internal constant MAX_VALID_SUPPLY_CAP = 68719476735; - uint256 internal constant MAX_VALID_LIQUIDATION_PROTOCOL_FEE = 65535; - uint256 internal constant MAX_VALID_UNBACKED_MINT_CAP = 68719476735; - uint256 internal constant MAX_VALID_DEBT_CEILING = 1099511627775; - - uint256 public constant DEBT_CEILING_DECIMALS = 2; - uint16 public constant MAX_RESERVES_COUNT = 128; - - /** - * @notice Sets the Loan to Value of the reserve - * @param self The reserve configuration - * @param ltv The new ltv - */ - function setLtv(DataTypes.ReserveConfigurationMap memory self, uint256 ltv) internal pure { - require(ltv <= MAX_VALID_LTV, Errors.INVALID_LTV); - - self.data = (self.data & LTV_MASK) | ltv; - } - - /** - * @notice Gets the Loan to Value of the reserve - * @param self The reserve configuration - * @return The loan to value - */ - function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; - } - - /** - * @notice Sets the liquidation threshold of the reserve - * @param self The reserve configuration - * @param threshold The new liquidation threshold - */ - function setLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self, - uint256 threshold - ) internal pure { - require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); - - self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | - (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation threshold of the reserve - * @param self The reserve configuration - * @return The liquidation threshold - */ - function getLiquidationThreshold( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation bonus of the reserve - * @param self The reserve configuration - * @param bonus The new liquidation bonus - */ - function setLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self, - uint256 bonus - ) internal pure { - require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); - - self.data = - (self.data & LIQUIDATION_BONUS_MASK) | - (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); - } - - /** - * @notice Gets the liquidation bonus of the reserve - * @param self The reserve configuration - * @return The liquidation bonus - */ - function getLiquidationBonus( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; - } - - /** - * @notice Sets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @param decimals The decimals - */ - function setDecimals( - DataTypes.ReserveConfigurationMap memory self, - uint256 decimals - ) internal pure { - require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); - } - - /** - * @notice Gets the decimals of the underlying asset of the reserve - * @param self The reserve configuration - * @return The decimals of the asset - */ - function getDecimals( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; - } - - /** - * @notice Sets the active state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { - self.data = - (self.data & ACTIVE_MASK) | - (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); - } - - /** - * @notice Gets the active state of the reserve - * @param self The reserve configuration - * @return The active state - */ - function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; - } - - /** - * @notice Sets the frozen state of the reserve - * @param self The reserve configuration - * @param frozen The frozen state - */ - function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { - self.data = - (self.data & FROZEN_MASK) | - (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); - } - - /** - * @notice Gets the frozen state of the reserve - * @param self The reserve configuration - * @return The frozen state - */ - function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; - } - - /** - * @notice Sets the paused state of the reserve - * @param self The reserve configuration - * @param paused The paused state - */ - function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { - self.data = - (self.data & PAUSED_MASK) | - (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); - } - - /** - * @notice Gets the paused state of the reserve - * @param self The reserve configuration - * @return The paused state - */ - function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; - } - - /** - * @notice Sets the borrowable in isolation flag for the reserve. - * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the borrowed - * amount will be accumulated in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @param borrowable True if the asset is borrowable - */ - function setBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self, - bool borrowable - ) internal pure { - self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | - (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowable in isolation flag for the reserve. - * @dev If the returned flag is true, the asset is borrowable against isolated collateral. Assets borrowed with - * isolated collateral is accounted for in the isolated collateral's total debt exposure. - * @dev Only assets of the same family (eg USD stablecoins) should be borrowable in isolation mode to keep - * consistency in the debt ceiling calculations. - * @param self The reserve configuration - * @return The borrowable in isolation flag - */ - function getBorrowableInIsolation( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; - } - - /** - * @notice Sets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @param siloed True if the asset is siloed - */ - function setSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self, - bool siloed - ) internal pure { - self.data = - (self.data & SILOED_BORROWING_MASK) | - (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); - } - - /** - * @notice Gets the siloed borrowing flag for the reserve. - * @dev When this flag is set to true, users borrowing this asset will not be allowed to borrow any other asset. - * @param self The reserve configuration - * @return The siloed borrowing flag - */ - function getSiloedBorrowing( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; - } - - /** - * @notice Enables or disables borrowing on the reserve - * @param self The reserve configuration - * @param enabled True if the borrowing needs to be enabled, false otherwise - */ - function setBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool enabled - ) internal pure { - self.data = - (self.data & BORROWING_MASK) | - (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the borrowing state of the reserve - * @param self The reserve configuration - * @return The borrowing state - */ - function getBorrowingEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; - } - - /** - * @notice Sets the reserve factor of the reserve - * @param self The reserve configuration - * @param reserveFactor The reserve factor - */ - function setReserveFactor( - DataTypes.ReserveConfigurationMap memory self, - uint256 reserveFactor - ) internal pure { - require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); - - self.data = - (self.data & RESERVE_FACTOR_MASK) | - (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); - } - - /** - * @notice Gets the reserve factor of the reserve - * @param self The reserve configuration - * @return The reserve factor - */ - function getReserveFactor( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; - } - - /** - * @notice Sets the borrow cap of the reserve - * @param self The reserve configuration - * @param borrowCap The borrow cap - */ - function setBorrowCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 borrowCap - ) internal pure { - require(borrowCap <= MAX_VALID_BORROW_CAP, Errors.INVALID_BORROW_CAP); - - self.data = (self.data & BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the borrow cap of the reserve - * @param self The reserve configuration - * @return The borrow cap - */ - function getBorrowCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the supply cap of the reserve - * @param self The reserve configuration - * @param supplyCap The supply cap - */ - function setSupplyCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 supplyCap - ) internal pure { - require(supplyCap <= MAX_VALID_SUPPLY_CAP, Errors.INVALID_SUPPLY_CAP); - - self.data = (self.data & SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); - } - - /** - * @notice Gets the supply cap of the reserve - * @param self The reserve configuration - * @return The supply cap - */ - function getSupplyCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the debt ceiling in isolation mode for the asset - * @param self The reserve configuration - * @param ceiling The maximum debt ceiling for the asset - */ - function setDebtCeiling( - DataTypes.ReserveConfigurationMap memory self, - uint256 ceiling - ) internal pure { - require(ceiling <= MAX_VALID_DEBT_CEILING, Errors.INVALID_DEBT_CEILING); - - self.data = (self.data & DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); - } - - /** - * @notice Gets the debt ceiling for the asset if the asset is in isolation mode - * @param self The reserve configuration - * @return The debt ceiling (0 = isolation mode disabled) - */ - function getDebtCeiling( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; - } - - /** - * @notice Sets the liquidation protocol fee of the reserve - * @param self The reserve configuration - * @param liquidationProtocolFee The liquidation protocol fee - */ - function setLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self, - uint256 liquidationProtocolFee - ) internal pure { - require( - liquidationProtocolFee <= MAX_VALID_LIQUIDATION_PROTOCOL_FEE, - Errors.INVALID_LIQUIDATION_PROTOCOL_FEE - ); - - self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | - (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); - } - - /** - * @dev Gets the liquidation protocol fee - * @param self The reserve configuration - * @return The liquidation protocol fee - */ - function getLiquidationProtocolFee( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; - } - - /** - * @notice Sets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @param unbackedMintCap The unbacked mint cap - */ - function setUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self, - uint256 unbackedMintCap - ) internal pure { - require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); - - self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | - (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); - } - - /** - * @dev Gets the unbacked mint cap of the reserve - * @param self The reserve configuration - * @return The unbacked mint cap - */ - function getUnbackedMintCap( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; - } - - /** - * @notice Sets the flashloanable flag for the reserve - * @param self The reserve configuration - * @param flashLoanEnabled True if the asset is flashloanable, false otherwise - */ - function setFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self, - bool flashLoanEnabled - ) internal pure { - self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | - (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); - } - - /** - * @notice Gets the flashloanable flag for the reserve - * @param self The reserve configuration - * @return The flashloanable flag - */ - function getFlashLoanEnabled( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; - } - - /** - * @notice Sets the virtual account active/not state of the reserve - * @param self The reserve configuration - * @param active The active state - */ - function setVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self, - bool active - ) internal pure { - self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | - (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); - } - - /** - * @notice Gets the virtual account active/not state of the reserve - * @dev The state should be true for all normal assets and should be false - * only in special cases (ex. GHO) where an asset is minted instead of supplied. - * @param self The reserve configuration - * @return The active state - */ - function getIsVirtualAccActive( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; - } - - /** - * @notice Gets the configuration flags of the reserve - * @param self The reserve configuration - * @return The state flag representing active - * @return The state flag representing frozen - * @return The state flag representing borrowing enabled - * @return The state flag representing paused - */ - function getFlags( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (bool, bool, bool, bool) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 - ); - } - - /** - * @notice Gets the configuration parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing ltv - * @return The state param representing liquidation threshold - * @return The state param representing liquidation bonus - * @return The state param representing reserve decimals - * @return The state param representing reserve factor - */ - function getParams( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - dataLocal & ~LTV_MASK, - (dataLocal & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION, - (dataLocal & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION, - (dataLocal & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION, - (dataLocal & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION - ); - } - - /** - * @notice Gets the caps parameters of the reserve from storage - * @param self The reserve configuration - * @return The state param representing borrow cap - * @return The state param representing supply cap. - */ - function getCaps( - DataTypes.ReserveConfigurationMap memory self - ) internal pure returns (uint256, uint256) { - uint256 dataLocal = self.data; - - return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION - ); - } -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol deleted file mode 100644 index c66ca6d1..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/configuration/UserConfiguration.sol +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Errors} from '../helpers/Errors.sol'; -import {DataTypes} from '../types/DataTypes.sol'; -import {ReserveConfiguration} from './ReserveConfiguration.sol'; - -/** - * @title UserConfiguration library - * @author Aave - * @notice Implements the bitmap logic to handle the user configuration - */ -library UserConfiguration { - using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - - uint256 internal constant BORROWING_MASK = - 0x5555555555555555555555555555555555555555555555555555555555555555; - uint256 internal constant COLLATERAL_MASK = - 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; - - /** - * @notice Sets if the user is borrowing the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param borrowing True if the user is borrowing the reserve, false otherwise - */ - function setBorrowing( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool borrowing - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << (reserveIndex << 1); - if (borrowing) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Sets if the user is using as collateral the reserve identified by reserveIndex - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @param usingAsCollateral True if the user is using the reserve as collateral, false otherwise - */ - function setUsingAsCollateral( - DataTypes.UserConfigurationMap storage self, - uint256 reserveIndex, - bool usingAsCollateral - ) internal { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - uint256 bit = 1 << ((reserveIndex << 1) + 1); - if (usingAsCollateral) { - self.data |= bit; - } else { - self.data &= ~bit; - } - } - } - - /** - * @notice Returns if a user has been using the reserve for borrowing or as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing or as collateral, false otherwise - */ - function isUsingAsCollateralOrBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 3 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve for borrowing - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve for borrowing, false otherwise - */ - function isBorrowing( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> (reserveIndex << 1)) & 1 != 0; - } - } - - /** - * @notice Validate a user has been using the reserve as collateral - * @param self The configuration object - * @param reserveIndex The index of the reserve in the bitmap - * @return True if the user has been using a reserve as collateral, false otherwise - */ - function isUsingAsCollateral( - DataTypes.UserConfigurationMap memory self, - uint256 reserveIndex - ) internal pure returns (bool) { - unchecked { - require(reserveIndex < ReserveConfiguration.MAX_RESERVES_COUNT, Errors.INVALID_RESERVE_INDEX); - return (self.data >> ((reserveIndex << 1) + 1)) & 1 != 0; - } - } - - /** - * @notice Checks if a user has been supplying only one reserve as collateral - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isUsingAsCollateralOne( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - uint256 collateralData = self.data & COLLATERAL_MASK; - return collateralData != 0 && (collateralData & (collateralData - 1) == 0); - } - - /** - * @notice Checks if a user has been supplying any reserve as collateral - * @param self The configuration object - * @return True if the user has been supplying as collateral any reserve, false otherwise - */ - function isUsingAsCollateralAny( - DataTypes.UserConfigurationMap memory self - ) internal pure returns (bool) { - return self.data & COLLATERAL_MASK != 0; - } - - /** - * @notice Checks if a user has been borrowing only one asset - * @dev this uses a simple trick - if a number is a power of two (only one bit set) then n & (n - 1) == 0 - * @param self The configuration object - * @return True if the user has been supplying as collateral one reserve, false otherwise - */ - function isBorrowingOne(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - uint256 borrowingData = self.data & BORROWING_MASK; - return borrowingData != 0 && (borrowingData & (borrowingData - 1) == 0); - } - - /** - * @notice Checks if a user has been borrowing from any reserve - * @param self The configuration object - * @return True if the user has been borrowing any reserve, false otherwise - */ - function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data & BORROWING_MASK != 0; - } - - /** - * @notice Checks if a user has not been using any reserve for borrowing or supply - * @param self The configuration object - * @return True if the user has not been borrowing or supplying any reserve, false otherwise - */ - function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) { - return self.data == 0; - } - - /** - * @notice Returns the Isolation Mode state of the user - * @param self The configuration object - * @param reservesData The state of all the reserves - * @param reservesList The addresses of all the active reserves - * @return True if the user is in isolation mode, false otherwise - * @return The address of the only asset used as collateral - * @return The debt ceiling of the reserve - */ - function getIsolationModeState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address, uint256) { - if (isUsingAsCollateralOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, COLLATERAL_MASK); - - address assetAddress = reservesList[assetId]; - uint256 ceiling = reservesData[assetAddress].configuration.getDebtCeiling(); - if (ceiling != 0) { - return (true, assetAddress, ceiling); - } - } - return (false, address(0), 0); - } - - /** - * @notice Returns the siloed borrowing state for the user - * @param self The configuration object - * @param reservesData The data of all the reserves - * @param reservesList The reserve list - * @return True if the user has borrowed a siloed asset, false otherwise - * @return The address of the only borrowed asset - */ - function getSiloedBorrowingState( - DataTypes.UserConfigurationMap memory self, - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList - ) internal view returns (bool, address) { - if (isBorrowingOne(self)) { - uint256 assetId = _getFirstAssetIdByMask(self, BORROWING_MASK); - address assetAddress = reservesList[assetId]; - if (reservesData[assetAddress].configuration.getSiloedBorrowing()) { - return (true, assetAddress); - } - } - - return (false, address(0)); - } - - /** - * @notice Returns the address of the first asset flagged in the bitmap given the corresponding bitmask - * @param self The configuration object - * @return The index of the first asset flagged in the bitmap once the corresponding mask is applied - */ - function _getFirstAssetIdByMask( - DataTypes.UserConfigurationMap memory self, - uint256 mask - ) internal pure returns (uint256) { - unchecked { - uint256 bitmapData = self.data & mask; - uint256 firstAssetPosition = bitmapData & ~(bitmapData - 1); - uint256 id; - - while ((firstAssetPosition >>= 2) != 0) { - id += 1; - } - return id; - } - } -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/helpers/Errors.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/helpers/Errors.sol deleted file mode 100644 index d3f564cb..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/helpers/Errors.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Errors library - * @author Aave - * @notice Defines the error messages emitted by the different contracts of the Aave protocol - */ -library Errors { - string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' - string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' - string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' - string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' - string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' - string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' - string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' - string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' - string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' - string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' - string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' - string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' - string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' - string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' - string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' - string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' - string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' - string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' - string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' - string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' - string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' - string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' - string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' - string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' - string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' - string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' - string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' - string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' - string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' - string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' - string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' - string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' - string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' - string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' - string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' - string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' - string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' - string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' - string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' - string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' - string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' - string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' - string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' - string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' - string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' - string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' - string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' - string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' - string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' - string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' - string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' - string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' - string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' - string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' - string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' - string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' - string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' - string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' - string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' - string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' - string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' - string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' - string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' - string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' - string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' - string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' - string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' - string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve - string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' - string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' - string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' - string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' - string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' - string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' - string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' - string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' - string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' - string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' - string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' - string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' - string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' - string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' - string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 - string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled - string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid - string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed - string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed - string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 - string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' - string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' - string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range - string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state - string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode -} diff --git a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/types/DataTypes.sol b/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/types/DataTypes.sol deleted file mode 100644 index 13c12c99..00000000 --- a/downloads/LINEA/WETH_GATEWAY/WrappedTokenGatewayV3/src/contracts/protocol/libraries/types/DataTypes.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library DataTypes { - /** - * This exists specifically to maintain the `getReserveData()` interface, since the new, internal - * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. - */ - struct ReserveDataLegacy { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed - uint40 liquidationGracePeriodUntil; - //aToken address - address aTokenAddress; - // DEPRECATED on v3.2.0 - address __deprecatedStableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - //the amount of underlying accounted for by the protocol - uint128 virtualUnderlyingBalance; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: DEPRECATED: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167: liquidation protocol fee - //bit 168-175: DEPRECATED: eMode category - //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252: virtual accounting is enabled for the reserve - //bit 253-255 unused - - uint256 data; - } - - struct UserConfigurationMap { - /** - * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. - * The first bit indicates if an asset is used as collateral by the user, the second whether an - * asset is borrowed by the user. - */ - uint256 data; - } - - // DEPRECATED: kept for backwards compatibility, might be removed in a future version - struct EModeCategoryLegacy { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - // DEPRECATED - address priceSource; - string label; - } - - struct CollateralConfig { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - } - - struct EModeCategoryBaseConfiguration { - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - string label; - } - - struct EModeCategory { - // each eMode category has a custom ltv and liquidation threshold - uint16 ltv; - uint16 liquidationThreshold; - uint16 liquidationBonus; - uint128 collateralBitmap; - string label; - uint128 borrowableBitmap; - } - - enum InterestRateMode { - NONE, - __DEPRECATED, - VARIABLE - } - - struct ReserveCache { - uint256 currScaledVariableDebt; - uint256 nextScaledVariableDebt; - uint256 currLiquidityIndex; - uint256 nextLiquidityIndex; - uint256 currVariableBorrowIndex; - uint256 nextVariableBorrowIndex; - uint256 currLiquidityRate; - uint256 currVariableBorrowRate; - uint256 reserveFactor; - ReserveConfigurationMap reserveConfiguration; - address aTokenAddress; - address variableDebtTokenAddress; - uint40 reserveLastUpdateTimestamp; - } - - struct ExecuteLiquidationCallParams { - uint256 reservesCount; - uint256 debtToCover; - address collateralAsset; - address debtAsset; - address user; - bool receiveAToken; - address priceOracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteSupplyParams { - address asset; - uint256 amount; - address onBehalfOf; - uint16 referralCode; - } - - struct ExecuteBorrowParams { - address asset; - address user; - address onBehalfOf; - uint256 amount; - InterestRateMode interestRateMode; - uint16 referralCode; - bool releaseUnderlying; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - } - - struct ExecuteRepayParams { - address asset; - uint256 amount; - InterestRateMode interestRateMode; - address onBehalfOf; - bool useATokens; - } - - struct ExecuteWithdrawParams { - address asset; - uint256 amount; - address to; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - } - - struct ExecuteSetUserEModeParams { - uint256 reservesCount; - address oracle; - uint8 categoryId; - } - - struct FinalizeTransferParams { - address asset; - address from; - address to; - uint256 amount; - uint256 balanceFromBefore; - uint256 balanceToBefore; - uint256 reservesCount; - address oracle; - uint8 fromEModeCategory; - } - - struct FlashloanParams { - address receiverAddress; - address[] assets; - uint256[] amounts; - uint256[] interestRateModes; - address onBehalfOf; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - uint256 reservesCount; - address addressesProvider; - address pool; - uint8 userEModeCategory; - bool isAuthorizedFlashBorrower; - } - - struct FlashloanSimpleParams { - address receiverAddress; - address asset; - uint256 amount; - bytes params; - uint16 referralCode; - uint256 flashLoanPremiumToProtocol; - uint256 flashLoanPremiumTotal; - } - - struct FlashLoanRepaymentParams { - uint256 amount; - uint256 totalPremium; - uint256 flashLoanPremiumToProtocol; - address asset; - address receiverAddress; - uint16 referralCode; - } - - struct CalculateUserAccountDataParams { - UserConfigurationMap userConfig; - uint256 reservesCount; - address user; - address oracle; - uint8 userEModeCategory; - } - - struct ValidateBorrowParams { - ReserveCache reserveCache; - UserConfigurationMap userConfig; - address asset; - address userAddress; - uint256 amount; - InterestRateMode interestRateMode; - uint256 reservesCount; - address oracle; - uint8 userEModeCategory; - address priceOracleSentinel; - bool isolationModeActive; - address isolationModeCollateralAddress; - uint256 isolationModeDebtCeiling; - } - - struct ValidateLiquidationCallParams { - ReserveCache debtReserveCache; - uint256 totalDebt; - uint256 healthFactor; - address priceOracleSentinel; - } - - struct CalculateInterestRatesParams { - uint256 unbacked; - uint256 liquidityAdded; - uint256 liquidityTaken; - uint256 totalDebt; - uint256 reserveFactor; - address reserve; - bool usingVirtualBalance; - uint256 virtualUnderlyingBalance; - } - - struct InitReserveParams { - address asset; - address aTokenAddress; - address variableDebtAddress; - address interestRateStrategyAddress; - uint16 reservesCount; - uint16 maxNumberReserves; - } -} From 0280d700d21e16ccb90a009a702334bb1fe42e68 Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Fri, 17 Jan 2025 16:47:29 +0530 Subject: [PATCH 4/4] chore: remove extra changes --- package-lock.json | 585 +--------------------------------------------- package.json | 11 +- 2 files changed, 8 insertions(+), 588 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6d78d1dd..55d45dea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,17 +9,10 @@ "version": "1.0.0", "license": "BUSL1.1", "dependencies": { - "@bgd-labs/aave-address-book": "4.7.1-55059af528eaf322fca91f3b0c59ce8c94019549.0", "@bgd-labs/aave-cli": "^1.1.12", - "catapulta-verify": "^1.1.1", - "ts-command-line-args": "^2.5.0", - "ts-node": "^10.9.1" + "catapulta-verify": "^1.2.1" }, "devDependencies": { - "@types/bluebird": "^3.5.38", - "@types/node-fetch": "^2.6.3", - "bluebird": "^3.7.2", - "ethers": "^6.6.2", "prettier": "^2.8.3", "prettier-plugin-solidity": "^1.1.1" } @@ -34,9 +27,9 @@ "license": "Apache-2.0" }, "node_modules/@bgd-labs/aave-address-book": { - "version": "4.7.1-55059af528eaf322fca91f3b0c59ce8c94019549.0", - "resolved": "https://registry.npmjs.org/@bgd-labs/aave-address-book/-/aave-address-book-4.7.1-55059af528eaf322fca91f3b0c59ce8c94019549.0.tgz", - "integrity": "sha512-FCQVKBtlPD8HtGBkylmgpUgQS/vBXa08NUKZ3zMRk4IHD+3kh2XyGV0Ct7B4Kf+wwMPyNj3mxdKqIFHajnCUwQ==" + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@bgd-labs/aave-address-book/-/aave-address-book-4.5.1.tgz", + "integrity": "sha512-ttmk5qPrrZfEYY4vZ+UO/V7lYU5934ONN9kJmU44lCpB+fhVagmDLrBgLq44etQeaHZXHKggOHRA8mts4eN4Ug==" }, "node_modules/@bgd-labs/aave-cli": { "version": "1.1.12", @@ -65,12 +58,7 @@ "aave-cli": "dist/cli.js" } }, - "node_modules/@bgd-labs/aave-cli/node_modules/@bgd-labs/aave-address-book": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/@bgd-labs/aave-address-book/-/aave-address-book-4.7.1.tgz", - "integrity": "sha512-MGJb+QfQPK5YtNXlc82D+0g1BPfYCKfUQ8UGw7EJgVgHV3atCsp1V94q06fW6n4t59D9rcCHcvlUGrKhMx/aDw==" - }, - "node_modules/@bgd-labs/aave-cli/node_modules/@bgd-labs/aave-v3-governance-cache": { + "node_modules/@bgd-labs/aave-v3-governance-cache": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@bgd-labs/aave-v3-governance-cache/-/aave-v3-governance-cache-1.0.8.tgz", "integrity": "sha512-niaJafgxLQcuzZ13Wo1rO5tJ8f5pE5AdWs+5/PoHMrk5Z+bm5kE59oHbIO2xpg1pCQ7IZmsxXEIIlC2c0+v/Jg==", @@ -125,17 +113,6 @@ "commander": "~12.1.0" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.23.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", @@ -730,28 +707,6 @@ "npm": ">=7.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", @@ -892,32 +847,6 @@ "node": ">=8" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" - }, - "node_modules/@types/bluebird": { - "version": "3.5.42", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.42.tgz", - "integrity": "sha512-Jhy+MWRlro6UjVi578V/4ZGNfeCOcNCp0YaFNIUGFKlImowqwb1O/22wDVk3FDGMLqxdpOV3qQHD5fPEH4hK6A==", - "dev": true - }, "node_modules/@types/dns-packet": { "version": "5.6.5", "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", @@ -934,16 +863,6 @@ "undici-types": "~6.19.8" } }, - "node_modules/@types/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, "node_modules/abitype": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.6.tgz", @@ -964,34 +883,6 @@ } } }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", - "dev": true - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1028,11 +919,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" - }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1041,20 +927,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, "node_modules/base-x": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", @@ -1109,12 +981,6 @@ "multiformats": "^13.2.3" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, "node_modules/bs58": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", @@ -1200,118 +1066,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "dependencies": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/command-line-usage/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/command-line-usage/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/command-line-usage/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/command-line-usage/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "engines": { - "node": ">=8" - } - }, "node_modules/commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", @@ -1320,11 +1074,6 @@ "node": ">=18" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" - }, "node_modules/debug": { "version": "4.3.4", "license": "MIT", @@ -1340,14 +1089,6 @@ } } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deepmerge": { "version": "4.3.1", "license": "MIT", @@ -1355,23 +1096,6 @@ "node": ">=0.10.0" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -1436,14 +1160,6 @@ "@esbuild/win32-x64": "0.23.1" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -1456,94 +1172,6 @@ "node": ">=4" } }, - "node_modules/ethers": { - "version": "6.13.4", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.4.tgz", - "integrity": "sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "22.7.5", - "aes-js": "4.0.0-beta.5", - "tslib": "2.7.0", - "ws": "8.17.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/ethers/node_modules/@adraffy/ens-normalize": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", - "dev": true - }, - "node_modules/ethers/node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", - "dev": true, - "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ethers/node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "dev": true, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ethers/node_modules/@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/ethers/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", @@ -1577,31 +1205,6 @@ "version": "1.1.0", "license": "GPL-3.0-or-later" }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1859,11 +1462,6 @@ "node": ">=0.10.0" } }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, "node_modules/lru-cache": { "version": "6.0.0", "dev": true, @@ -1875,32 +1473,6 @@ "node": ">=10" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/minimist": { "version": "1.2.8", "license": "MIT", @@ -2092,14 +1664,6 @@ "node": ">= 6" } }, - "node_modules/reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "engines": { - "node": ">=6" - } - }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -2189,11 +1753,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/string-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -2237,36 +1796,6 @@ "node": ">=8" } }, - "node_modules/table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "dependencies": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/table-layout/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/table-layout/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "engines": { - "node": ">=8" - } - }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -2282,68 +1811,6 @@ "version": "0.0.3", "license": "MIT" }, - "node_modules/ts-command-line-args": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", - "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", - "dependencies": { - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.0", - "string-format": "^2.0.0" - }, - "bin": { - "write-markdown": "dist/write-markdown.js" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - }, "node_modules/tsx": { "version": "4.19.2", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", @@ -2376,6 +1843,7 @@ "node_modules/typescript": { "version": "5.4.4", "license": "Apache-2.0", + "optional": true, "peer": true, "bin": { "tsc": "bin/tsc", @@ -2385,14 +1853,6 @@ "node": ">=14.17" } }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "engines": { - "node": ">=8" - } - }, "node_modules/uint8-varint": { "version": "2.0.4", "license": "Apache-2.0 OR MIT", @@ -2424,11 +1884,6 @@ "version": "1.0.2", "license": "MIT" }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" - }, "node_modules/viem": { "version": "2.21.48", "resolved": "https://registry.npmjs.org/viem/-/viem-2.21.48.tgz", @@ -2514,26 +1969,6 @@ "webidl-conversions": "^3.0.0" } }, - "node_modules/wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dependencies": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/wordwrapjs/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "engines": { - "node": ">=8" - } - }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -2572,14 +2007,6 @@ "dev": true, "license": "ISC" }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "engines": { - "node": ">=6" - } - }, "node_modules/yoctocolors-cjs": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", diff --git a/package.json b/package.json index e84f0a8d..0252e056 100644 --- a/package.json +++ b/package.json @@ -19,17 +19,10 @@ "type": "module", "devDependencies": { "prettier": "^2.8.3", - "prettier-plugin-solidity": "^1.1.1", - "@types/bluebird": "^3.5.38", - "@types/node-fetch": "^2.6.3", - "bluebird": "^3.7.2", - "ethers": "^6.6.2" + "prettier-plugin-solidity": "^1.1.1" }, "dependencies": { - "@bgd-labs/aave-address-book": "4.7.1-55059af528eaf322fca91f3b0c59ce8c94019549.0", "@bgd-labs/aave-cli": "^1.1.12", - "catapulta-verify": "^1.1.1", - "ts-command-line-args": "^2.5.0", - "ts-node": "^10.9.1" + "catapulta-verify": "^1.2.1" } }